Windowsのforfilesを使ったログのリネーム/削除
Contents
概要
- Windows Server において、Linux のlogrotate コマンドの役割を作ります。
- Windowsのforfiles は、Linux のfind コマンドに近い動作をします。forfiles を使ったbatファイルを作成し、スケジューラーで定期実行させます。
forfilesの使用方法
構文
forfiles [/p <Path>] [/m <SearchMask>] [/s] [/c "<Command>"] [/d [{+|-}][{<Date>|<Days>}]]
ヘルプ
C:\>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 +2019/10/12 /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"
ドキュメント
forfilesを使ったbatファイルの作成
forfilesによるファイルのリネーム
- 以下は、D:\test_log\log_dir配下、更新日時が7日以前のファイル(ファイル名:*.txt)に対して、ファイルをリネームするコマンドです。ファイル名の末尾に"_old" を付加しています。"_old" の代わりに、"_YYYYMMDD" を付加しても良いと思います。
- Linuxであれば、/var/log/messages を messages.0 などにリネームする動作に似ています。
forfiles /P D:\test_log\log_dir /M *.txt /C "cmd /c ren @file @file_old" /D -7
forfilesによるファイルの削除
- 以下は、D:\test_log\log_dir配下、更新日時が30日以前のファイル(ファイル名:*.log*)に対して、ファイルを削除するコマンドです。
- 例えば、IISは日付ごと作成されるログファイルの定期削除に有効です。ログサイズの肥大化を防ぐため、定期的に削除を行います。
forfiles /P D:\test_log\log_dir /M *.log* /C "cmd /c del @path" /D -30
batファイルの実行
- batファイルを実行します。以下は、ファイル削除のbatファイルの実行例です。
- batファイルの実行前です。更新日時が30日以前のログファイルが存在します。

- batファイルの実行後です。更新日時が30日以前のログファイルが削除されました。

タスクスケジューラーによるバッチの定期実行
- 前述のforfilesを使用して、ファイルのリネームや削除をするbatファイルを作成します。
- Windows Serverにて、タスクスケジューラー(taskschd.msc)を起動します。
- タスクスケジューラーより、「操作」の「タスクの作成」を選択します。

- タスクの名前を入力します。
- デイリーでbatファイルを実行させるため、「ユーザーがログオンしているかどうかにかかわらず実行する」をチェックします。
- 管理者権限で実行させるため、「最上位の特権で実行する」をチェックします。

- トリガーを設定します。「毎日」を選択し、実行の開始日時を入力します。

- トリガーの設定を確認します。

- 実行するbatファイルを指定します。

- タスクを実行するユーザーのアカウント情報を入力します。

- 以下はタスクが実行された後のタスクの状態です。前回、batファイルが失敗せず、正常終了していることが分かります。

Posted by takaaki
関連記事
Hello! Oracle Linux
Oracle Linux という選択肢 Oracle Linuxとは Oracl ...
EC2(Windows) Cドライブのサイジングと拡張
概要 はじめに 今回は、EC2 のディスク拡張についてご紹介します。対象のサーバ ...
SSMからEC2 Windowsをsysprepする方法
Windowsにログインせず、SSM(CLI)からsysprepを投げる 概要 ...
Linux ファイル・ディスクリプタ制限のチューニング
概要 Linux オペレーティング・システムでは、ファイル・ディスクリプタという ...
CentOS はyum のsecurityオプション使用不可
症状 CentOS 7 にて、sudo yum list updates --s ...
ディスカッション
コメント一覧
まだ、コメントがありません