Wygląda na to, że aby przekazywać ścieżki z osadzonymi spacjami do msiexec
, musisz użyć jawnie osadzonych "..."
cytując wokół nich.
W Twoim przypadku oznacza to, że zamiast podawaćINSTALLLOCATION='C:\Program Files\MongoDB\Server\3.4\'
, musisz przekazać INSTALLLOCATION='"C:\Program Files\MongoDB\Server\3.4\\"'
Zwróć uwagę na osadzony "..."
i dodatkowy \
na końcu ścieżki, aby upewnić się, że \"
sam nie jest mylony z uciekinierem "
przez msiexec
(chociaż może działać bez dodatkowego \
też).
Podsumowując:
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'
Zastrzeżenie :
-
Ta technika wbudowanego cytowania ropiera się na długotrwałej, ale złamanej Zachowanie PowerShell - zobacz tę odpowiedź ; jeśli kiedykolwiek zostanie naprawiony, technika przestanie działać; natomiast
--%
podejście pokazane poniżej będzie nadal działać. -
Wolną od obejść i przyszłościową metodą jest użycie PSv3+
ie
funkcja pomocnicza zNative
moduł (w PSv5+ zainstaluj zInstall-Module Native
z Galerii PowerShell ), która wewnętrznie rekompensuje wszystkie nieprawidłowe zachowania i umożliwia przekazywanie argumentów zgodnie z oczekiwaniami; czyli po prostu dodającie
do oryginalnego polecenia wystarczy:
# 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'
Alternatywna jest trzymanie się oryginalnego cytatu i użycie --%
, symbol zatrzymania analizowania , ale pamiętaj, że oznacza to, że nie możesz używać zmiennych PowerShell we wszystkich kolejnych argumentach:
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'
Pamiętaj, że msiexec
, pomimo posiadania CLI (interfejsu wiersza poleceń), jest GUI -subsystem aplikacja, więc działa asynchronicznie domyślnie; jeśli chcesz uruchomić go synchronicznie , użyj Start-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.
Zauważ, że ciąg listy argumentów, $msiArgs
, jest używany tak jak jest przez Start-Process
jako część wiersza poleceń używanego do wywołania programu docelowego (msiexec
), co oznacza:
-
tylko (osadzone) podwójne cudzysłowy musi być używany.
- użyj
"..."
z osadzonym"
zmieniony jako`"
do osadzania zmiennych i wyrażeń PowerShell w ciągu.
- użyj
-
odwrotnie, jednak nie jest potrzebne obejście częściowo cytowanych argumentów.
Mimo że Start-Process
technicznie obsługuje przekazywanie argumentów indywidualnie , jako tablica , najlepiej tego unikać ze względu na długotrwały błąd — zobacz problem #5576 z GitHub
.