MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Dlaczego to polecenie msiexec.exe nie działa w powershell?

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 z Native moduł (w PSv5+ zainstaluj z Install-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ąc ie 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.
  • 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 .




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Usuń element tablicy ze WSZYSTKICH dokumentów za pomocą sterownika MongoDB C#

  2. console.log nie wyświetla oczekiwanych właściwości obiektu

  3. Jakie są koszty ogólne Java ORM dla MongoDB

  4. NieobsłużonePromiseRejectionWarning:MongooseServerSelectionError

  5. MongoDB:znajdź czas wykonania polecenia count() na milionach rekordów w kolekcji?