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+
ie
pomocná funkce zNative
modul (v PSv5+ nainstalujte pomocíInstall-Module Native
z 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řidatie
na 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
.