Comment éviter cmd.exe l'interprétation du shell caractères spéciaux comme < > ^
J'ai un Windows CMD script qui accepte un certain nombre de paramètres et exécute un fichier EXE, en passant tout d'abord, quelques codée en dur arguments et ensuite tous les paramètres de l'utilisateur. La commande de script ressemble à ceci:
launcher.exe paramX paramY %*
L'utilisateur à l'exécution de la commande de script à partir du shell Windows comme suit:
launcher.cmd param1 param2 param3 [...]
Le problème que j'ai, c'est que si les paramètres de la commande de script contenir des caractères spéciaux du shell comme <
>
et ^
, l'utilisateur est obligé d'échapper à ces précédents chacun avec 3 caret ^
shell caractères d'échappement.
Deux Exemples
1) Pour faire passer l'argument ten>one
à l'EXE, l'utilisateur doit lancer la commande comme suit:
launcher.cmd ten^^^>one
La raison pour cela est que le shell caractères spéciaux ^
et >
sont interprétés par le shell de commande à deux niveaux, d'abord sur la ligne de commande et le deuxième à l'intérieur de la CMD script. Ainsi, la coque s'échapper avec l'accent circonflexe ^
shell caractère d'échappement doit être appliqué deux fois. Le problème, c'est que ce n'est pas évidente pour l'utilisateur et semble laid.
Pour cet exemple, une meilleure solution consiste à entourer l'argument avec des guillemets doubles. Toutefois, ce chiffre se décompose pour des exemples plus complexes qui incluent un littéral des guillemets à l'argument.
2) pour passer À l'argument "^
à l'EXE, l'utilisateur doit lancer la commande comme suit:
launcher.cmd "\"^^^^"
Dans mon cas, je souhaite soutenir des arguments qui contiennent tout séquence de faible caractères ASCII, à l'exclusion des caractères de contrôle, c'est à dire les points de code 0x20 à 0x7E. Je comprends qu'il y aura des exemples où l'utilisateur aura pour échapper certains caractères spéciaux du shell avec un accent circonflexe. Cependant, je ne pas souhaitez attribuer à l'utilisateur d'utiliser 3 carets à chaque fois dans ces cas, tout simplement parce qu'ils se trouvent être d'appeler un script CMD au lieu d'un fichier EXE.
Je peux résoudre ce problème en remplaçant la commande de script avec un EXE qui ne le même. Cependant, est-il possible de modifier la commande de script afin qu'il passe ses paramètres grâce à l'EXE sans interpréter les caractères spéciaux du shell?
OriginalL'auteur Paul Urban | 2010-09-28
Vous devez vous connecter pour publier un commentaire.
Une façon est de travailler avec l'expansion retardée à l'intérieur du lot, parce qu'alors les caractères spéciaux perdre là "spécial" significations.
Le seul problème est d'obtenir les paramètres dans une variable.
Quelque chose comme cela pourrait aider à
Maintenant les paramètres peuvent être encadrée par des guillemets, donc il y a les signes ne sont pas nécessaires plus.
Exemple
lanceur.chauve-souris "abc>def&geh%ijk|lmn^opq!"
La seule problématique caractère spécial semble être le guillemet.
[Modifier/Améliorer]
J'ai créer un autre moyen de récupérer un paramètre, je suppose qu'il peut accepter n'importe quelle chaîne également votre deuxième exemple.
Même vraiment dur comme les chaînes
lanceur "^
lanceur de dix^>on
lanceur "&"^&
Comment ça marche?
Le seul moyen que j'ai trouvé pour étendre %1 sans élargir les caractères spéciaux comme " ou ^ est dans une instruction REM (REM qui n'est pas complètement vrai, mais c'est une autre histoire)
Ok, le seul problème est qu'un REM est une remarque et n'a aucun effet 🙂
Mais si vous utilisez écho sur aussi rem lignes sont fait l'écho avant leur exécution (execute pour rem est un mot gentil).
L'autre problème est qu'il s'affiche et vous ne pouvez pas rediriger ce sortie de débogage avec la normale > debug.txt.
Cela est également vrai si vous utilisez une boucle for.
Ok, vous pouvez rediriger le écho sur sortie avec un appel comme
Mais si vous appelez une fonction, vous ne pouvez pas accéder à l' %1 du fichier de commandes plus.
Mais avec une double boucle for, il est possible d'activer la redirection de la sortie de débogage et il est toujours possible d'accéder à %1.
- Je modifier l'invite à "X", donc je sais que c'est toujours seulement un caractère de long.
La seule chose qui reste est d'expliquer pourquoi j'ai ajouter un # %1.
C'est parce que, certains caractères spéciaux sont reconnus dans certaines situations, même dans un REM ligne, évidemment 😉
De sorte que le # supprimer un possible multiligne situation.
Ok, un <FL> peut briser ce code, mais il me semble que les autres personnages sont de travail
Effort fantastique! Je suis en essais, mais il semble que pour l'écho du premier argument que je passe?
C'est parce que j'essaye de montrer comment il fonctionne, et de l'étendre ajouter un peu de rem #%2#<crlf>rem #%3#<crlf>...
OriginalL'auteur jeb
Cela aide:
EscapPipes.Cmd:
Quand commencé ainsi:
donne
Dès que vous dépouiller les citations, les symboles de tuyau deviendra de vivre.
Votre script rend l'utilisation de l'ÉCHO, juste des impressions de ses arguments sans analyse, alors qu'un EXE habituellement analyser les devis et les barres obliques inverses dans le but de fournir un tableau d'arguments pour le code de l'application. Néanmoins, vous trouverez que mon second exemple, les pauses de votre script 🙂
OriginalL'auteur Andy Morris