Автоматическое удаления файлов в папке по заданным критериям
Добрый день! Уважаемые читатели и гости одного из крупнейших IT блогов рунета для системных администраторов. В прошлый раз мы с вами разобрали базовую установку CentOS 8. Идем далее и в сегодняшней статье я с вами хочу поделиться полезным скриптом, который позволяет в автоматическом режиме производить удаление файлов по заданным заранее критериям. Уверен, что подобная задача очень часто стоит перед многими системными администраторами в чьи задачи входит обслуживание серверов Windows.
Требования к автоматическому удалению файлов
Есть ряд серверов CRM, Web сервера IIS и другие у которых есть проблема с огромным количеством логов. Чтобы не было переполнения диска нужно их автоматически удалять, для этого наш скрипт должен отвечать вот таким требованиям:
- Должен быть CSV файл в котором прописано имя сервера. папку которую нужно чистить, количество дней старше которых нужно производить удаление
- Далее данный CSV файл должен импортироваться
- Должны вестись логи по процессу удаления
- Скрипт должен быть написан на PowerShell
Код скрипта по автоматическому удалению файлов на серверах Windows
Вот пример моего CSV файла. Тут есть столбцы:
- Server; - DNS имя сервера
- Folder; - Путь
- RetentionDays - Возраст файлов. старше N-дней
# Задаем читаемые даты и время
function Date {Get-Date -Format "yyyy.MM.dd HH:mm:ss"}
# Задается папка с логами, если ее нет, то будет создана, так же сюда будут складываться логи
$log_folder = "$PSScriptRoot\Logs\" + $($MyInvocation.MyCommand.Name -replace (".ps1", ""))
$log = "$log_folder\$(Get-Date -Format "yyyy_MM_dd_HH_mm_ss").txt"
$input_csv_file = "$PSScriptRoot\" + $($MyInvocation.MyCommand.Name -replace (".ps1", ".csv"))
if (! (Test-Path $log_folder -PathType Container -ErrorAction SilentlyContinue))
{
New-Item $log_folder -ItemType D -Force | Out-Null
}
# Импорт CSV
"$(Date) Start Processing" | Tee-Object $log -Append
foreach ($line in (Import-Csv $input_csv_file -Delimiter ";")) # | select -First 1
{
$folder = $line.Folder
$server = $line.server
$AddDays = $line.RetentionDays
"$(Date) Processing folder `"$folder`" on server `"$server`"" | Tee-Object $log -Append
$path = "\\$server\$folder" -replace ":", "$"
"$(Date) Trying to remove old files from folder `"$path`" on server `"$server`"" | Tee-Object $log -Append
$files = $null
try {
$files = Get-ChildItem $path -File -ErrorAction Stop | ? {$_.LastWriteTime -le (Get-Date).AddDays(-$AddDays)} # | select -First 1
}
catch {
"$(Date) $($_.exception.message)" | Tee-Object $log -Append
}
foreach ($file in $files)
{
"$(Date) Trying to remove file `"$($file.FullName)`"" | Tee-Object $log -Append
try {
$file | Remove-Item -Force
}
catch {
"$(Date) $($_.exception.message)" | Tee-Object $log -Append
}
}
$files = $null
$folders2 = Get-ChildItem $path -Directory # | ? {$_.LastWriteTime -le (Get-Date).AddDays(-30)} # | select -First 1 # -Recurse
foreach ($folder2 in $folders2)
{
"$(Date) Processing folder `"$($folder2.FullName)`" on server `"$server`"" | Tee-Object $log -Append
try {
$files = Get-ChildItem $($folder2.FullName) -Recurse -File -ErrorAction Stop | ? {$_.LastWriteTime -le (Get-Date).AddDays(-$AddDays)} # | select -First 1
}
catch {
"$(Date) $($_.exception.message)" | Tee-Object $log -Append
}
"$(Date) Trying to remove $($files.Length) files" | Tee-Object $log -Append
foreach ($file in $files)
{
"$(Date) Trying to remove file `"$($file.FullName)`"" | Tee-Object $log -Append
try {
$file | Remove-Item -Force
}
catch {
"$(Date) $($_.exception.message)" | Tee-Object $log -Append
}
}
}
}
"$(Date) End Processing" | Tee-Object $log -Append