MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Защо тази команда msiexec.exe не работи в powershell?

Изглежда, че за да се преминат пътища с вградени интервали към msiexec , трябва да използвате изрично вграден "..." цитиране около тях.

Във вашия случай това означава, че вместо да предавате
INSTALLLOCATION='C:\Program Files\MongoDB\Server\3.4\' , трябва да подадете INSTALLLOCATION='"C:\Program Files\MongoDB\Server\3.4\\"'

Обърнете внимание на вградения "..." и допълнителния \ в края на пътя, за да сте сигурни, че \" сам по себе си не се бърка с избягал " от msiexec (въпреки че може да работи без допълнителния \ също).

За да съберем всичко заедно:

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'

Внимание :

  • Тази техника на вградено цитиране се основава на дългогодишна, но счупена Поведение на PowerShell - вижте този отговор ; ако някога се поправи, техниката ще спре да работи; за разлика от това,
    --% показаният по-долу подход ще продължи да работи.

  • Метод без заобиколно решение и надежден за бъдещето е използването на PSv3+ ie помощна функцията от Native модул (в PSv5+ инсталирайте с Install-Module Native от галерия на PowerShell ), който вътрешно компенсира цялото повредено поведение и позволява предаване на аргументи според очакванията; просто добавяне на ie към първоначалната ви команда би било достатъчно:

# 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'

Алтернативатата е да се придържате към оригиналното цитиране и да използвате --% , символът за спиране на синтактичния анализ , но имайте предвид, че това означава, че не можете да използвате променливи на PowerShell във всички следващи аргументи:

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'

Имайте предвид, че msiexec , въпреки че има CLI (интерфейс на командния ред), е GUI -подсистемно приложение, така че работи асинхронно по подразбиране; ако искате да го стартирате синхронно , използвайте
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.

Обърнете внимание, че низът от списъка с аргументи, $msiArgs , се използва както е от Start-Process като част от командния ред, използван за извикване на целевата програма (msiexec ), което означава:

  • само (вградено) двойно кавиране трябва да се използва.

    • използвайте "..." с вграден " екраниран като `" за вграждане на променливи и изрази на PowerShell в низа.
  • обратно, обаче, не е необходимо заобиколно решение за частично цитирани аргументи.

Въпреки че Start-Process технически поддържа предаването на аргументите индивидуално , като масив , това е най-добре да се избягва поради дългогодишен бъг – вижте GitHub проблем #5576 .




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как ClusterControl извършва автоматично възстановяване и отказ на база данни

  2. MongoDB списъци - вземете всеки N-ти елемент

  3. Рекурсивни елементи в Schema:Mongoose моделиране

  4. mongodb заявка без име на поле

  5. PyMongo $inc има проблеми