Назад | Перейти на главную страницу

Powershell: единый скрипт для «очистки» нескольких папок от файлов старше

Я хотел бы создать сценарий обслуживания, который запускался бы на каждом из наших серверов, чтобы очистить общие каталоги удаления / архивирования. Предпочтительно, чтобы сценарий использовал справочный файл для пути к папке и желаемого предела устаревания. Затем сценарий очистит этот путь от файлов старше лимита устаревания. Входной справочный файл будет выглядеть примерно так:

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

Первый компонент - это путь к файлу; а второй - количество дней, в течение которых файлы должны храниться, разделенные пробелом.

Теперь для сценария у меня есть следующее: однако мне досадно не хватает опыта в написании сценариев. (я больше ориентирован на сети)

#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.

Кредит, за который следует кредит, много логики, которую я взял из смертоносная собака из этот Почта.

Отредактировано для включения запрошенного вами текстового файла

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)

Вы можете создать для этого командлет и использовать его в командной строке:

Командлет

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