Ich muss eine Zeichenfolge mit spitzen Klammern (<und>) in eine Datei auf einem Windows-Computer übertragen. Grundsätzlich möchte ich Folgendes tun:
echo some string < with angle > brackets >>myfile.txt
Dies funktioniert nicht, da der Befehlsinterpreter mit den spitzen Klammern verwechselt wird. Ich könnte die ganze Zeichenfolge so zitieren:
echo "some string < with angle > brackets" >>myfile.txt
Aber dann habe ich doppelte Anführungszeichen in meiner Datei, die ich nicht möchte.
Das Entkommen der Klammern unter Unix funktioniert auch nicht:
echo some string \< with angle \> brackets >>myfile.txt
Ideen?
Antworten:
Das Windows-Escapezeichen ist aus irgendeinem Grund ^.
quelle
echo some string ^< with angle ^> brackets >>con
Ergebnisse in: einige Zeichenfolge <mit Winkel> KlammernDer offizielle Fluchtcharakter ist zwar
^
, aber seien Sie vorsichtig, denn manchmal benötigen Sie drei^
Charaktere. Das ist nur manchmal :Ein Trick aus diesem Unsinn besteht darin, einen anderen Befehl als
echo
die Ausgabe und das Anführungszeichen mit doppelten Anführungszeichen zu verwenden:Beachten Sie, dass dadurch keine führenden Leerzeichen im Eingabeaufforderungstext erhalten bleiben.
quelle
^^^
werden auch benötigt, um Befehle in der Azure DOS / Kudu-Konsole zu umgehen.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
Oder Sie könnten eine FOR / F-Schleife verwenden. Über die Befehlszeile:
Oder aus einem Batch-Skript:
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:
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:
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.
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 :
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:
Wenn zitiert, wird eine einzelne Flucht verwendet:
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 :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ß ;-)
quelle
Um Sonderzeichen wie '>' unter Windows mit Echo zu verwenden, müssen Sie ein spezielles Escape-Zeichen davor platzieren.
Zum Beispiel
wird nicht funktionieren, da '>' durch '^' maskiert werden muss:
Siehe auch Escape-Sequenzen .
Es gibt eine kurze Batch-Datei, die einen grundlegenden Satz von Sonderzeichen und deren Escape-Sequenzen druckt.
quelle
Der Backslash würde als Beginn eines absoluten Pfadnamens betrachtet.
quelle
echo \
funktioniert zum Beispiel wie erwartet. - Aber ja, das "\" wäre eine schlechte Wahl für ein Befehlszeilen-Escapezeichen, da jeder Befehl / jedes Programm, das einen Pfad oder Dateinamen benötigt, stattdessen "\" eingeben müsste.Sie können auch doppelte Anführungszeichen verwenden, um Sonderzeichen zu umgehen ...
quelle
echo some string "<" with angle ">" brackets >>con
führt zu: einigen Zeichenfolgen "<" mit Winkel ">" Klammern, aber das OP möchte einige Zeichenfolgen <mit Winkel> Klammern