Entfernen Sie das externe USB-Laufwerk mithilfe von Powershell

12

Ich versuche, ein externes USB-Laufwerk mit Powershell zu entfernen, und kann dies nicht erfolgreich durchführen. Das folgende Skript verwende ich:

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

Ich überprüfe dann meinen Computer, um festzustellen, ob das Laufwerk nicht gemountet ist, aber nicht.

Die Booleschen Parameter $ force und $ permanent wurden ohne Erfolg mit unterschiedlichen Permutationen ausprobiert. Der vom Befehl dismount zurückgegebene Exit-Code ändert sich, wenn die Parameter umgeschaltet werden.

(0,0) = exit code 0

(0,1) = exit code 2

(1,0) = exit code 0

(1,1) = exit code 2

In der Dokumentation zu Exit-Code 2 wird angegeben, dass bereits Bereitstellungspunkte vorhanden sind, um die Bereitstellung nicht aufzuheben. Obwohl ich versuche, den einzigen vorhandenen Mount-Punkt zu entfernen, bin ich mir nicht sicher, was dieser Exit-Code mir zu sagen versucht.

Nachdem ich bereits das Web nach Personen mit ähnlichen Problemen durchsucht habe, habe ich nur einen zusätzlichen Befehl zum Ausprobieren gefunden, und zwar den folgenden:

# executed after the .Dismount() command

$drive.Put() 

Dieser zusätzliche Befehl hilft nicht.

Mir gehen die Dinge aus, um es zu versuchen, daher wäre jede Unterstützung, die mir jemand geben kann, sehr dankbar.

JB.
quelle
Sie möchten wahrscheinlich kein USB-Laufwerk demontieren. Sie müssen den Laufwerksbuchstaben später in der Datenträgerverwaltung neu zuweisen.
js2010

Antworten:

11

Eine saubere Lösung, die keine halbgebackenen offenen Referenzen hinterlässt, wie es die Probe von pk tut, ist:

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

Abgerufen von http://sushihangover.blogspot.nl/2012/02/powershell-eject-local-or-remote.html

Koen Zomers
quelle
Meine zuvor veröffentlichte Lösung war in der Tat korrekt. Ich bin mir ein bisschen unsicher, wie ich es jemals angeboten habe! Bitte verwenden Sie diese Methode.
pk.
1
Beachten Sie, dass dies als einzelne Zeile im Dialogfeld "Ausführen" ausgeführt werden kann:powershell (New-Object -comObject Shell.Application).Namespace(17).ParseName(\"E:\").InvokeVerb(\"Eject\")
Deebster
Dieser Einzeiler funktioniert aber ohne die Backslashes.
js2010
Leider funktioniert das hier nicht. Ich bekomme auch keine Fehlermeldung oder Fehlermeldung. $?ist Truenach dem Aufrufen der zweiten Zeile. Kann ich irgendetwas tun?
René Nyffenegger
1

Ich kann keine großartige Arbeit leisten, wenn ich vom PowerShell-Ende aus antworte. Vielleicht möchten Sie sich ansehen, wie das mountvolfunktioniert . Es gibt verschiedene Abstiegsgrade.

Mountvol oder Mountvol /?

Zeigt den Namen, die global eindeutige Kennung (GUID) und den Speicherort des Volumes an.

Mountvol [Laufwerk:] Pfad VolumeName

Erstellt einen neuen Volume-Mount-Punkt. Geben Sie entweder ein Laufwerksbuchstaben-Stammverzeichnis oder ein vorhandenes leeres NTFS-Verzeichnis als Quelle des Bereitstellungspunkts und einen Datenträgernamen als Ziel an.

Mountvol [Laufwerk:] Pfad / D.

Löscht einen vorhandenen Volume-Mount-Punkt.

Mountvol [Laufwerk:] Pfad / L.

Listet einen Datenträgernamen für einen bestimmten Datenträger-Bereitstellungspunkt auf.

Ich habe versucht, etwas Ähnliches wie in VBScript zu tun, um Geräte auf alten Desktops neu zu ordnen, bei denen Laufwerkhalterungen für ältere Hardware, deren Entfernung zu mühsam war (Flash-Laufwerk lesen), Verknüpfungen auf einer benutzerdefinierten GUI störten, bei der ich nur explizit Mountpunkte erwähnen konnte ( D:, E:, F :) mit einem bestimmten Zweck. Dies wurde sehr frustrierend, und Sie müssen die Dinge mithilfe von Mountvol-Ein- und Ausgängen aushängen und wieder einhängen, um zu überprüfen, ob sie ordnungsgemäß funktionieren, und mit Änderungen fortfahren. Ich hoffe du hast mehr Glück als ich.

songei2f
quelle