Windowsのforfilesを使ったログのリネーム/削除
OperatingSystem,WindowsServer
概要
- 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ファイルが失敗せず、正常終了していることが分かります。
OperatingSystem,WindowsServer
Posted by takaaki