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+
ie
función auxiliar deNative
módulo (en PSv5+, instalar conInstall-Module Native
de la Galería de PowerShell ), que internamente compensa todos los comportamientos defectuosos y permite pasar argumentos como se esperaba; es decir, simplemente anteponiendoie
a 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
.