Desmontar la unidad externa USB con powershell

12

Estoy intentando desmontar una unidad USB externa con PowerShell y no puedo hacerlo con éxito. El siguiente script es lo que uso:

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

Luego verifico mi computadora para verificar si la unidad está desmontada pero no lo está.

Los parámetros booleanos $ force y $ permanent se han probado con diferentes permutaciones en vano. El código de salida devuelto por el comando de desmontaje cambia cuando se activan los parámetros.

(0,0) = exit code 0

(0,1) = exit code 2

(1,0) = exit code 0

(1,1) = exit code 2

La documentación para el código de salida 2 indica que hay puntos de montaje existentes como una razón por la cual no se puede desmontar. Aunque estoy tratando de desmontar el único punto de montaje que existe, así que no estoy seguro de lo que este código de salida intenta decirme.

Después de haber rastreado la web para personas que experimentan problemas similares, solo he encontrado un comando adicional para probar y ese es el siguiente:

# executed after the .Dismount() command

$drive.Put() 

Este comando adicional no ayuda.

Me estoy quedando sin cosas para probar, por lo que cualquier ayuda que alguien me pueda dar sería muy apreciada.

JB
fuente
Probablemente no desee desmontar una unidad usb. Tendrá que reasignar la letra de la unidad en la administración del disco más adelante.
js2010

Respuestas:

11

Una solución limpia que no deja referencias abiertas a medio cocer como lo hace la muestra de pk es:

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

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

Koen Zomers
fuente
Mi solución publicada anteriormente era de hecho correcta. ¡No estoy seguro de cómo lo ofrecí! Por favor use este método.
pk.
1
Tenga en cuenta que esto se puede ejecutar como una sola línea desde el cuadro de diálogo Ejecutar:powershell (New-Object -comObject Shell.Application).Namespace(17).ParseName(\"E:\").InvokeVerb(\"Eject\")
Deebster
Esa línea única funciona pero sin las barras invertidas.
js2010
Desafortunadamente, eso no funciona aquí. Tampoco recibo ningún mensaje de error o mensaje de error. $?es Truedespués de invocar la segunda línea. ¿Hay algo que pueda hacer?
René Nyffenegger el
1

No puedo hacer un gran trabajo respondiendo desde el extremo de PowerShell, por lo que es posible que desee ver cómo mountvolfunciona . Hay diferentes grados de desmontaje.

Mountvol o Mountvol /?

Muestra el nombre, el identificador único global (GUID) y la ubicación del volumen.

Mountvol [unidad:] ruta VolumeName

Crea un nuevo punto de montaje de volumen. Especifique un directorio raíz de letra de unidad o un directorio NTFS vacío existente como fuente del punto de montaje y un nombre de volumen como destino.

Mountvol [unidad:] ruta / D

Elimina un punto de montaje de volumen existente.

Mountvol [unidad:] ruta / L

Enumera un nombre de volumen para un punto de montaje de volumen dado.

Intenté hacer algo similar a lo que requería en VBScript para reordenar dispositivos en escritorios antiguos donde las unidades de montaje para hardware antiguo que era demasiado tedioso para eliminar (leer la unidad Flash) estaba interfiriendo con accesos directos en una GUI personalizada donde solo podía mencionar explícitamente los puntos de montaje ( D :, E :, F :) con un propósito particular. Esto se volvió muy frustrante, y tienes que desmontar y volver a montar cosas usando las entradas y salidas mountvol para verificar que funcionó bien y proceder con los cambios. Espero que tengas mejor suerte que yo.

songei2f
fuente