Windowsコマンドプロンプトのエスケープ山かっこ


93

山かっこ(<および>)を含む文字列をWindowsマシン上のファイルにエコーする必要があります。基本的に私がやりたいことは次のとおりです:
echo some string < with angle > brackets >>myfile.txt

コマンドインタープリターが山括弧と混同されるため、これは機能しません。文字列全体を次のように引用できます:
echo "some string < with angle > brackets" >>myfile.txt

しかし、私は自分のファイルに不要な二重引用符を付けています。

ブラケットala unixをエスケープしても機能しません。
echo some string \< with angle \> brackets >>myfile.txt

アイデア?


6
引用もエコーされます。
dalle

回答:


171

Windowsのエスケープ文字は、何らかの理由で^です。

echo some string ^< with angle ^> brackets >>myfile.txt

10
まあ、バックスラッシュはパス名に使用され、二重引用符はスペースを含むファイル名をラップするため、文字の選択肢が多く残りません。
James Curran

これは、アンパサンド(&)などの他の文字でも機能します。
テンフォー

2
よく働く!echo some string ^< with angle ^> brackets >>con結果:いくつかの文字列<角付き>ブラケット
ロスブラッドバリー

1
すべての理由は、元のpc-dosがパスと下位互換性のためにバックスラッシュを使用したためです。
Jahmic

それはそれほどランダムではなかったと思います。私の推測では、彼らは通常のテキストに表示される可能性が低い文字を使用したかったため、簡単に回避できるが、望ましくない文字エスケープを引き起こさなかったのでしょう。
デビッドA.グレイ

23

確かに、公式のエスケープ文字は^ですが、3 ^文字必要な場合があるので注意してください。これは時々です:

C:\WINDOWS> echo ^<html^>
<html>

C:\WINDOWS> echo ^<html^> | sort
The syntax of the command is incorrect.

C:\WINDOWS> echo ^^^<html^^^> | sort
<html>

C:\WINDOWS> echo ^^^<html^^^>
^<html^>

この無意味なことの1つのトリックechoは、出力を実行して二重引用符で囲む以外のコマンドを使用することです。

C:\WINDOWS> set/p _="<html>" <nul
<html>
C:\WINDOWS> set/p _="<html>" <nul | sort
<html>

これはプロンプトテキストの先頭のスペースを保持しないことに注意してください。


1
パイプが複数のエスケープを必要とする理由の説明については、私の回答の 2番目の部分を参照してください。
dbenham 2014

3つ^^^は、Azure DOS / Kuduコンソールでコマンドをエスケープするためにも必要です。
ライオネロ2017

8

^エスケープシーケンスを回避する方法があります。

遅延展開で変数を使用できます。以下は、小さなバッチスクリプトのデモです

@echo off
setlocal enableDelayedExpansion
set "line=<html>"
echo !line!

または、FOR / Fループを使用することもできます。コマンドラインから:

for /f "delims=" %A in ("<html>") do @echo %~A

または、バッチスクリプトから:

@echo off
for /f "delims=" %%A in ("<html>") do echo %%~A

特別なオペレーターが好き後に遅延展開と変数の展開の両方が発生しているため、これらのメソッドの仕事がある理由は<>&|&&||解析されます。Windowsコマンドインタープリター(CMD.EXE)がスクリプトを解析する方法を参照してください詳細については。


sin3.14は、パイプが複数のエスケープを必要とする可能性があることを指摘しています。例えば:

echo ^^^<html^^^>|findstr .

パイプが複数のエスケープを必要とする理由は、パイプの両側が新しいCMDプロセスで実行されるため、行が複数回解析されるためです。コードのパイプブロック内で遅延拡張が失敗する理由を参照してくださいウィンドウのパイプ実装の多くの厄介な結果の説明。

パイプを使用するときに複数のエスケープを回避する別の方法があります。独自のCMDプロセスを明示的にインスタンス化し、引用符で単一のエスケープを保護できます。

cmd /c "echo ^<html^>"|findstr .

エスケープを回避するために遅延拡張手法を使用したい場合は、さらに多くの驚きがあります(CMD.EXEの設計の専門家であれば驚くことではないかもしれませんが、このことを説明する公式のMicroSoftのドキュメントはありません)。

パイプの各サイドは独自のCMD.EXEプロセスで実行されますが、プロセスは遅延拡張状態を継承しないことに注意してください。デフォルトではオフになっています。したがって、独自のCMD.EXEプロセスを明示的にインスタンス化し、/ V:ONオプションを使用して遅延拡張を有効にする必要があります。

@echo off
setlocal disableDelayedExpansion
set "line=<html>"
cmd /v:on /c echo !test!|findstr .

親バッチスクリプトでは遅延拡張がオフになっていることに注意してください。

しかし、親スクリプトで遅延拡張が有効になっている場合、すべての地獄が壊れます。以下は機能しませ

@echo off
setlocal enableDelayedExpansion
set "line=<html>"
REM - the following command fails
cmd /v:on /c echo !test!|findstr .

問題は!test!、親スクリプトで展開されているため、新しいCMDプロセスが保護されていない<とを解析しようとしていること>です。

をエスケープすることもできますが!!が引用されているかどうかに依存するため、注意が必要です。

引用されていない場合は、二重のエスケープが必要です。

@echo off
setlocal enableDelayedExpansion
set "line=<html>"
cmd /v:on /c echo ^^!test^^!|findstr .

引用されている場合、単一のエスケープが使用されます。

@echo off
setlocal enableDelayedExpansion
set "line=<html>"
cmd /v:on /c "echo ^!test^!"|findstr .

しかし、すべてのエスケープを回避する驚くべきトリックがあります-パイプの左側を囲むことで、親スクリプトが!test!時期尚早に拡張されるのを防ぎます。

@echo off
setlocal enableDelayedExpansion
set "line=<html>"
(cmd /v:on /c echo !test!)|findstr .

ただし、かっこを使用すると、バッチパーサーが最後に余分な(おそらく不要な)スペースを導入するため、それは無料の昼食ではないと思います。

Aint Batch Scripting Fun ;-)


3

Windowsでエコー付きの「>」などの特殊文字を使用するには、その前に特殊なエスケープ文字を配置する必要があります。

例えば

echo A->B

「>」は「^」でエスケープする必要があるため、機能しません。

 echo A-^>B

エスケープシーケンスも参照してください。 ここに画像の説明を入力してください

特殊な文字の基本セットとそのエスケープシーケンスを出力する短いバッチファイルがあります。


0

ブラケットala unixをエスケープしても機能しません。

いくつかの文字列\ <を山括弧\>でエコー>> myfile.txt

バックスラッシュは、絶対パス名の始まりと見なされます。


2
現在のドライブ文字からの絶対パス名...;)
dalle

バックスラッシュは、echoコマンドのテキスト内の絶対パス名の開始とは見なされません。送信する場所にパイプで送られるのはプレーンテキストだけです。- echo \ たとえば、期待どおりに動作します。-しかし、はい。パスまたはファイル名を必要とするすべてのコマンド/プログラムでは、代わりに「\」を入力する必要があるため、「\」はコマンドラインのエスケープ文字としては不適切な選択です。
BrainSlugs83 14

1
この回答は、明らかにあいまいな質問
G-の

-2

二重引用符を使用して特殊文字をエスケープすることもできます...

echo some string "<" with angle ">" brackets >>myfile.txt

4
それは機能しません。echo some string "<" with angle ">" brackets >>con結果:角かっこ ">"の角かっこを含む文字列 "<"が、OPは角かっこ>かっこを含む文字列<を必要とする
Ross Bradbury
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.