web-dev-qa-db-ja.com

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

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

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

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

111
Marco Demaio
FOR /r %%X IN (*) DO (ECHO %%X & DEL %%X)
105
SilverSkin

&の使用は短いコマンドには適していますが、その1行は非常に速く非常に長くなる可能性があります。その場合は、複数行の構文に切り替えてください。

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

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

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

187
Anders

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
30
bk1e