PowerShellでログローテーションのスクリプトを作成致しました。
指定の文字列にマッチするファイルかつ特定更新日のファイルが対象となります。
Get-Childitemコマンドで取得した情報で、ローテーションを行います。
例として、ファイル名の先頭がGetで始まるファイルを対象とします。
フォルダ内の状況は、下記となります。
PS C:\> Get-ChildItem c:\test
ディレクトリ: C:\test
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2022/06/21 21:27 LOG
-a---- 2022/06/20 0:00 0 Get1
-a---- 2022/06/20 0:00 0 Get2
-a---- 2022/06/20 0:00 0 Get3
-a---- 2022/06/20 0:00 0 Get4
-a---- 2022/06/20 0:00 0 Get5
-a---- 2022/06/20 23:59 0 Not1
-a---- 2022/06/20 23:59 0 Not2
-a---- 2022/06/20 23:59 0 Not3
-a---- 2022/06/20 23:59 0 Not4
-a---- 2022/06/20 23:59 0 Not5
-a---- 2022/06/21 0:00 0 text11
-a---- 2022/06/21 0:00 0 text12
-a---- 2022/06/19 23:59 0 text13
-a---- 2022/06/19 23:59 0 text14
-a---- 2022/06/19 23:59 0 text15
Where-Objectコマンドで2022/6/20のみの情報を取り出します。
|(パイプ) を使用して、コマンドの出力結果を次のコマンドに送ります。
下記のコマンドを叩くと、今日日付より古いファイル等のみが出力されると思います。
Get-Dateコマンドで今日日付の取得を行っております。
Get-Childitem c:\test | Where-Object {$_.LastWriteTime.Date -lt (Get-Date).Date}
※(Get-Date).AddDays(-1).Dateで前日日付の取得を行う事が出来ます。
実行結果を変数に格納します。
PS C:\> $Source = Get-Childitem c:\test | Where-Object {$_.LastWriteTime.Date -lt (Get-Date).Date -and $_.LastWriteTime.Date -ge (Get-Date).AddDays(-1).Date}
取得した情報から、ファイル名の先頭がGetで始まるファイルの取得をします。
現状は変数の中は、下記のような状態です。
PS C:\> echo $Source
ディレクトリ: C:\test
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2022/06/20 0:00 0 Get1
-a---- 2022/06/20 0:00 0 Get2
-a---- 2022/06/20 0:00 0 Get3
-a---- 2022/06/20 0:00 0 Get4
-a---- 2022/06/20 0:00 0 Get5
-a---- 2022/06/20 23:59 0 Not1
-a---- 2022/06/20 23:59 0 Not2
-a---- 2022/06/20 23:59 0 Not3
-a---- 2022/06/20 23:59 0 Not4
-a---- 2022/06/20 23:59 0 Not5
またまた、Where-Objectコマンドを使用します。下記コマンドを実行すると、ファイル名の先頭がGetで始まるファイルのみが出力されます。
\$Source | Where-Object {$_.Name -match "^Get"}
後は簡単で、Move-Itemコマンドを実行するだけです。
私は最終的には下記スクリプトを作成致しました。
#ファイルの収集先
$Target_Folder = "C:\test"
#ログの保管先
$LOG_Folder = "C:\test\LOG"
#スクリプト実行日の日付
$Now_Time = (Get-Date).Date
#スクリプト実行の1日前
$Before_Time =(Get-Date).AddDays(-1).Date
#スクリプト実行時点から前日までのファイル一覧を取得
$Source = Get-ChildItem $Target_Folder | Where-Object {$_.LastWriteTime.Date -lt $Now_Time -and $_.LastWriteTime.Date -ge $Before_Time}
#特定の文字列を含むファイルの移動
$Source | Where-Object {$_.Name -match "^Get"} | Move-Item -Destination $LOG_Folder
応用が利くと思いますので、参考にして頂ければ幸いでございます。