MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Por que esse comando msiexec.exe não funciona no powershell?


Parece que para passar caminhos com espaços incorporados para msiexec , você deve usar incorporado explícito "..." citando em torno deles.

No seu caso, isso significa que, em vez de passar
INSTALLLOCATION='C:\Program Files\MongoDB\Server\3.4\' , você deve passar INSTALLLOCATION='"C:\Program Files\MongoDB\Server\3.4\\"'

Observe o "..." incorporado e o \ extra no final do caminho para garantir que \" sozinho não é confundido com um escapado " por msiexec (embora possa funcionar sem o \ extra também).

Para juntar tudo:
msiexec.exe /q /i `
  'C:\Users\ADMINI~1\AppData\Local\Temp\mongo-server-3.4-latest.msi' `
  INSTALLLOCATION='"C:\Program Files\MongoDB\Server\3.4\\"' ADDLOCAL='all'

Advertência :

  • Essa técnica de citação incorporada rdepende de longa data, mas quebrada Comportamento do PowerShell - veja esta resposta ; caso seja consertado, a técnica deixará de funcionar; por outro lado, o
    --% abordagem mostrada abaixo continuará a funcionar.

  • Um método livre de soluções alternativas e à prova de futuro é usar o PSv3+ ie função auxiliar do Native módulo (no PSv5+, instale com Install-Module Native da Galeria do PowerShell ), que internamente compensa todos os comportamentos inadequados e permite passar argumentos conforme o esperado; ou seja, simplesmente prefixando ie ao seu comando original seria suficiente:
# No workarounds needed with the 'ie' function from the 'Native' module.
ie msiexec.exe /q /i 'C:\Users\ADMINI~1\AppData\Local\Temp\mongo-server-3.4-latest.msi' INSTALLLOCATION='C:\Program Files\MongoDB\Server\3.4\' ADDLOCAL='all'

A alternativa é manter a citação original e usar --% , o símbolo de parada de análise , mas observe que isso significa que você não pode usar variáveis ​​do PowerShell em todos os argumentos subsequentes:
msiexec.exe /q /i `
  'C:\Users\ADMINI~1\AppData\Local\Temp\mongo-server-3.4-latest.msi' `
   --% INSTALLLOCATION="C:\Program Files\MongoDB\Server\3.4\\" ADDLOCAL='all'

Observe que msiexec , apesar de ter uma CLI (interface de linha de comando), é uma GUI -subsystem application, então ele executa de forma assíncrona por padrão; se você quiser executá-lo sincronamente , use
Start-Process -Wait
:
$msiArgs = '/q /i "C:\Users\ADMINI~1\AppData\Local\Temp\mongo-server-3.4-latest.msi" INSTALLLOCATION="C:\Program Files\MongoDB\Server\3.4\\" ADDLOCAL=all'

$ps = Start-Process -PassThru -Wait msiexec -ArgumentList $msiArgs

# $ps.ExitCode contains msiexec's exit code.

Observe que a string da lista de argumentos, $msiArgs , é usado como está por Start-Process como parte da linha de comando usada para invocar o programa de destino (msiexec ), que significa:

  • apenas (incorporado) aspas duplas deve ser usado.
    • use "..." com " incorporado escapou como `" para incorporar variáveis ​​e expressões do PowerShell na string.

  • inversamente, no entanto, nenhuma solução alternativa para argumentos parcialmente citados é necessária.

Embora Start-Process suporta tecnicamente a passagem dos argumentos individualmente , como uma matriz , isso deve ser evitado devido a um bug de longa data - consulte Problema #5576 do GitHub .