「Windows で毎日一回ログを出力しているが、一定期間経過したログファイルは削除していきたい・・・」
そういったケースがあると思います。
以前、Windows Server 2003の時は、上記のような削除は標準コマンドでは出来なかったのですが、windows Server 2008になり上記のような処理が出来る標準コマンドが出来ました。
レジュメ
環境・前提条件:
- Windows Server 2008 R2
- Windows Server 2012
- Windows 7
- Windows Server 2019
で、確認しています。
結論、forfilesコマンド!これはバッチジョブに便利です
上記は、古いファイルを検出して、削除コマンドの「del」を実行せずに、echoしたコマンドになります。
上記のように「del」コマンドを実行すれば一定期間が経過した古いファイルを自動で削除するバッチファイルを作成することが出来ます。
/Dオプション、最終更新日が何日以上前のファイルを検索できる!
/D オプションを使用すると、「今日から何日以上前のファイルをターゲットにする」と検索指定することが出来ます。
/Cオプション、コマンドの実行には”cmd /c”をつける
コマンドプロンプトの内部コマンドを実行するには、”cmd /c”が必要です。
例えば、
- forfiles /p e:\log /d -50 /c "echo del @file"
はエラーになりますが - forfiles /p e:\log /d -50 /c "cmd /c echo del @file"
は実行されます。
参考: “cmd /C ” は以降の"文字列" に指定されたコマンドを実行した後、終了します。
【使用例】IISのログファイルの削除(ログローテーション)に便利!
forfiles /p "C:\inetpub\logs\LogFiles" /s /m *.log /c "cmd /c del @path" /d -60
上記は、IISのアクセスログフォルダ「C:\inetpub\logs\LogFiles」のファイルを、
60日より古いファイルを削除するコマンドになります。
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 +2014/9/4 /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"
ヘルプの説明に、自分で「これはバッチ ジョブの使用に便利です」と書いてしまうくらいのコマンドなんです!
憶えといた方が良いですね。