このwindowsコマンドの動作:echo%path:; =&echo。%


回答:


22

それは私が今まで見たことのない興味深いソリューションです。説明しよう:

  1. パス全体を印刷するには、を使用しますecho %path%。これにより、セミコロン(;)で区切られた1行にすべてのディレクトリが出力されます
  2. 変数内の文字列を検索/置換するには、%path:a=b%これを使用して、すべてのa文字をb
  3. echo. 改行を印刷するために使用されます
  4. &コマンドを分離するために使用されます。たとえば、echo line1&echo line22行を出力します
  5. 実際には、パス内のセミコロンは改行を印刷するコマンドに置き換えられます。それとも、それを「交換するように解釈されて;何もして、その後、改行を印刷します」。私はこれに関する文書を見つけることができないので、それは単なる私の解釈です。率直に言って、私はそれが可能であることすら知りませんでしたが、そこに行きます。更新このステップの私の解釈は外れているようで、wizzwizz4でよりよく説明されています

%%記号は何に使用されますecho pathか?%%は変数に使用されますか?
-yekanchi

1
はい、それは正しいです。これらは変数の値を取得するために使用されます。例えば:set greeting=Hello、その後echo %greeting%。紛らわしいことに、PATHコマンドと変数の両方であるため、コマンドを入力するpathecho %path%、同じ結果になります。
Berend

この構文は何と呼ばれていますか?正規表現ですか?またはWindows CMDでのみ使用されるもの
yekanchi

この名前があるかどうかはわかりませんが、DOSで変数が機能する方法にすぎません。たとえば、bashなどの他の言語が使用$PATHします。
Berend

2
これはDOS、Berendとは関係ありません。echo.「改行を印刷するコマンド」ではありません。これは、Windows NT用のMicrosoftのコマンドインタープリターですcmd。およびは、echo.単にパス要素を印刷するコマンドであり、パス要素が空の場合、他の機能に切り替わらないようにしますecho。最初もecho本当にする必要がありecho.ます。
JdeBP

30

これは、コマンドライン変数置換を使用しています。%path:;=&echo.%は、「を意味します%path%が、すべて;のを&echo.」に置き換えます これは、次のことを意味しset path=C:\Windows\System32;C:\Windows\;;C:\Python37;ます。

echo %path:;=&echo.%

になる:

echo C:\Windows\System32&echo.C:\Windows\&echo.&echo.C:\Python37&echo.

以来、&コマンドの区切りであり、これは、と等価です。

echo C:\Windows\System32
echo.C:\Windows\
echo.
echo.C:\Python37
echo.

DOS Batchの癖のため、その後に何もない場合echo.echo 除いて同一です。その場合、ECHOオンかオフかを知らせるのではなく、単に何も出力しません。これにより、出力が作成されます。

C:\Users\wizzwizz4> echo %path:;&echo.%
C:\Windows\System32
C:\Windows\

C:\Python37

C:\Users\wizzwizz4> 

本当に、echo.%path:;=&echo.%%PATH%始まる場合を考慮する必要がありますが、;とにかくこのコマンドはかなり賢いです。


詳細なデータを取得するには、実際にの echo(代わりに使用する必要がありecho.ます。これはecho.、というファイルを取得したときに問題が発生する可能性があるためです。また、実行するたびにechoディスク(%CD%およびすべてのディスクも%PATH%)をチェックする必要があるため、時間がかかります。(;それだけで私はそれを自分でチェックすることはできませんので、私は、Windowsのコピーを持っていない%CD%、あるいはどこか%PATH%の存在というechoファイルが影響を与えますecho.、そして、それは何でしょうか?)


これは、複数のオペレーティングシステムにわたるMicrosoft / IBMコマンドインタープリターの長年の動作であり、バッチスクリプトに固有のものではありません。私が指摘したようにsuperuser.com/a/310157/38062年前に、いくつかの句読点文字は、コマンド名の終端文字として空白その数に加えてあります。
JdeBP

@JdeBPより効率的なものの1つはであると思いますがecho)、私は本当に覚えていません。;-(
wizzwizz4

3
echo.何年も前に人々が最もよく使っていたものです。それは多くの本の1つです。効率は問題ではありません。さまざまなファイルが存在する場合の奇抜な動作は次のとおりです。cmdOS / 2で16ビットの32ビットの置換を書いたとき、これらの句読点でコマンド名を壊し、この非常に不規則な解析動作は、意図的に複製しなかったものの1つであり、違いのリスト。echodot代わりに外部コマンドを作成しましたecho.。必要に応じてエイリアスを作成できます。
JdeBP

@JdeBPそれは本当に面白いですね!そのいくつかを文書化できると思いますか?
wizzwizz4

さまざまなコメントリンクをたどると、サードパーティフォーラムのメッセージが鳴り、それecho(が唯一の安全なバージョンになります。
ニール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.