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+
iehelpfunctie van deNativemodule (In PSv5+, installeer metInstall-Module Nativeuit de PowerShell Gallery ), die intern al het gebroken gedrag compenseert en staat het doorgeven van argumenten toe zoals verwacht; dat wil zeggen, gewoon voorgaandieaan 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
.