sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvorfor virker denne msiexec.exe-kommando ikke i powershell?

Det ser ud til, at for at passere stier med indlejrede rum til msiexec , skal du bruge eksplicit indlejret "..." citerer omkring dem.

I dit tilfælde betyder det, at i stedet for at bestå
INSTALLLOCATION='C:\Program Files\MongoDB\Server\3.4\' , skal du bestå INSTALLLOCATION='"C:\Program Files\MongoDB\Server\3.4\\"'

Bemærk den indlejrede "..." og den ekstra \ i slutningen af ​​stien for at sikre, at \" alene forveksles ikke med en undsluppen " af msiexec (selvom det kan fungere uden den ekstra \ også).

For at sætte det hele sammen:

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'

Advarsel :

  • Denne indlejrede citeringsteknik bygger på langvarig, men brudt PowerShell-adfærd - se dette svar ; skulle det nogensinde blive rettet, vil teknikken holde op med at virke; derimod
    --% fremgangsmåde vist nedenfor vil fortsætte med at fungere.

  • En løsningsfri, fremtidssikret metode er at bruge PSv3+ ie hjælpefunktion fra Native modul (i PSv5+, installer med Install-Module Native fra PowerShell Gallery ), som internt kompenserer for al brudt adfærd og tillader at sende argumenter som forventet; det vil sige blot foran ie til din oprindelige kommando ville være nok:

# 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 er at holde sig til det originale citat og bruge --% , stop-parsing-symbolet , men bemærk, at det betyder, at du ikke kan bruge PowerShell-variabler i alle efterfølgende argumenter:

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'

Bemærk, at msiexec , på trods af at have en CLI (kommandolinjegrænseflade), er en GUI -undersystemapplikation, så den kører asynkront som standard; hvis du vil køre det synkront , brug
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.

Bemærk, at argumentlistestrengen, $msiArgs , bruges som det er ved Start-Process som en del af kommandolinjen, der bruges til at starte målprogrammet (msiexec ), hvilket betyder:

  • kun (indlejret) dobbelt-citering skal bruges.

    • brug "..." med indlejret " escaped som `" for at indlejre PowerShell-variabler og udtryk i strengen.
  • omvendt er der dog ikke behov for en løsning for delvist citerede argumenter.

Selvom Start-Process understøtter teknisk videregivelse af argumenterne individuelt , som en matrix , dette undgås bedst på grund af en langvarig fejl - se GitHub-problem #5576 .




  1. Ufanget fejl:Når modifikatorindstillingen er sand, skal valideringsobjektet have mindst én operator

  2. Hvad er den bedste måde at gemme billeder til expressjs, mongodb-webstedet?

  3. Hvordan starter jeg Mongo DB fra Windows?

  4. Sådan formateres data i Model, før du gemmer i Mongoose (ExpressJS)