Как правильно извлечь USB-накопитель из командной строки CMD.exe? [Дубликат]

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

0
задан aphoria 1 December 2014 в 16:31
поделиться

1 ответ

Я собирался прокомментировать то же самое, что и mojo, сделанное выше примерно в одно и то же время. Однако после тестирования кажется, что сценарий diskpart для демонтажа моих собственных съемных дисков не позволяет им автоматически повторно приобретать букву диска в следующий раз, когда они подключены. Мне пришлось перейти в Управление дисками и переназначить диск письмо при повторном подключении. Я уверен, что это не то, что вы хотите. Сценарий демонтажа с помощью Win32_Volume , как этот парень, имел тот же неудачный побочный эффект.

Игра с hotplug.dll , как этот парень, был не очень помогите либо с Windows сообщать, что тип диска не был съемным диском.

Нет, самый надежный метод с наименьшим побочным эффектом, который не требует сторонних утилит, заключается в вызове «Извлечь» глагол из контекста «Мой компьютер». Вот решение, связанное с гибридным скриптом batch / JScript:

@if (@a==@b) @end   /* JScript ignores this multiline comment

:: dismount.bat
:: safely dismounts all removable drives

@echo off
setlocal

cscript /nologo /e:JScript "%~f0"

goto :EOF

:: end batch portion / begin JScript portion */

// DriveType=1 means removable drive for a WScript FSO object.
// See http://msdn.microsoft.com/en-us/library/ys4ctaz0%28v=vs.84%29.aspx

// NameSpace(17) = ssfDRIVES, or My Computer.
// See http://msdn.microsoft.com/en-us/library/windows/desktop/bb774096%28v=vs.85%29.aspx

var oSH = new ActiveXObject('Shell.Application'),
FSO = new ActiveXObject('Scripting.FileSystemObject'),
removableDriveType = 1,
ssfDRIVES = 17,
drives = new Enumerator(FSO.Drives);

while (!drives.atEnd()) {
    var x = drives.item();
    if (x.DriveType == removableDriveType) {
        oSH.NameSpace(ssfDRIVES).ParseName(x.DriveLetter + ':').InvokeVerb('Eject');
        while (x.IsReady)
            WSH.Sleep(50);
    }
    drives.moveNext();
}

Также вы можете вызвать глагол «Извлечь» из того же пространства имен, используя PowerShell аналогичным образом , но вам все равно понадобится Start-Sleep, чтобы предотвратить выход ps-потока до того, как диск был извлечен. Я оставляю это как упражнение для OP, если он предпочитает PowerShell поверх WScript.


Изменить: если вы хотите определить конкретный диск для демонтажа в своем пакетном скрипте, сделайте это следующим образом:

@if (@a==@b) @end   /*

@echo off
setlocal

set "drive=F:"

cscript /nologo /e:JScript "%~f0" "%drive%"

goto :EOF

::  */

var oSH = new ActiveXObject('Shell.Application'),
    FSO = new ActiveXObject('Scripting.FileSystemObject'),
    drive = WSH.Arguments(0);

oSH.NameSpace(17).ParseName(drive).InvokeVerb('Eject');
while (FSO.GetDrive(drive).IsReady) WSH.Sleep(50);
2
ответ дан Community 19 August 2018 в 14:33
поделиться
  • 1
    Есть ли способ сделать это в VBScript или является java единственным способом? я предпочитаю просто способ выбросить, если это самый простой способ, я возьму его. – Jonathan Viju Mathai 1 December 2014 в 21:11
  • 2
    Это не Ява. Это даже не JavaScript, хотя это будет более тесная связь. Это JScript, близкий родственник VBScript. Да, это можно сделать с помощью VBScript . Я просто использовал JScript, потому что намного более грациозно запускать фрагмент JScript как пакетный гибрид, чем эхо-фрагменты VBscript в отдельный файл vbs. Нет, это не единственный путь. На самом деле это можно сделать с гораздо меньшим количеством строк кода JScript, если я просто произвольно WSH.Sleep(1000) или аналогичный, но это может вызвать проблемы, если есть открытый дескриптор, блокирующий действие Eject. – rojo 1 December 2014 в 21:30
  • 3
    каково окончание для JScript – Jonathan Viju Mathai 2 December 2014 в 01:23
  • 4
    Nevermind, что последний комментарий, как бы вы его выталкивать только диск F – Jonathan Viju Mathai 2 December 2014 в 01:28
  • 5
    Я не знаю, что я глуп или что-то в этом роде, но это не работает. вы можете дать мне базовый код или что-то, что поможет – Jonathan Viju Mathai 5 December 2014 в 03:02
Другие вопросы по тегам:

Похожие вопросы: