Zdá se, že aby bylo možné předat cesty s vloženými mezerami na msiexec , musíte použít explicitní vložené "..." citovat kolem nich.
Ve vašem případě to znamená, že místo předáníINSTALLLOCATION='C:\Program Files\MongoDB\Server\3.4\' , musíte předat INSTALLLOCATION='"C:\Program Files\MongoDB\Server\3.4\\"'
Všimněte si vloženého "..." a další \ na konci cesty, abyste zajistili, že \" sám o sobě není mylně považován za uniklý " od msiexec (ačkoli to může fungovat bez extra \ taky).
Abych to všechno dal dohromady:
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'
Upozornění :
-
Tato technika vložených citací se rzakládá na dlouhodobé, ale nefunkční Chování prostředí PowerShell – viz tuto odpověď ; pokud se to někdy opraví, technika přestane fungovat; naopak
--%níže uvedený přístup bude nadále fungovat. -
Bezproblémovou a perspektivní metodou je použití PSv3+
iepomocná funkce zNativemodul (v PSv5+ nainstalujte pomocíInstall-Module Nativez Galerie PowerShell ), který vnitřně kompenzuje veškeré narušené chování a umožňuje předávání argumentů podle očekávání; to znamená jednoduše přidatiena váš původní příkaz by stačilo:
# 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'
Alternativa je držet se původní citace a použít --% , symbol zastavení analýzy , ale všimněte si, že to znamená, že nemůžete použít proměnné PowerShellu ve všech následujících argumentech:
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'
Všimněte si, že msiexec , přestože má CLI (rozhraní příkazového řádku), je GUI -subsystem aplikace, takže běží asynchronně ve výchozím nastavení; pokud jej chcete spouštět synchronně , použijteStart-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.
Všimněte si, že řetězec seznamu argumentů $msiArgs , se používá tak jak je pomocí Start-Process jako součást příkazového řádku používaného k vyvolání cílového programu (msiexec ), což znamená:
-
pouze (vložené) dvojité uvozovky musí být použit.
- použijte
"..."s vloženým"zakódováno jako`"k vložení proměnných a výrazů PowerShellu do řetězce.
- použijte
-
naopak však není potřeba žádné řešení pro částečně citované argumenty.
I když Start-Process technicky podporuje předávání argumentů individuálně , jako pole , je lepší se tomu vyhnout kvůli dlouhodobé chybě – viz problém GitHubu #5576
.