sql >> Databáze >  >> NoSQL >> MongoDB

Proč tento příkaz msiexec.exe nefunguje v powershell?

Zdá se, že aby bylo možné předat cesty s vloženými mezerami na msiexec , musíte použít explicitní vložené "..." citovat kolem nich.

Ve vašem případě to znamená, že místo předání
INSTALLLOCATION='C:\Program Files\MongoDB\Server\3.4\' , musíte předat INSTALLLOCATION='"C:\Program Files\MongoDB\Server\3.4\\"'

Všimněte si vloženého "..." a další \ na konci cesty, abyste zajistili, že \" sám o sobě není mylně považován za uniklý " od msiexec (ačkoli to může fungovat bez extra \ taky).

Abych to všechno dal dohromady:

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'

Upozornění :

  • Tato technika vložených citací se rzakládá na dlouhodobé, ale nefunkční Chování prostředí PowerShell – viz tuto odpověď ; pokud se to někdy opraví, technika přestane fungovat; naopak
    --% níže uvedený přístup bude nadále fungovat.

  • Bezproblémovou a perspektivní metodou je použití PSv3+ ie pomocná funkce z Native modul (v PSv5+ nainstalujte pomocí Install-Module Native z Galerie PowerShell ), který vnitřně kompenzuje veškeré narušené chování a umožňuje předávání argumentů podle očekávání; to znamená jednoduše přidat ie na váš původní příkaz by stačilo:

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

Alternativa je držet se původní citace a použít --% , symbol zastavení analýzy , ale všimněte si, že to znamená, že nemůžete použít proměnné PowerShellu ve všech následujících argumentech:

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'

Všimněte si, že msiexec , přestože má CLI (rozhraní příkazového řádku), je GUI -subsystem aplikace, takže běží asynchronně ve výchozím nastavení; pokud jej chcete spouštět synchronně , použijte
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.

Všimněte si, že řetězec seznamu argumentů $msiArgs , se používá tak jak je pomocí Start-Process jako součást příkazového řádku používaného k vyvolání cílového programu (msiexec ), což znamená:

  • pouze (vložené) dvojité uvozovky musí být použit.

    • použijte "..." s vloženým " zakódováno jako `" k vložení proměnných a výrazů PowerShellu do řetězce.
  • naopak však není potřeba žádné řešení pro částečně citované argumenty.

I když Start-Process technicky podporuje předávání argumentů individuálně , jako pole , je lepší se tomu vyhnout kvůli dlouhodobé chybě – viz problém GitHubu #5576 .




  1. Skupina MongoDB pomocí ovladače Ruby

  2. Hromadné vložení mongodb do Meteor nebo Node

  3. node.js mongodb javascript rozsah zmatek

  4. Jak vložím HTML do Mongodb?