Remove o dispositivo USB da CommandLine

1

Eu gostaria de um comando que eu possa colocar no final de um arquivo de lote e permitir que eu remova o dispositivo USB em que o arquivo de lote está armazenado com segurança.

Eu encontrei um comando powershell que pode conseguir isso, mas quando eu tento executá-lo a partir do cmd ele não funciona ("% ~ d0" é a variável para o caminho USB):

powershell -command "$driveEject = New-Object -comObject Shell.Application ; $driveEject.Namespace(17).ParseName("%~d0").InvokeVerb("Eject")"

Esta é a mensagem de erro que recebo:

At line:1 char:93
+ ... ject Shell.Application ; $driveEject.Namespace(17).ParseName(E:).Invo ...
+                                                                  ~
Missing ')' in method call.
At line:1 char:93
+ ... ct Shell.Application ; $driveEject.Namespace(17).ParseName(E:).Invoke ...
+                                                                ~~
Unexpected token 'E:' in expression or statement.
At line:1 char:95
+ ... t Shell.Application ; $driveEject.Namespace(17).ParseName(E:).InvokeV ...
+                                                                 ~
Unexpected token ')' in expression or statement.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MissingEndParenthesisInMethodCall
    
por Bita 06.01.2018 / 19:25

2 respostas

0

Sobre as regras de cotação artigo descreve regras para usar aspas simples e duplas no PowerShell. Use

…; $driveEject.Namespace(17).ParseName('%~d0').InvokeVerb('Eject')"

ou (você precisa excluir aspas duplas internas para cmd também)

…; $driveEject.Namespace(17).ParseName("""%~d0""").InvokeVerb("""Eject""")"

No entanto, um Powershell Melhor Prática source deprecia o último: Recomenda-se evitar aspas duplas se não houver variáveis ou seqüências de escape em strings, prefira aspas simples .

    
por 06.01.2018 / 21:43
0

Juntamente com o que o @JoseZ deu a você, se você colocar esse verso no PoSH ISE ou VSCode, verá que o código de cores indica erros de sintaxe. As propriedades pontilhadas devem ser de cor preta. Portanto, o espaço de nomes .Nome, .NomeParse e .InvokeVerb são mostrados como strings, indicados pela cor e, portanto, falharão.

Tente assim, apenas descartar todas as coisas variáveis, eliminando assim todas as citações extras que escapam das coisas.

powershell -command "(New-Object -comObject Shell.Application).NameSpace(17).ParseName('F:').InvokeVerb('Eject')"

Teste em um dos meus sistemas, então sei que isso funciona como está escrito.

Por último, desde que você é capaz e planeja usar PoSH para isso, por que o uso de um arquivo de lote?

    
por 19.01.2018 / 04:59