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
@echo off
setlocal enableDelayedExpansion
set "line=<html>"
echo !line!
Ou vous pouvez utiliser une boucle FOR / F. Depuis la ligne de commande:
for /f "delims=" %A in ("<html>") do @echo %~A
Ou à partir d'un script batch:
@echo off
for /f "delims=" %%A in ("<html>") do echo %%~A
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:
echo ^^^<html^^^>|findstr .
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:
cmd /c "echo ^<html^>"|findstr .
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.
@echo off
setlocal disableDelayedExpansion
set "line=<html>"
cmd /v:on /c echo !test!|findstr .
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 :
@echo off
setlocal enableDelayedExpansion
set "line=<html>"
REM - the following command fails
cmd /v:on /c echo !test!|findstr .
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:
@echo off
setlocal enableDelayedExpansion
set "line=<html>"
cmd /v:on /c echo ^^!test^^!|findstr .
S'il est cité, un seul échappement est utilisé:
@echo off
setlocal enableDelayedExpansion
set "line=<html>"
cmd /v:on /c "echo ^!test^!"|findstr .
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:
@echo off
setlocal enableDelayedExpansion
set "line=<html>"
(cmd /v:on /c echo !test!)|findstr .
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 ;-)