Desmonte a unidade externa USB usando o PowerShell

12

Estou tentando desmontar uma unidade USB externa usando o PowerShell e não consigo fazer isso com êxito. O script a seguir é o que eu 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)

Em seguida, verifico meu computador para verificar se a unidade está desmontada, mas não está.

Os parâmetros booleanos $ force e $ permanente foram tentados com diferentes permutações sem sucesso. O código de saída retornado pelo comando desmontar muda quando os parâmetros são alternados.

(0,0) = exit code 0

(0,1) = exit code 2

(1,0) = exit code 0

(1,1) = exit code 2

A documentação para o código de saída 2 indica que existem pontos de montagem existentes como uma razão pela qual não é possível desmontar. Embora eu esteja tentando desmontar o único ponto de montagem que existe, não tenho certeza do que esse código de saída está tentando me dizer.

Já tendo vasculhado a web para pessoas com problemas semelhantes, encontrei apenas um comando adicional para tentar e é o seguinte:

# executed after the .Dismount() command

$drive.Put() 

Este comando adicional não ajuda.

Estou ficando sem coisas para tentar, então qualquer ajuda que alguém possa me dar seria muito apreciada.

JB.
fonte
Você provavelmente não quer desmontar uma unidade USB. Você precisará reatribuir a letra da unidade no gerenciamento de disco posteriormente.
Js2010 # 12/18

Respostas:

11

Uma solução limpa que não deixa nenhuma referência aberta pela metade como a amostra da pk faz é:

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

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

Koen Zomers
fonte
Minha solução postada anteriormente estava realmente correta. Estou um pouco incerto sobre como eu o ofereci! Por favor, use este método.
pk.
1
Observe que isso pode ser executado como uma única linha na caixa de diálogo Executar:powershell (New-Object -comObject Shell.Application).Namespace(17).ParseName(\"E:\").InvokeVerb(\"Eject\")
Deebster
Essa linha única funciona, mas sem as barras invertidas.
Js2010 # 12/18
Infelizmente, isso não funciona aqui. Também não recebo nenhuma mensagem de erro ou mensagem de erro. $?é Truedepois de chamar a segunda linha. Há algo que eu possa fazer?
René Nyffenegger 22/09/19
1

Não posso fazer um ótimo trabalho respondendo no final do PowerShell, talvez você queira ver como mountvolfunciona . Existem diferentes graus de desmontagem.

Mountvol ou Mountvol /?

Exibe o nome, o GUID (identificador exclusivo globalmente) e o local do volume.

Mountvol [drive:] caminho VolumeName

Cria um novo ponto de montagem de volume. Especifique um diretório raiz da letra da unidade ou um diretório NTFS vazio existente como a origem do ponto de montagem e um nome de volume como destino.

Mountvol [drive:] caminho / D

Exclui um ponto de montagem de volume existente.

Mountvol [drive:] caminho / L

Lista um nome de volume para um determinado ponto de montagem de volume.

Tentei fazer algo semelhante ao necessário no VBScript para reordenar dispositivos em áreas de trabalho antigas, onde montagens de unidades para hardware mais antigo que eram tediosas demais para serem removidas (leia a unidade Flash) estavam interferindo nos atalhos de uma GUI personalizada, na qual eu só podia mencionar explicitamente pontos de montagem ( D :, E :, F :) com uma finalidade específica. Isso se tornou extremamente frustrante, e você precisa desmontar e remontar coisas usando entradas e saídas mountvol para verificar se tudo correu bem e prosseguir com as alterações. Espero que você tenha melhor sorte do que eu.

songei2f
fonte