Windowsのforfilesを使ったログのリネーム/削除

概要

  • 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ファイルが失敗せず、正常終了していることが分かります。