Отключите внешний USB-накопитель с помощью powershell

12

Я пытаюсь отключить внешний USB-накопитель с помощью powershell и не могу это сделать. Следующий скрипт - это то, что я использую:

#get the Win32Volume object representing the volume I wish to eject 

$drive = Get-WmiObject Win32_Volume -filter "DriveLetter = 'F:'"

#call dismount on that object there by ejecting drive

$drive.Dismount($Force , $Permanent)

Затем я проверяю свой компьютер, чтобы убедиться, что диск отключен, но это не так.

Булевы параметры $ force и $ constant были опробованы с разными перестановками, но безрезультатно. Код выхода, возвращаемый командой dismount, изменяется при переключении параметров.

(0,0) = exit code 0

(0,1) = exit code 2

(1,0) = exit code 0

(1,1) = exit code 2

Документация для кода выхода 2 указывает, что существуют существующие точки монтирования как причина, по которой он не может отключиться. Хотя я пытаюсь отключить единственную существующую точку монтирования, поэтому я не уверен, что этот код выхода пытается мне сказать.

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

# executed after the .Dismount() command

$drive.Put() 

Эта дополнительная команда не помогает.

У меня заканчиваются вещи, чтобы попробовать, поэтому любая помощь, которую кто-либо может мне дать, будет принята с благодарностью.

JB.
источник
Вы, вероятно, не хотите отключать USB-накопитель. Позже вам придется переназначить букву диска в управлении дисками.
js2010

Ответы:

11

Чистое решение, которое не оставляет полузапеченных открытых ссылок, как это делает пример из pk:

  $driveEject = New-Object -comObject Shell.Application
  $driveEject.Namespace(17).ParseName("E:").InvokeVerb("Eject")

Получено с http://sushihangover.blogspot.nl/2012/02/powershell-eject-local-or-remote.html

Коен Зомерс
источник
Мое ранее опубликованное решение было действительно правильным. Я немного неуверен в том, как я когда-либо предлагал это! Пожалуйста, используйте этот метод.
шт.
1
Обратите внимание, что это может быть выполнено в виде одной строки в диалоговом окне «Выполнить»:powershell (New-Object -comObject Shell.Application).Namespace(17).ParseName(\"E:\").InvokeVerb(\"Eject\")
Deebster
Этот однострочный работает, но без обратной косой черты.
js2010
К сожалению, это не работает здесь. Я также не получаю сообщение об ошибке или сообщение об ошибке. $?это Trueпосле вызова второй строки. Что я могу сделать?
Рене Ниффенеггер
1

Я не могу сделать большую работу, отвечая со стороны PowerShell, возможно, вы захотите посмотреть, как mountvolработает . Существуют разные степени демонтажа.

Маунтвол или Маунтвол /?

Отображает имя, глобальный уникальный идентификатор (GUID) и местоположение тома.

Mountvol [диск:] путь имя_тома

Создает новую точку монтирования тома. Укажите либо корневой каталог с буквой диска, либо существующий пустой каталог NTFS в качестве источника точки подключения и имя тома в качестве цели.

Маунтвол [диск:] путь / D

Удаляет существующую точку монтирования тома.

Маунтвол [диск:] путь / л

Перечисляет имя тома для данной точки монтирования тома.

Я попытался сделать что-то похожее на то, что вам требовалось в VBScript для переупорядочения устройств на старых рабочих столах, где монтирование дисков для устаревшего оборудования было слишком утомительным для удаления (читай флэш-диск), мешало сочетаниям клавиш в пользовательском графическом интерфейсе, где я мог только явно указать точки монтирования ( D :, E :, F :) с определенной целью. Это стало невероятно разочаровывающим, и вам нужно размонтировать и перемонтировать все, используя входы и выходы mountvol, чтобы убедиться, что все прошло хорошо и продолжить вносить изменения. Надеюсь, тебе повезло больше, чем мне.

songei2f
источник