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+
ie
hjælpefunktion fraNative
modul (i PSv5+, installer medInstall-Module Native
fra PowerShell Gallery ), som internt kompenserer for al brudt adfærd og tillader at sende argumenter som forventet; det vil sige blot foranie
til 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
.