J'ai besoin de faire écho à une chaîne contenant des crochets angulaires (<et>) dans un fichier sur une machine Windows. En gros, ce que je veux faire est ce qui suit:
echo some string < with angle > brackets >>myfile.txt
Cela ne fonctionne pas car l'interpréteur de commandes est confondu avec les crochets angulaires. Je pourrais citer toute la chaîne comme ceci:
echo "some string < with angle > brackets" >>myfile.txt
Mais ensuite, j'ai des guillemets doubles dans mon fichier que je ne veux pas.
Échapper les crochets ala unix ne fonctionne pas non plus:
echo some string \< with angle \> brackets >>myfile.txt
Des idées?
Réponses:
Le caractère d'échappement de Windows est ^, pour une raison quelconque.
la source
echo some string ^< with angle ^> brackets >>con
résultats dans: une chaîne <avec angle> crochetsCertes, le caractère d'échappement officiel l'est
^
, mais soyez prudent car parfois vous avez besoin de trois^
personnages. C'est juste parfois :Une astuce pour sortir de ce non-sens consiste à utiliser une commande autre que
echo
de faire la sortie et de citer entre guillemets:Notez que cela ne conservera pas les espaces de début sur le texte de l'invite.
la source
^^^
sont également nécessaires pour échapper aux commandes dans la console Azure DOS / Kudu.Il existe des méthodes qui évitent les
^
séquences d'échappement.Vous pouvez utiliser des variables avec une expansion retardée. Voici une petite démonstration de script batch
Ou vous pouvez utiliser une boucle FOR / F. Depuis la ligne de commande:
Ou à partir d'un script batch:
La raison pour laquelle ces travaux de méthodes est à la fois parce que l' expansion retardée et d'expansion variables se produisent après les opérateurs spéciaux comme
<
,>
,&
,|
,&&
,||
sont analysés. Consultez Comment l'interpréteur de commandes Windows (CMD.EXE) analyse-t-il les scripts? pour plus d'informations.sin3.14 souligne que les tuyaux peuvent nécessiter plusieurs échappements . Par exemple:
La raison pour laquelle les tubes nécessitent plusieurs échappements est que chaque côté du tube est exécuté dans un nouveau processus CMD, de sorte que la ligne est analysée plusieurs fois. Voir Pourquoi l'expansion retardée échoue-t-elle à l'intérieur d'un bloc de code canalisé? pour une explication des nombreuses conséquences gênantes de l'implémentation du pipe de Window.
Il existe une autre méthode pour éviter les échappements multiples lors de l'utilisation de tuyaux. Vous pouvez explicitement instancier votre propre processus CMD et protéger l'échappement simple avec des guillemets:
Si vous souhaitez utiliser la technique d'expansion retardée pour éviter les échappées, il y a encore plus de surprises (vous ne serez peut-être pas surpris si vous êtes un expert de la conception de CMD.EXE, mais il n'y a pas de documentation officielle MicroSoft qui explique cela)
N'oubliez pas que chaque côté du tube est exécuté dans son propre processus CMD.EXE, mais que le processus n'hérite pas de l'état d'expansion retardé - il est par défaut sur OFF. Vous devez donc explicitement instancier votre propre processus CMD.EXE et utiliser l'option / V: ON pour activer l'expansion retardée.
Notez que l'expansion retardée est désactivée dans le script de lot parent.
Mais tout l'enfer se déchaîne si l'expansion retardée est activée dans le script parent. Ce qui suit ne fonctionne pas :
Le problème est qu'il
!test!
est développé dans le script parent, de sorte que le nouveau processus CMD essaie d'analyser les fichiers non protégés<
et>
.Vous pouvez échapper à
!
, mais cela peut devenir délicat, car cela dépend du fait que le!
est cité ou non.S'il n'est pas indiqué, un double échappement est requis:
S'il est cité, un seul échappement est utilisé:
Mais il existe une astuce surprenante qui évite toutes les échappements - enfermer le côté gauche du tube empêche le script parent de se développer
!test!
prématurément:Mais je suppose que même ce n'est pas un déjeuner gratuit, car l'analyseur de lots introduit un espace supplémentaire (peut-être indésirable) à la fin lorsque des parenthèses sont utilisées.
N'est pas amusant de script par lots ;-)
la source
Pour utiliser des caractères spéciaux, tels que «>» sous Windows avec écho, vous devez placer un caractère d'échappement spécial devant lui.
Par exemple
ne fonctionnera pas car '>' doit être échappé par '^':
Voir aussi les séquences d'échappement .
Il existe un petit fichier batch, qui imprime un jeu de base de caractères spéciaux et leurs séquences d'échappement.
la source
La barre oblique inverse serait considérée comme le début d'un chemin absolu.
la source
echo \
par exemple fonctionne comme prévu. - Mais oui, le "\" serait un mauvais choix pour un caractère d'échappement de ligne de commande car chaque commande / programme nécessitant un chemin ou un nom de fichier devrait taper "\" à la place.Vous pouvez également utiliser des guillemets doubles pour échapper les caractères spéciaux ...
la source
echo some string "<" with angle ">" brackets >>con
résultats dans: des crochets de chaîne "<" avec angle ">" mais l'OP veut des crochets de chaîne <avec angle>