MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Perché questo comando msiexec.exe non funziona in PowerShell?

Sembra che per passare percorsi con spazi incorporati a msiexec , devi utilizzare embedded esplicito "..." citando intorno a loro.

Nel tuo caso, questo significa che invece di passare
INSTALLLOCATION='C:\Program Files\MongoDB\Server\3.4\' , devi passare INSTALLLOCATION='"C:\Program Files\MongoDB\Server\3.4\\"'

Nota il "..." incorporato e il \ extra alla fine del percorso per assicurarsi che \" da solo non viene scambiato per un escape " di msiexec (anche se potrebbe funzionare senza l'extra \ anche).

Per mettere insieme il tutto:

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'

Avvertimento :

  • Questa tecnica di citazione incorporata si basa su una tecnica di lunga data, ma rotta Comportamento di PowerShell - vedi questa risposta ; se dovesse mai essere risolto, la tecnica smetterà di funzionare; al contrario, il
    --% l'approccio mostrato di seguito continuerà a funzionare.

  • Un metodo a prova di futuro senza soluzioni alternative consiste nell'utilizzare PSv3+ ie funzione di supporto dal Native modulo (in PSv5+, installa con Install-Module Native dalla Galleria PowerShell ), che internamente compensa tutti i comportamenti interrotti e consente il passaggio di argomenti come previsto; cioè semplicemente anteponendo ie al tuo comando originale sarebbe sufficiente:

# 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'

L'alternativa è attenersi alla citazione originale e utilizzare --% , il simbolo di interruzione dell'analisi , ma tieni presente che ciò significa che non puoi utilizzare le variabili di PowerShell in tutti gli argomenti successivi:

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'

Nota che msiexec , nonostante abbia una CLI (interfaccia della riga di comando), è una GUI -applicazione del sottosistema, quindi viene eseguita in modo asincrono per impostazione predefinita; se vuoi eseguirlo in modo sincrono , usa
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.

Nota che la stringa dell'elenco di argomenti, $msiArgs , è usato così com'è da Start-Process come parte della riga di comando utilizzata per richiamare il programma di destinazione (msiexec ), che significa:

  • solo (incorporato) virgolette doppie deve essere utilizzato.

    • usa "..." con " incorporato con escape come `" per incorporare le variabili e le espressioni di PowerShell nella stringa.
  • al contrario, tuttavia, non è necessaria alcuna soluzione alternativa per gli argomenti citati in parte.

Anche se Start-Process supporta tecnicamente il passaggio degli argomenti individualmente , come array , è meglio evitarlo a causa di un bug di vecchia data:consulta GitHub problema n. 5576 .