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+
iehjälpfunktion frånNativemodul (i PSv5+, installera medInstall-Module Nativefrå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åietill 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
.