Il existe des méthodes qui évitent ^
les séquences d'échappement.
Vous pourriez utiliser des variables à expansion différée. Voici une démonstration d'un petit lot de script.
@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 méthodes fonctionnent est que l'expansion retardée et l'expansion de la variable FOR se produisent après des opérateurs spéciaux tels que <
, >
, &
, |
, &&
, ||
sont analysés. Voir Comment l'interpréteur de commandes Windows (CMD.EXE) analyse-t-il les scripts ? pour plus d'informations.
sin3.14 signale que les tuyaux peuvent nécessiter des échappatoires multiples . Par exemple :
echo ^^^<html^^^>|findstr .
La raison pour laquelle les tuyaux nécessitent plusieurs échappatoires est que chaque côté du tuyau 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 pipé ? pour une explication des nombreuses conséquences gênantes de l'implémentation des tuyaux dans Windows.
Il existe une autre méthode pour éviter les échappatoires multiples lors de l'utilisation de tuyaux. Vous pouvez instancier explicitement votre propre processus CMD, et protéger l'échappement unique avec des guillemets :
cmd /c "echo ^<html^>"|findstr .
Si vous voulez utiliser la technique d'expansion retardée pour éviter les échappements, alors 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 de MicroSoft qui explique ces choses)
Rappelez-vous que chaque côté du tuyau est exécuté dans son propre processus CMD.EXE, mais le processus ne fait pas no héritent de l'état d'expansion retardée - il est désactivé par défaut. Vous devez donc instancier explicitement votre propre processus CMD.EXE et utiliser l'option /V:ON pour activer l'expansion différé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 lot parent script.
Mais l'enfer se déchaîne si l'expansion différée est activée dans le script parent. Ce qui suit fait no travail :
@echo off
setlocal enableDelayedExpansion
set "line=<html>"
REM - the following command fails
cmd /v:on /c echo !test!|findstr .
Le problème est que !test!
est développé dans le script parent, donc le nouveau processus CMD essaye d'analyser des données non protégées. <
y >
.
Vous pourriez échapper à la !
mais cela peut s'avérer délicat, car cela dépend de l'existence ou non d'un lien entre l'utilisateur et l'entreprise. !
est cité ou non.
S'il n'est pas cité, un double échappement est nécessaire :
@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 permet d'éviter tous les échappements - en enfermant le côté gauche du tuyau, on 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 cela n'est pas gratuit, car l'analyseur syntaxique par lots introduit un espace supplémentaire (peut-être indésirable) à la fin lorsque des parenthèses sont utilisées.
C'est amusant, le scripting par lot ;-)
6 votes
Les citations seront également répercutées.