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 passareINSTALLLOCATION='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 dalNative
modulo (in PSv5+, installa conInstall-Module Native
dalla Galleria PowerShell ), che internamente compensa tutti i comportamenti interrotti e consente il passaggio di argomenti come previsto; cioè semplicemente anteponendoie
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 , usaStart-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.
- usa
-
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
.