Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 1 in /home/r5652521/public_html/soma-engineering.com/wp-content/themes/affinger/functions.php on line 1548
Warning: preg_match(): Compilation failed: unrecognized character follows \ at offset 1 in /home/r5652521/public_html/soma-engineering.com/wp-content/themes/affinger/functions.php on line 1548
こんにちは!SE ブログの相馬です。
今回は、古いファイルを ZIP に圧縮する方法について書いてみました。古いファイルを ZIP に圧縮する運用としてよく作業するのがログファイルかと思います。サーバーやネットワークの運用をしていると、ログファイルがどんどんたまりますよね。ログファイルは大体日時別にたまりますので、一カ月も経てばものすごい量になります。
サーバー上で動いているアプリケーションの機能でログファイルの圧縮の機能があれば良いのですが、無い場合は手動でファイルを指定して ZIP で圧縮という事をするのは骨が折れる作業だと思いますし、時間がもったいないと思います。
ここでは PowerShell を使い、更新日時が指定した日数より前であれば指定のフォルダに ZIP ファイルとして圧縮する事ができますので、説明してゆきたいと思います。
ファイルを ZIP に保存する
ファイルを ZIP に保存するには、Compress-Archive コマンドレットが使えます。
Compress-Archive | Microsoft PowerShell
ここでは、以下の流れで処理をします。
- ログファイルがある C:\temp\log のパスを $purge_dir に代入
- ファイルを削除する指定日数は 3 日前として $retention に代入
- Get-ChildItem コマンドレットで、ログファイルの情報を取得
- Where-Object コマンドレットで、 3 日前より古いファイルの情報を取得
- Get-ChildItem コマンドレットで、該当ファイルを取得
- Compres-Archive コマンドレットで、圧縮ファイルを指定の場所に保管
処理前は C:\temp\log フォルダに以下のようにログファイルがある状態です。
1 2 3 4 5 6 |
$purge_dir = "C:\temp\log" $retention = 3 Get-ChildItem -File $purge_dir | ` Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-$retention)} | ` Get-ChildItem | Compress-Archive -DestinationPath C:\temp\log\archive\test.zip |
処理後には C:\temp\log\archive フォルダに ZIP ファイルが保管されました。
ただし、このスクリプトではエラー処理に対応しておりませんので、try-catch ブロックで書いてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
$purge_dir = "C:\temp\log" $archive_dir = "C:\temp\log\archive" $retention = 3 $zip_file = "C:\temp\log\archive\test.zip" if (Test-Path $zip_file) { throw "zipファイルは既に存在しています。" } if (-Not(Test-Path $archive_dir)) { throw "zipを保存するフォルダは存在していません。" } try { if (Test-Path $purge_dir) { Get-ChildItem -File -Recurse $purge_dir | ` Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-$retention)} | ` Get-ChildItem | Compress-Archive -DestinationPath C:\temp\log\archive\test.zip } else { throw "$purge_dirにあるファイルが見つかりません。" } } catch { Write-Host "$purge_dirに対してエラーが発生しました。" } finally { Write-Host "ZIPが作成されました。" -ForegroundColor green } |
以上となります。いかがでしょうか。
このような形で古いファイルを削除する事が自動化できますと、ログファイル管理やバックアップファイルの管理の自動化など、色々な用途で応用ができるかと思います。
では最後までお読みいただきありがとうございました!