1. はじめに
- Windowsのバッチファイルで不要なフォルダ、ファイルを削除したい
- 一定期間更新していないフォルダ、ファイルを対象にしたい
2. 開発環境
- Windows 11
3. forfilesコマンド
3.1. ファイル削除
- 指定したフォルダ内で、更新日付が14日以上経過したファイルを削除する(サブディレクトリ内を含む)
forfiles /P "C:\hogehoge" /S /M *.* /C "cmd /c if @isdir==FALSE del @path" /D -14
3.2. フォルダ削除
- 指定したフォルダ内で、更新日付が14日以上経過したフォルダを削除する(サブディレクトリ内を含む)
forfiles /P "C:\hogehoge" /S /C "cmd /c if @isdir==TRUE rmdir /q @path" 2>&1 /D -14
3.3. ヘルプ
forfiles /?
FORFILES [/P パス名] [/M 検索マスク] [/S]
[/C コマンド] [/D [+ | -] {yyyy/MM/dd | dd}]
説明:
ファイル (または、ファイルのセット) を選んで、そのファイル上のコマンドを実行します。これはバッチ ジョブの使用に便利です。
パラメーター一覧:
/P パス名 検索を開始するパスを示します。既定のフォルダーは現在実行中のディレクトリ (.) です。
/M 検索マスク 検索マスクによってファイルを検索します。既定の検索マスクは '*' です。
/S サブディレクトリに対しても処理を行うように forfiles に指示します (例: "DIR /S")。
/C コマンド 各ファイルの実行するコマンドを示します。コマンドの文字列は二重引用符で囲んでください。
既定のコマンドは "cmd /c echo @file" です。
次の変数をコマンドの文字列に使用することができます:
@file - フィルの名前を返します。
@fname - 拡張子なしのファイル名を返します。
@ext - ファイルの拡張子だけを返します。
@path - ファイルの完全なパスを返します。
@relpath - ファイルの相対パスを返します。
@isdir - ファイルの種類がディレクトリの場合は "TRUE"を、ファイルの場合は"FALSE" を返します。
@fsize - ファイルのサイズをバイトで返します。
@fdate - ファイルの最終更新日を返します。
@ftime - ファイルの最終更新時刻を返します。
コマンド ラインに特殊文字を使用する場合は、文字を 16 進数コードで 0xHH 形式で (例:タブは 0x09) 指定してください。
CMD.EXE の内部コマンドの前には "cmd /c" が必要です。
/D 日付 最終更新日が指定された日かもしくはそれ以降 (+)、または指定された日またはそれ以前 (-) であるファイルを "yyyy/MM/dd" 形式を使って選択します。
または、最終更新日が現在の日にちより "dd" 日あと、もしくは "dd" 日前であるファイルを選択します。
有効な "dd"値は 0 から 32768 の間です。
指定がない場合は、"+" が既定で使用されます。
/? ヘルプまたは使用法を表示します。
例:
FORFILES /?
FORFILES
FORFILES /P C:\WINDOWS /S /M DNS*.*
FORFILES /S /M *.txt /C "cmd /c type @file | more"
FORFILES /P C:\ /S /M *.bat
FORFILES /D -30 /M *.exe
/C "cmd /c echo @path 0x09 was changed 30 days ago"
FORFILES /D 2001/01/01
/C "cmd /c echo @fname is new since Jan 1st 2001"
FORFILES /D +2025/5/15 /C "cmd /c echo @fname is new today"
FORFILES /M *.exe /D +1
FORFILES /S /M *.doc /C "cmd /c echo @fsize"
FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"
4. サンプルプログラム
@echo off
rem 対象パス名
set PATH=C:\hogehoge
rem 日付
set DAYS=-14
rem フォルダ内フォルダ、ファイル削除
forfiles /P "%PATH%" /S /M *.* /C "cmd /c if @isdir==FALSE del @path" /D %DAYS%
forfiles /P "%PATH%" /S /C "cmd /c if @isdir==TRUE rmdir /q @path" 2>&1 /D %DAYS%
rem 処理終了
exit
5. 参考文献