Odłącz dysk zewnętrzny USB za pomocą programu PowerShell

12

Próbuję odmontować zewnętrzny dysk USB za pomocą programu PowerShell i nie mogę tego z powodzeniem wykonać. Używam następującego skryptu:

#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)

Następnie sprawdzam komputer, czy dysk jest odmontowany, ale tak nie jest.

Parametry boolowskie $ force i $ permanent zostały wypróbowane z różnymi kombinacjami bezskutecznie. Kod wyjścia zwrócony przez komendę odinstalowania zmienia się, gdy parametry są przełączane.

(0,0) = exit code 0

(0,1) = exit code 2

(1,0) = exit code 0

(1,1) = exit code 2

Dokumentacja dla kodu wyjścia 2 wskazuje, że istnieją istniejące punkty podłączenia jako powód, dla którego nie można go zdemontować. Chociaż próbuję zdemontować jedyny istniejący punkt montowania, więc nie jestem pewien, co ten kod wyjścia próbuje mi powiedzieć.

Po włokowaniu do sieci osób mających podobne problemy znalazłem tylko jedno dodatkowe polecenie do wypróbowania, a mianowicie:

# executed after the .Dismount() command

$drive.Put() 

To dodatkowe polecenie nie pomaga.

Zabrakło mi rzeczy do wypróbowania, więc każda pomoc, jaką ktoś może mi dać, byłaby bardzo mile widziana.

JB.
źródło
Prawdopodobnie nie chcesz demontować dysku USB. Później musisz ponownie przypisać literę dysku w zarządzaniu dyskami.
js2010

Odpowiedzi:

11

Czystym rozwiązaniem, które nie pozostawia żadnych w połowie wypieczonych otwartych odniesień, takich jak próbka z pk, jest:

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

Źródło: http://sushihangover.blogspot.nl/2012/02/powershell-eject-local-or-remote.html

Koen Zomers
źródło
Moje wcześniej opublikowane rozwiązanie było rzeczywiście poprawne. Nie jestem pewien, jak to kiedykolwiek zaoferowałem! Proszę użyć tej metody.
pk.
1
Zauważ, że można to uruchomić jako pojedynczy wiersz z okna dialogowego Uruchom:powershell (New-Object -comObject Shell.Application).Namespace(17).ParseName(\"E:\").InvokeVerb(\"Eject\")
Deebster
Ten jednowarstwowy działa, ale bez ukośników.
js2010
Niestety, tutaj to nie działa. Nie otrzymuję również żadnego komunikatu o błędzie ani żadnego komunikatu o błędzie. $?jest Truepo wywołaniu drugiej linii. Czy jest coś, co mogę zrobić?
René Nyffenegger
1

Nie mogę wykonać świetnej pracy, odpowiadając od strony PowerShell, możesz chcieć sprawdzić, jak mountvoldziała . Istnieją różne stopnie zsiadania.

Mountvol czy Mountvol /?

Wyświetla nazwę, globalnie unikalny identyfikator (GUID) i lokalizację woluminu.

Mountvol [dysk:] ścieżka VolumeName

Tworzy nowy punkt montowania woluminu. Podaj katalog główny litery dysku lub istniejący pusty katalog NTFS jako źródło punktu podłączenia, a nazwę woluminu jako cel.

Mountvol [dysk:] ścieżka / D

Usuwa istniejący punkt podłączenia woluminu.

Mountvol [dysk:] ścieżka / L

Wyświetla nazwę woluminu dla danego punktu podłączenia woluminu.

Próbowałem zrobić coś podobnego do tego, czego wymagałeś w VBScript do zmiany kolejności urządzeń na starych komputerach stacjonarnych, na których montowanie dysków dla starszych urządzeń, które było zbyt uciążliwe do usunięcia (odczyt dysku Flash), kolidowało ze skrótami w niestandardowym interfejsie GUI, w których mogłem tylko wyraźnie wspomnieć o punktach montowania ( D :, E :, F :) w określonym celu. Stało się to wyjątkowo frustrujące i musisz odmontować i ponownie zamontować elementy za pomocą wejść i wyjść mountvol, aby sprawdzić, czy poszło dobrze i kontynuować zmiany. Mam nadzieję, że masz więcej szczęścia niż ja.

songei2f
źródło