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+iefunção auxiliar doNativemódulo (no PSv5+, instale comInstall-Module Nativeda Galeria do PowerShell ), que internamente compensa todos os comportamentos inadequados e permite passar argumentos conforme o esperado; ou seja, simplesmente prefixandoieao 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 , useStart-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.
- use
-
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
.