sql >> Database >  >> NoSQL >> MongoDB

Waarom werkt deze opdracht msiexec.exe niet in powershell?

Het lijkt erop dat om paden met ingesloten spaties naar msiexec , moet u expliciete embedded . gebruiken "..." citeren om hen heen.

In uw geval betekent dit dat in plaats van het doorgeven van
INSTALLLOCATION='C:\Program Files\MongoDB\Server\3.4\' , moet u door INSTALLLOCATION='"C:\Program Files\MongoDB\Server\3.4\\"'

Let op de ingesloten "..." en de extra \ aan het einde van het pad om ervoor te zorgen dat \" alleen wordt niet aangezien voor een ontsnapte " door msiexec (hoewel het misschien werkt zonder de extra \ ook).

Om het allemaal samen te voegen:

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'

Voorbehoud :

  • Deze techniek van ingesloten aanhalingstekens is gebaseerd op langdurige, maar gebroken PowerShell-gedrag - zie dit antwoord ; mocht het ooit gerepareerd worden, dan zal de techniek stoppen met werken; daarentegen, de
    --% onderstaande benadering zal blijven werken.

  • Een oplossing die geen oplossing biedt en toekomstbestendig is, is het gebruik van de PSv3+ ie helpfunctie van de Native module (In PSv5+, installeer met Install-Module Native uit de PowerShell Gallery ), die intern al het gebroken gedrag compenseert en staat het doorgeven van argumenten toe zoals verwacht; dat wil zeggen, gewoon voorgaand ie aan uw oorspronkelijke opdracht zou voldoende zijn:

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

Het alternatief is om bij het originele citaat te blijven en --% . te gebruiken , het stop-parsing-symbool , maar houd er rekening mee dat dit betekent dat u geen PowerShell-variabelen kunt gebruiken in alle volgende argumenten:

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'

Merk op dat msiexec , ondanks dat het een CLI (opdrachtregelinterface) heeft, is het een GUI -subsysteemtoepassing, dus het loopt asynchroon standaard; als je wilt dat het synchroon uitvoert , gebruik
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.

Merk op dat de string met argumentlijst, $msiArgs , wordt zoals het is . gebruikt door Start-Process als onderdeel van de opdrachtregel die wordt gebruikt om het doelprogramma aan te roepen (msiexec ), wat betekent:

  • alleen (ingesloten) dubbele aanhalingstekens moet worden gebruikt.

    • gebruik "..." met ingesloten " escaped als `" om PowerShell-variabelen en -expressies in de tekenreeks in te sluiten.
  • omgekeerd is er echter geen tijdelijke oplossing voor gedeeltelijk geciteerde argumenten nodig.

Hoewel Start-Process ondersteunt technisch het doorgeven van de argumenten individueel , als een array , kan dit het beste worden vermeden vanwege een langdurige bug - zie GitHub-probleem #5576 .




  1. MongoDB .NET-stuurprogramma groeperen op tijdbereik

  2. Globale initialisatie mislukt:BadValue Ongeldige of geen gebruikerslandinstelling ingesteld. Zorg ervoor dat de omgevingsvariabelen LANG en/of LC_* correct zijn ingesteld

  3. Hoe geef ik een runCommand uit met het mongoDB C#-stuurprogramma?

  4. MongoDB allowDiskUse werkt niet..