Модуль ScheduledTasks доступен в Windows 8/Server 2012 и новее. Создание задачи состоит из трёх этапов: определение действия (Action), триггера (Trigger) и принципала (Principal).
Создадим задачу, которая ежедневно в 03:00 удаляет логи старше 30 дней:
# Определяем действие — запуск PowerShell-скрипта
$action = New-ScheduledTaskAction `
-Execute "powershell.exe" `
-Argument '-NoProfile -ExecutionPolicy Bypass -File "C:\Scripts\Clean-OldLogs.ps1"' `
-WorkingDirectory "C:\Scripts"
# Определяем триггер — ежедневно в 03:00
$trigger = New-ScheduledTaskTrigger -Daily -At "03:00"
# Определяем принципал — от имени SYSTEM
$principal = New-ScheduledTaskPrincipal `
-UserId "SYSTEM" `
-LogonType ServiceAccount `
-RunLevel Highest
# Настройки задачи
$settings = New-ScheduledTaskSettingsSet `
-AllowStartIfOnBatteries `
-DontStopIfGoingOnBatteries `
-StartWhenAvailable `
-RunOnlyIfNetworkAvailable `
-ExecutionTimeLimit (New-TimeSpan -Hours 1) `
-RestartCount 3 `
-RestartInterval (New-TimeSpan -Minutes 5)
# Регистрация задачи
Register-ScheduledTask `
-TaskName "Clean-OldLogs" `
-TaskPath "\IT\Maintenance\" `
-Action $action `
-Trigger $trigger `
-Principal $principal `
-Settings $settings `
-Description "Удаление логов старше 30 дней"
Параметр -TaskPath создаёт папку в планировщике для организации задач. -StartWhenAvailable обеспечивает запуск пропущенной задачи (например, если сервер был выключен в 03:00).
Содержимое файла C:\Scripts\Clean-OldLogs.ps1:
# Clean-OldLogs.ps1
$logPaths = @(
"C:\inetpub\logs\LogFiles",
"C:\Windows\Temp",
"D:\Apps\Logs"
)
$daysToKeep = 30
$cutoffDate = (Get-Date).AddDays(-$daysToKeep)
$totalDeleted = 0
foreach ($path in $logPaths) {
if (Test-Path $path) {
$files = Get-ChildItem -Path $path -Recurse -File |
Where-Object { $_.LastWriteTime -lt $cutoffDate }
$count = ($files | Measure-Object).Count
$size = ($files | Measure-Object -Property Length -Sum).Sum / 1MB
$files | Remove-Item -Force -ErrorAction SilentlyContinue
Write-Output "$path : удалено $count файлов ($([math]::Round($size, 2)) МБ)"
$totalDeleted += $count
}
}
Write-Output "Итого удалено: $totalDeleted файлов"
# Запись в Event Log
New-EventLog -LogName Application -Source "LogCleanup" -ErrorAction SilentlyContinue
Write-EventLog -LogName Application -Source "LogCleanup" -EventId 1000 `
-EntryType Information -Message "Очистка логов: удалено $totalDeleted файлов"
Оставить комментарий