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+
iefunkcja pomocnicza zNativemoduł (w PSv5+ zainstaluj zInstall-Module Nativez Galerii PowerShell ), która wewnętrznie rekompensuje wszystkie nieprawidłowe zachowania i umożliwia przekazywanie argumentów zgodnie z oczekiwaniami; czyli po prostu dodająciedo 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
.