Het lijkt erop dat om paden met ingesloten spaties naar msiexec
, moet u expliciete embedded . gebruiken "..."
citeren om hen heen.
In uw geval betekent dit dat in plaats van het doorgeven vanINSTALLLOCATION='C:\Program Files\MongoDB\Server\3.4\'
, moet u door INSTALLLOCATION='"C:\Program Files\MongoDB\Server\3.4\\"'
Let op de ingesloten "..."
en de extra \
aan het einde van het pad om ervoor te zorgen dat \"
alleen wordt niet aangezien voor een ontsnapte "
door msiexec
(hoewel het misschien werkt zonder de extra \
ook).
Om het allemaal samen te voegen:
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'
Voorbehoud :
-
Deze techniek van ingesloten aanhalingstekens is gebaseerd op langdurige, maar gebroken PowerShell-gedrag - zie dit antwoord ; mocht het ooit gerepareerd worden, dan zal de techniek stoppen met werken; daarentegen, de
--%
onderstaande benadering zal blijven werken. -
Een oplossing die geen oplossing biedt en toekomstbestendig is, is het gebruik van de PSv3+
ie
helpfunctie van deNative
module (In PSv5+, installeer metInstall-Module Native
uit de PowerShell Gallery ), die intern al het gebroken gedrag compenseert en staat het doorgeven van argumenten toe zoals verwacht; dat wil zeggen, gewoon voorgaandie
aan uw oorspronkelijke opdracht zou voldoende zijn:
# 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'
Het alternatief is om bij het originele citaat te blijven en --%
. te gebruiken , het stop-parsing-symbool , maar houd er rekening mee dat dit betekent dat u geen PowerShell-variabelen kunt gebruiken in alle volgende argumenten:
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'
Merk op dat msiexec
, ondanks dat het een CLI (opdrachtregelinterface) heeft, is het een GUI -subsysteemtoepassing, dus het loopt asynchroon standaard; als je wilt dat het synchroon uitvoert , gebruikStart-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.
Merk op dat de string met argumentlijst, $msiArgs
, wordt zoals het is . gebruikt door Start-Process
als onderdeel van de opdrachtregel die wordt gebruikt om het doelprogramma aan te roepen (msiexec
), wat betekent:
-
alleen (ingesloten) dubbele aanhalingstekens moet worden gebruikt.
- gebruik
"..."
met ingesloten"
escaped als`"
om PowerShell-variabelen en -expressies in de tekenreeks in te sluiten.
- gebruik
-
omgekeerd is er echter geen tijdelijke oplossing voor gedeeltelijk geciteerde argumenten nodig.
Hoewel Start-Process
ondersteunt technisch het doorgeven van de argumenten individueel , als een array , kan dit het beste worden vermeden vanwege een langdurige bug - zie GitHub-probleem #5576
.