Det ser ud til, at for at passere stier med indlejrede rum til msiexec , skal du bruge eksplicit indlejret "..." citerer omkring dem.
I dit tilfælde betyder det, at i stedet for at beståINSTALLLOCATION='C:\Program Files\MongoDB\Server\3.4\' , skal du bestå INSTALLLOCATION='"C:\Program Files\MongoDB\Server\3.4\\"'
Bemærk den indlejrede "..." og den ekstra \ i slutningen af stien for at sikre, at \" alene forveksles ikke med en undsluppen " af msiexec (selvom det kan fungere uden den ekstra \ også).
For at sætte det hele sammen:
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'
Advarsel :
-
Denne indlejrede citeringsteknik bygger på langvarig, men brudt PowerShell-adfærd - se dette svar ; skulle det nogensinde blive rettet, vil teknikken holde op med at virke; derimod
--%fremgangsmåde vist nedenfor vil fortsætte med at fungere. -
En løsningsfri, fremtidssikret metode er at bruge PSv3+
iehjælpefunktion fraNativemodul (i PSv5+, installer medInstall-Module Nativefra PowerShell Gallery ), som internt kompenserer for al brudt adfærd og tillader at sende argumenter som forventet; det vil sige blot foranietil din oprindelige kommando ville være nok:
# 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 er at holde sig til det originale citat og bruge --% , stop-parsing-symbolet , men bemærk, at det betyder, at du ikke kan bruge PowerShell-variabler i alle efterfølgende argumenter:
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'
Bemærk, at msiexec , på trods af at have en CLI (kommandolinjegrænseflade), er en GUI -undersystemapplikation, så den kører asynkront som standard; hvis du vil køre det synkront , brugStart-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.
Bemærk, at argumentlistestrengen, $msiArgs , bruges som det er ved Start-Process som en del af kommandolinjen, der bruges til at starte målprogrammet (msiexec ), hvilket betyder:
-
kun (indlejret) dobbelt-citering skal bruges.
- brug
"..."med indlejret"escaped som`"for at indlejre PowerShell-variabler og udtryk i strengen.
- brug
-
omvendt er der dog ikke behov for en løsning for delvist citerede argumenter.
Selvom Start-Process understøtter teknisk videregivelse af argumenterne individuelt , som en matrix , dette undgås bedst på grund af en langvarig fejl - se GitHub-problem #5576
.