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 passerINSTALLLOCATION='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 duNative
modules (dans PSv5+, installez avecInstall-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 simplementie
à 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 , utilisezStart-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.
- utilisez
-
à 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
.