MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Pourquoi cette commande msiexec.exe ne fonctionne-t-elle pas dans PowerShell ?

Il semble que pour passer des chemins avec des espaces intégrés à msiexec , vous devez utiliser explicitement embedded "..." citant autour d'eux.

Dans votre cas, cela signifie qu'au lieu de passer
INSTALLLOCATION='C:\Program Files\MongoDB\Server\3.4\' , vous devez passer INSTALLLOCATION='"C:\Program Files\MongoDB\Server\3.4\\"'

Notez le "..." intégré et le supplément \ à la fin du chemin pour s'assurer que \" seul n'est pas confondu avec un évadé " par msiexec (bien que cela puisse fonctionner sans le \ supplémentaire aussi).

Pour tout mettre ensemble :

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'

Mise en garde :

  • Cette technique de citation intégrée rs'appuie sur des données de longue date, mais cassées Comportement PowerShell - voir cette réponse ; si jamais elle devait être réparée, la technique cesserait de fonctionner; en revanche, le
    --% l'approche illustrée ci-dessous continuera de fonctionner.

  • Une méthode sans solution de contournement et à l'épreuve du temps consiste à utiliser le PSv3+ ie fonction d'assistance du Native modules (dans PSv5+, installez avec Install-Module Native de la Galerie PowerShell ), qui compense en interne tout comportement défectueux et permet de passer des arguments comme prévu ; c'est-à-dire en ajoutant simplement ie à votre commande d'origine serait suffisant :

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

L'alternative est de s'en tenir à la citation originale et d'utiliser --% , le symbole d'arrêt d'analyse , mais notez que cela signifie que vous ne pouvez pas utiliser de variables PowerShell dans tous les arguments suivants :

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'

Notez que msiexec , bien qu'ayant une CLI (interface de ligne de commande), est une GUI -application du sous-système, donc elle s'exécute de manière asynchrone par défaut; si vous voulez l'exécuter de manière synchrone , utilisez
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.

Notez que la chaîne de la liste d'arguments, $msiArgs , est utilisé tel quel par Start-Process dans le cadre de la ligne de commande utilisée pour appeler le programme cible (msiexec ), ce qui signifie :

  • seulement (incorporé) guillemets doubles doit être utilisé.

    • utilisez "..." avec " intégré échappé comme `" pour incorporer des variables et des expressions PowerShell dans la chaîne.
  • à l'inverse, cependant, aucune solution de contournement pour les arguments partiellement cités n'est nécessaire.

Même si Start-Process prend techniquement en charge la transmission des arguments individuellement , en tant que tableau , il vaut mieux éviter cela en raison d'un bogue de longue date - voir GitHub issue #5576 .