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 doNative
módulo (no PSv5+, instale comInstall-Module Native
da Galeria do PowerShell ), que internamente compensa todos os comportamentos inadequados e permite passar argumentos conforme o esperado; ou seja, simplesmente prefixandoie
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 , 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
.