ファイル、サブフォルダ削除
コマンド
@echo off
set targetFolder=C:\batwork\data\
set num=-7
rem 指定したフォルダとそのサブフォルダ内のすべてのファイルに対して、更新日付が7日以前のものを削除
forfiles /p "%targetFolder%" /s /m * /d %num% /c "cmd /c if @isdir=FALSE del @path"
rem サブフォルダを削除
forfiles /p "%targetFolder%" /s /d %num% /c "cmd /c if @isdir==TRUE rmdir /s /q @path" 2>&1
set ret=%errorlevel%
echo %ret%
exit /b %ret%
プリフィックス
forfiles
コマンドで使用される @
プリフィックスは、コマンド内で特定の変数やプロパティにアクセスするためのプレースホルダとして機能します。
-
@file
: 現在処理中のファイルの名前です。 -
@fname
: ファイルの名前部分(拡張子を含まない)です。 -
@ext
: ファイルの拡張子です。 -
@path
: ファイルのフルパスです。 -
@relpath
: ファイルの相対パスです。 -
@isdir
: 対象がディレクトリ(フォルダ)である場合にTRUE
、それ以外の場合にFALSE
です。 -
@fsize
: ファイルサイズです。 -
@fdate
: ファイルの最終更新日です。 -
@ftime
: ファイルの最終更新時刻です。
これらの変数やプロパティは、forfiles
コマンド内で使用して、ファイルやディレクトリの情報にアクセスします。例えば、更新日付が一定期間よりも古いファイルを削除するスクリプトなどでよく使われます。
オプション
/p "%targetFolder%": 操作を行う対象のフォルダを指定します。
/s: サブディレクトリ内も含めて処理します。
/m *: すべてのファイルを対象にします。
/d -7: 更新日付が7日以前のものを選択します。
/c "cmd /c if @isdir
==FALSE del @path
": 選択された各ファイルに対して実行するコマンドを指定します。
ネットワークパスの回避について
forfiles コマンドは、UNCパス(ネットワーク上のファイルパス)をサポートしていない??
回避策としてpushd コマンドを使用してディレクトリに移動すると、ネットワークパスがローカルドライブの一時的な割り当てに変更されます。最後に、popd コマンドを使用して元のディレクトリに戻ります。
@echo off
set "uncPath=\\server\share\path"
pushd "%uncPath%"
forfiles /s /d -7 /c "cmd /c echo @path"
popd