Parece que para pasar caminos con espacios incrustados a msiexec , debe usar incrustado explícito "..." citando a su alrededor.
En su caso, esto significa que en lugar de pasarINSTALLLOCATION='C:\Program Files\MongoDB\Server\3.4\' , debe pasar INSTALLLOCATION='"C:\Program Files\MongoDB\Server\3.4\\"'
Tenga en cuenta el "..." incrustado y el \ adicional al final de la ruta para asegurarse de que \" solo no se confunde con un escapado " por msiexec (aunque puede funcionar sin el \ extra también).
Para ponerlo todo junto:
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'
Advertencia :
-
Esta técnica de citas incrustadas rse basa en citas antiguas, pero rotas. Comportamiento de PowerShell - ver esta respuesta ; si alguna vez se arregla, la técnica dejará de funcionar; por el contrario, el
--%El enfoque que se muestra a continuación seguirá funcionando. -
Un método sin solución y preparado para el futuro es usar el PSv3+
iefunción auxiliar deNativemódulo (en PSv5+, instalar conInstall-Module Nativede la Galería de PowerShell ), que internamente compensa todos los comportamientos defectuosos y permite pasar argumentos como se esperaba; es decir, simplemente anteponiendoiea su comando original sería 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'
La alternativa es seguir con la cita original y usar --% , el símbolo de parada de análisis , pero tenga en cuenta que esto significa que no puede usar variables de PowerShell en todos los argumentos posteriores:
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'
Tenga en cuenta que msiexec , a pesar de tener una CLI (interfaz de línea de comandos), es una GUI -aplicación de subsistema, por lo que se ejecuta asincrónicamente por defecto; si desea ejecutarlo sincrónicamente , 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.
Tenga en cuenta que la cadena de la lista de argumentos, $msiArgs , se usa tal cual por Start-Process como parte de la línea de comando utilizada para invocar el programa de destino (msiexec ), lo que significa:
-
solo (incrustado) comillas dobles debe usarse.
- usa
"..."con"incrustado escapó como`"para incrustar variables y expresiones de PowerShell en la cadena.
- usa
-
a la inversa, sin embargo, no se necesita ninguna solución para los argumentos parcialmente citados.
Aunque Start-Process admite técnicamente pasar los argumentos individualmente , como una matriz , es mejor evitarlo debido a un error de larga data:consulta el problema de GitHub n.º 5576
.