sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Por qué este comando msiexec.exe no funciona en powershell?

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 pasar
INSTALLLOCATION='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 de Native módulo (en PSv5+, instalar con Install-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 anteponiendo ie 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 , 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.

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.
  • 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 .