WindowsバッチファイルでsingleFOR
ループで複数のコマンドを呼び出すことは可能ですか?たとえば、ファイル名を印刷し、削除した後にしたいとしましょう:
@ECHO OFF
FOR /r %%X IN (*.txt) DO (ECHO %%X DEL %%X)
REM the line above is invalid syntax.
この場合、名前を表示するためとファイルを削除するための2つの異なるFORループを実行することで解決できることを知っていますが、1つのループでのみ実行できますか?
FOR /r %%X IN (*) DO (ECHO %%X & DEL %%X)
&
の使用は短いコマンドには適していますが、その1行は非常に速く非常に長くなる可能性があります。その場合は、複数行の構文に切り替えてください。
FOR /r %%X IN (*.txt) DO (
ECHO %%X
DEL %%X
)
(
と)
の配置は重要です。 DO
の後の丸括弧は同じ行に配置する必要があります。そうしないと、バッチファイルが正しくなくなります。
詳細については、if /?|find /V ""
を参照してください。
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