Es gibt Methoden, die ^
Escape-Sequenzen vermeiden .
Sie können Variablen mit verzögerter Erweiterung verwenden. Unten finden Sie eine Demonstration eines kleinen Batch-Skripts
@echo off
setlocal enableDelayedExpansion
set "line=<html>"
echo !line!
Oder Sie könnten eine FOR / F-Schleife verwenden. Über die Befehlszeile:
for /f "delims=" %A in ("<html>") do @echo %~A
Oder aus einem Batch-Skript:
@echo off
for /f "delims=" %%A in ("<html>") do echo %%~A
Der Grund , warum diese Methoden arbeiten, weil beide verzögerten Expansion und für variable Expansion tritt nach speziellen Operatoren wie <
, >
, &
, |
, &&
, ||
analysiert werden. Siehe Wie analysiert der Windows Command Interpreter (CMD.EXE) Skripts? Für mehr Information.
sin3.14 weist darauf hin, dass Rohre möglicherweise mehrere Fluchtwege erfordern . Beispielsweise:
echo ^^^<html^^^>|findstr .
Der Grund, warum Pipes mehrere Escape-Vorgänge erfordern, liegt darin, dass jede Seite des Pipes in einem neuen CMD-Prozess ausgeführt wird, sodass die Zeile mehrmals analysiert wird. Siehe Warum schlägt die verzögerte Erweiterung fehl, wenn sie sich in einem Pipeline-Codeblock befindet? für eine Erklärung vieler unangenehmer Konsequenzen der Rohrimplementierung von Window.
Es gibt eine andere Methode, um mehrfache Fluchtwege bei der Verwendung von Rohren zu vermeiden. Sie können Ihren eigenen CMD-Prozess explizit instanziieren und das einzelne Escape mit Anführungszeichen schützen:
cmd /c "echo ^<html^>"|findstr .
Wenn Sie die Technik der verzögerten Erweiterung verwenden möchten, um Fluchtwege zu vermeiden, gibt es noch mehr Überraschungen (Sie werden vielleicht nicht überrascht sein, wenn Sie ein Experte für das Design von CMD.EXE sind, aber es gibt keine offizielle MicroSoft-Dokumentation, die dieses Zeug erklärt).
Denken Sie daran, dass jede Seite der Pipe in einem eigenen CMD.EXE-Prozess ausgeführt wird, der Prozess jedoch den verzögerten Expansionsstatus nicht erbt - standardmäßig ist AUS. Sie müssen daher Ihren eigenen CMD.EXE-Prozess explizit instanziieren und die Option / V: ON verwenden, um die verzögerte Erweiterung zu aktivieren.
@echo off
setlocal disableDelayedExpansion
set "line=<html>"
cmd /v:on /c echo !test!|findstr .
Beachten Sie, dass die verzögerte Erweiterung im übergeordneten Batch-Skript deaktiviert ist.
Aber die Hölle bricht los, wenn die verzögerte Erweiterung im übergeordneten Skript aktiviert ist. Folgendes funktioniert nicht :
@echo off
setlocal enableDelayedExpansion
set "line=<html>"
REM - the following command fails
cmd /v:on /c echo !test!|findstr .
Das Problem ist, dass !test!
es im übergeordneten Skript erweitert wird, sodass der neue CMD-Prozess versucht, ungeschützt <
und zu analysieren >
.
Sie könnten dem entkommen !
, aber das kann schwierig werden, weil es davon abhängt, ob das !
zitiert wird oder nicht.
Wenn nicht angegeben, ist eine doppelte Flucht erforderlich:
@echo off
setlocal enableDelayedExpansion
set "line=<html>"
cmd /v:on /c echo ^^!test^^!|findstr .
Wenn zitiert, wird eine einzelne Flucht verwendet:
@echo off
setlocal enableDelayedExpansion
set "line=<html>"
cmd /v:on /c "echo ^!test^!"|findstr .
Es gibt jedoch einen überraschenden Trick, der alle Escapezeichen vermeidet: Das Einschließen der linken Seite der Pipe verhindert, dass das übergeordnete Skript !test!
vorzeitig erweitert wird :
@echo off
setlocal enableDelayedExpansion
set "line=<html>"
(cmd /v:on /c echo !test!)|findstr .
Aber ich nehme an, auch das ist kein kostenloses Mittagessen, da der Batch-Parser am Ende einen zusätzlichen (möglicherweise unerwünschten) Speicherplatz einfügt, wenn Klammern verwendet werden.
Kein Batch-Scripting-Spaß ;-)