Автоматическое удаления файлов в папке по заданным критериям

PowerShell logo

Добрый день! Уважаемые читатели и гости одного из крупнейших IT блогов рунета для системных администраторов. В прошлый раз мы с вами разобрали базовую установку CentOS 8. Идем далее и в сегодняшней статье я с вами хочу поделиться полезным скриптом, который позволяет в автоматическом режиме производить удаление файлов по заданным заранее критериям. Уверен, что подобная задача очень часто стоит перед многими системными администраторами в чьи задачи входит обслуживание серверов Windows.

Требования к автоматическому удалению файлов

Есть ряд серверов CRM, Web сервера IIS и другие у которых есть проблема с огромным количеством логов. Чтобы не было переполнения диска нужно их автоматически удалять, для этого наш скрипт должен отвечать вот таким требованиям:

  • Должен быть CSV файл в котором прописано имя сервера. папку которую нужно чистить, количество дней старше которых нужно производить удаление
  • Далее данный CSV файл должен импортироваться
  • Должны вестись логи по процессу удаления
  • Скрипт должен быть написан на PowerShell

Код скрипта по автоматическому удалению файлов на серверах Windows

Вот пример моего CSV файла. Тут есть столбцы:

  • Server; - DNS имя сервера
  • Folder; - Путь
  • RetentionDays - Возраст файлов. старше N-дней

Список сетевых шар для очистки в csv

Обязательно у CSV файла должно быть такое же имя, как у данного PowerShell скрипта

# Задаем читаемые даты и время
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

Автор - Сёмин Иван

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *