Comment échapper correctement les guillemets dans la -param
valeur dans la ligne de commande suivante?
$cmd="\\server\toto.exe -batch=B -param="sort1;parmtxt='Security ID=1234'""
Invoke-Expression $cmd
Cela échoue bien sûr. J'ai essayé d'échapper aux guillemets (simples et doubles) en utilisant le caractère d'échappement `et j'ai fait diverses combinaisons, mais rien ne fonctionne.
powershell-2.0
eetawil
la source
la source
$someCommandStringWithDoubleQuotes | cmd
. Cela fonctionne en fait à partir de scripts PowerShell (par exemple en invoquant CMake (qui nécessite les guillemets doubles (sinon, il échouera silencieusement))). Une alternative à CMD est bash.exe ( MinGW ) - mais il peut être très, très lent à démarrer dans certaines circonstances.Réponses:
Échapper à de tels paramètres est généralement source de frustration et ressemble beaucoup à un temps perdu. Je vois que vous êtes sur la v2 donc je suggérerais d'utiliser une technique que Joel "Jaykul" Bennet a bloguée il y a quelque temps .
Pour faire court: vous enroulez simplement votre chaîne avec @ '...' @:
(Notez que j'ai supposé quels guillemets sont nécessaires et quelles choses vous tentiez d'échapper.) Si vous voulez travailler avec la sortie, vous pouvez ajouter le
-NoNewWindow
commutateur.BTW: c'était un problème si important que depuis la v3, vous pouvez utiliser
--%
pour empêcher l'analyseur PowerShell de faire quoi que ce soit avec vos paramètres:... devrait bien fonctionner là-bas (avec la même hypothèse).
la source
@"
et à la"@
place.L'utilisation du backtick (`) fonctionne très bien pour moi si je les place aux endroits suivants:
$cmd
retourne comme:C'est ce que tu cherchais?
L'erreur que PowerShell m'a donnée faisait référence à un jeton inattendu `` sort1 '', et c'est ainsi que j'ai déterminé où placer les backticks.
La syntaxe @ '...' @ s'appelle une "chaîne ici" et retournera exactement ce qui est entré. Vous pouvez également les utiliser pour renseigner des variables de la manière suivante:
Les symboles d'ouverture et de fermeture doivent figurer sur leur propre ligne, comme indiqué ci-dessus.
la source
Invoke-Expression
les guillemets doubles du$cmd
moment où il est appelé? Ou comment avez-vous utilisé$cmd
sans utiliserInvoke-Expression
?Je me suis retrouvé dans une situation similaire aujourd'hui en essayant d'exécuter une commande via un module Node.js:
J'utilisais PowerShell et j'essayais d'exécuter:
Mais avec les symboles supplémentaires, PowerShell manipulait les arguments. Pour corriger, je coche en arrière les guillemets doubles échappés:
la source
"['`"][^'`"]['`"]"
fonctionne… mais'[`'"][^`'"][`'"]'
pas! me rendait fou