12

私はいつもバッチが嫌いでしたが、CやPHP / Perlを好む最も単純なことでも、今でもそうしています。でも今回はそれなしでは行けませんでした、****ため息****。

エコーコマンドを他のコマンドにリダイレクトしたかったのです。例えば:

echo example | more

しかし、パイプのエコー部分で特殊文字を使用できるようにもしたかったのです。

echo & | more

もちろん、どちらも機能しませんでした。だから私は試しました:

echo ^& | more

どちらも機能しませんでした。それから試行錯誤で私は見つけました:

echo ^^^& | more

そしてそれはうまくいった。しかし、興味のあるプログラマーとして、私はなぜだろうと思います。なぜ^&機能し^^^&なかったのですか?

4

2 に答える 2

13

その理由は、Windowsがパイプを実装する方法に関係しています-パイプの各側は、独自のCMDシェルで実行されます。あなたのコマンドecho ^& | moreは実際に実行しようとします

C:\Windows\system32\cmd.exe /S /D /c" echo & "

左側と

C:\Windows\system32\cmd.exe /S /D /c" more "

右側に。左側が失敗する理由がわかります-エスケープされていないものをエコーし​​ようとしてい&ます。エスケープは、実際の左側が実行される前の最初の解析フェーズで消費されました。

ソリューションが機能する理由も簡単にわかります。の左側echo ^^^& | more

C:\Windows\system32\cmd.exe /S /D /c" echo ^& "

Windowsパイプを操作する場合、多くの微妙な問題があります。パイプされたコードブロック内で遅延拡張が失敗するのはなぜですか?を参照してください。詳細については。選択した回答には最良の情報が含まれていますが、質問とすべての回答を読んで、選択した回答のコンテキストを取得することをお勧めします。

于 2012-06-25T17:17:02.437 に答える
4

1つ目は文字自体^をエスケープすること(2つ目)で、3つ目はをエスケープすることです。^^^&

のようなコマンドを実行すると、出力がにパイプされる前にECHO ^& | MORE、がシェルに^&置き換えられます。&MORE

したがって、を実行すると、シェルはwithとwithにECHO ^^^& | MORE置き換えられ、出力がにパイプされます。^^^^&&MORE

于 2012-06-25T17:16:07.017 に答える