Det verkar som att för att passera vägar med inbäddade utrymmen till msiexec
måste du använda explicit inbäddad "..."
citerar runt dem.
I ditt fall betyder det att istället för att skickaINSTALLLOCATION='C:\Program Files\MongoDB\Server\3.4\'
, du måste skicka INSTALLLOCATION='"C:\Program Files\MongoDB\Server\3.4\\"'
Notera den inbäddade \
i slutet av sökvägen för att säkerställa att \"
ensam förväxlas inte med en rymd "
av msiexec
(även om det kanske fungerar utan den extra \
också).
För att få ihop allt:
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'
Varning :
-
Denna inbäddade citeringsteknik bygger på långvarig, men trasig PowerShell-beteende - se det här svaret ; skulle det någonsin fixas kommer tekniken att sluta fungera; däremot
--%
tillvägagångssättet som visas nedan kommer att fortsätta att fungera. -
En lösningsfri, framtidssäker metod är att använda PSv3+
ie
hjälpfunktion frånNative
modul (i PSv5+, installera medInstall-Module Native
från PowerShell Gallery ), som internt kompenserar för allt trasigt beteende och tillåter vidarebefordran av argument som förväntat; det vill säga helt enkelt föregåie
till ditt ursprungliga kommando skulle räcka:
# 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'
Alternativet är att hålla fast vid det ursprungliga citatet och använda --%
, stop-parsing-symbolen , men observera att detta betyder att du inte kan använda PowerShell-variabler i alla efterföljande argument:
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'
Observera att msiexec
, trots att den har ett CLI (kommandoradsgränssnitt), är ett GUI -subsystemapplikation, så den körs asynkront som standard; om du vill köra det synkront , användStart-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.
Observera att argumentlistans sträng, $msiArgs
, används i befintligt skick med Start-process
som en del av kommandoraden som används för att anropa målprogrammet (msiexec
), vilket betyder:
-
endast (inbäddad) dubbelcitation måste användas.
- använd
"..."
med inbäddad"
escaped som`"
för att bädda in PowerShell-variabler och uttryck i strängen.
- använd
-
omvänt behövs dock ingen lösning för delvis citerade argument.
Även om Start-Process
tekniskt stöder att skicka argumenten individuellt , som en array , detta undviks bäst på grund av en långvarig bugg - se GitHub-problem #5576
.