web-dev-qa-db-ja.com

Powershell:1つのスクリプトで古いファイルの複数のフォルダーを「クリーンアップ」

一般的なドロップ/アーカイブディレクトリを一掃するために各サーバーで実行するメンテナンススクリプトを作成したいと思います。スクリプトは、フォルダーパスと必要なエージング制限に参照ファイルを使用するのが望ましいでしょう。次に、スクリプトは、エージング制限より古いファイルのパスをクリーンアップします。入力参照ファイルは次のようになります。

c:\logs\iis\siteA\ 30
c:\logs\job1\ 60
e:\archive\clientA\ 90

最初のコンポーネントはファイルパスです。 2番目は、ファイルを保持する日数で、スペースで区切ります。

スクリプトについては、次のようになります。ただし、私は恥ずかしいほどスクリプトの経験が不足しています。 (私はよりネットワーク指向です)

#Attempted loop
Foreach ($ParentDir = Get-Content .\paths.txt $arg1, $arg2)
{$limit = (Get-Date).AddDays(-$arg2)
$path = $ParentDir

# Delete files older than the $limit.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force}

ロジックは近いように感じますが、構文はオフです。私のアプローチは実行可能ですか?より良い方法はありますか?構文について教えてください。 poweshell v3を使用します。

クレジットは、クレジットが deadlydogthis 投稿から取ったロジックの多くによるものです。

3
MaCuban

のテキストファイルを含めるように編集されました

c:\logs\iis\siteA\ -30
c:\logs\job1\ -60
e:\archive\clientA\ -90

新しいコードのコードを、私がうそをついていたものとは別にテストしましたが、それでもあなたが望むように動作するはずです。

$controlfile = "c:\path\to\yourfile.txt"    
$curr_date = Get-Date

New-Item -ItemType directory -Path f:\delete

foreach ($line in get-content $controlfile)
{
    $split = $line.split(" ")
    $file_path = $split[0]
    $max_days = $split[1]

    $del_date = $curr_date.AddDays($max_days)

    # move the files to the kill directory
    Get-ChildItem $file_path | Where-Object { $_.LastWriteTime -lt $del_date } |  Move-Item -destination "f:\delete"
}

それが別のディレクトリに移動する理由は どうやら再帰的削除にバグがあるようです であり、私のデータは非常に多くの多くのサブディレクトリがあるため、すべてをkillディレクトリに移動したら、私はこれを実行してください:

del /f/s/q f:\delete > nul
rmdir /s/q f:\delete

その問題がない場合は、代わりにこれを上記のPowerShellの最後に追加できます。

$del_dir = "f:\delete"
$fso = New-Object -ComObject scripting.filesystemobject
$fso.DeleteFolder($del_dir)
7

このためのコマンドレットを作成できるため、コマンドラインでも使用できます。

コマンドレット

param(
    [string]$folder,
    [int]$expiry
)

ls $folder | % { if ($_.LastWriteTime -le (date).AddDays(-$expiry)) { rm $_ -fo } }

使用法

.\script.ps1 -folder "c:\logs\iis\siteA\"  -expiry 30
.\script.ps1 -folder "c:\logs\job1\"       -expiry 60
.\script.ps1 -folder "e:\archive\clientA\" -expiry 90
3
Vasili Syrakis