sql >> Databasteknik >  >> NoSQL >> MongoDB

Varför fungerar inte detta msiexec.exe-kommando i powershell?

Det verkar som att för att passera vägar med inbäddade utrymmen till msiexec måste du använda explicit inbäddad "..." citerar runt dem.

I ditt fall betyder det att istället för att skicka
INSTALLLOCATION='C:\Program Files\MongoDB\Server\3.4\' , du måste skicka INSTALLLOCATION='"C:\Program Files\MongoDB\Server\3.4\\"'

Notera den inbäddade "..." och den extra \ i slutet av sökvägen för att säkerställa att \" ensam förväxlas inte med en rymd " av msiexec (även om det kanske fungerar utan den extra \ också).

För att få ihop allt:

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'

Varning :

  • Denna inbäddade citeringsteknik bygger på långvarig, men trasig PowerShell-beteende - se det här svaret ; skulle det någonsin fixas kommer tekniken att sluta fungera; däremot
    --% tillvägagångssättet som visas nedan kommer att fortsätta att fungera.

  • En lösningsfri, framtidssäker metod är att använda PSv3+ ie hjälpfunktion från Native modul (i PSv5+, installera med Install-Module Native från PowerShell Gallery ), som internt kompenserar för allt trasigt beteende och tillåter vidarebefordran av argument som förväntat; det vill säga helt enkelt föregå ie till ditt ursprungliga kommando skulle räcka:

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

Alternativet är att hålla fast vid det ursprungliga citatet och använda --% , stop-parsing-symbolen , men observera att detta betyder att du inte kan använda PowerShell-variabler i alla efterföljande argument:

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'

Observera att msiexec , trots att den har ett CLI (kommandoradsgränssnitt), är ett GUI -subsystemapplikation, så den körs asynkront som standard; om du vill köra det synkront , använd
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.

Observera att argumentlistans sträng, $msiArgs , används i befintligt skick med Start-process som en del av kommandoraden som används för att anropa målprogrammet (msiexec ), vilket betyder:

  • endast (inbäddad) dubbelcitation måste användas.

    • använd "..." med inbäddad " escaped som `" för att bädda in PowerShell-variabler och uttryck i strängen.
  • omvänt behövs dock ingen lösning för delvis citerade argument.

Även om Start-Process tekniskt stöder att skicka argumenten individuellt , som en array , detta undviks bäst på grund av en långvarig bugg - se GitHub-problem #5576 .




  1. Redis pub/sub on rails

  2. Kartläggning - Mongodb inbäddat dokument i Symfony2

  3. Mongoose-gruppfråga i node.js / express route

  4. Filtrera inbäddade dokument i MongoDB