Windowsバッチ:FORループで複数のコマンドを呼び出しますか?


124

Windowsバッチファイルで、単一の FORループで複数のコマンドを呼び出すことは可能ですか?たとえば、ファイル名を印刷して、削除したいとしましょう。

@ECHO OFF
FOR /r %%X IN (*.txt) DO (ECHO %%X DEL %%X)
REM the line above is invalid syntax.

この場合、2つの異なるFORループを実行することで解決できることを知っています。1つは名前を表示するため、もう1つはファイルを削除するためですが、1つのループでのみ実行できますか?

回答:


117
FOR /r %%X IN (*) DO (ECHO %%X & DEL %%X)

2
実はカッコは不要だと思います。for %i in (1 2 3) do echo %i & echo foo「1」、「foo」、「2」、「foo」、「3」、「foo」(別の行に)を出力します。
bk1e 2010

それはそう&&ではあり&ませんか?
jww 2015年

9
@jww &&は、最初のコマンドが失敗&すると失敗し、2番目のコマンドを実行します。
yyny

このソリューションで構文エラーが発生する場合は、DO-parensの間にエスケープされていない括弧があるかどうかを確認してください。あなたはそれらにa ^を追加することでそれらを脱出するかもしれません。
КонстантинВан

199

&短いコマンドでは使用しても問題ありませんが、その1行で非常に長くなることがあります。その場合は、複数行の構文に切り替えてください。

FOR /r %%X IN (*.txt) DO (
    ECHO %%X
    DEL %%X
)

の配置()問題。後の丸括弧DOは同じ行に配置する必要があります。そうしないと、バッチファイルが正しくなくなります。

詳細if /?|find /V ""については、を参照してください。


12
このソリューションはクリーンで読みやすく見えます。また、このソリューションを使用するすべてのプログラマーに、DO次の行の後の丸括弧を配置してはならないことを警告します。そうしないと、バッチファイルにブレーキがかかります。コードでforループを作成するとき、通常は中括弧を{次の行に配置します。
Marco Demaio、2011

2
ああ、bk1eの答え:)参照してください。 -また、あなたのネストされたコマンドのいずれかが、例えば(に「エコー何かの何か(他の何か)」EDITのようなものブラケットを持っている場合は警戒する
ティムBarrass

31

SilverSkinとAndersはどちらも正しいです。括弧を使用して複数のコマンドを実行できます。ただし、コマンド自体(およびそのパラメーター)に括弧が含まれていないことを確認する必要があります。cmdネストされた括弧のセットを適切に処理する代わりに、最初の閉じ括弧を貪欲に検索します。これにより、コマンドラインの残りの部分が解析に失敗したり、括弧の一部がコマンドに渡されたりすることがあります(例:)DEL myfile.txt)

これの回避策は、ループの本体を個別の関数に分割することです。関数本体への「フォールスルー」を回避するために、おそらく関数本体をジャンプする必要があることに注意してください。

FOR /r %%X IN (*.txt) DO CALL :loopbody %%X
REM Don't "fall through" to :loopbody.
GOTO :EOF

:loopbody
ECHO %1
DEL %1
GOTO :EOF

3
このトピックについては、ファイル名を処理するときに%Xが正しくないため、常に「%〜X」を使用してください(この例では、サブ関数で%*を使用しても問題ないでしょう)
Anders

1
それは本当に良い点です。両方の問題を示すパスの良い例はC:\Program Files (x86)です。
bk1e 2010
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.