PowerShell · 20.12.2024

Удаление логов ETL

Внимание! Олдпостинг! Этот пост наконец-то добрался до сайта.

Не буду говорить отдельно про ETL логи — если Вы попали на эту страницу, значит уже представляете что это такое, что их создаёт и Вам интересно можно ли от них спокойно избавиться и как, соответственно, это делать автоматически.

Спойлер: удалять их можно.

Первая и единственная оговорка по теме: постоянное удаление лог-файлов — это вообще не метод. Лучше найдите и отключите групповыми политиками службы, которые их создают и тогда удаление логов будет одноразовым мероприятием.

Но! Если Вы заметили, что на каком-то из хостов папка ETLLogs стала весить преступно много и отъедает драгоценное место накопителя — можно воспользоваться этой штуковиной:

[System.Console]::Title = "Зачистка файлов из папки ETLLogs"
$computername = Read-Host "Введите имя удалённого хоста"
$ping = Test-Connection -ComputerName $computername -Count 1 -Quiet
if ($ping)
{
    Write-Host "Будет запущено удаление файлов ETLLogs! Нажмите Ctrl+C для отмены." -ForegroundColor Red
    Sleep(10)
    $etllogspath = "\\$computername\c$\ProgramData\Microsoft\Diagnosis\ETLLogs\"
    Get-ChildItem -Path $etllogspath -Filter *.etl |
     Where-Object {$_.Name -notlike "INVAGENT_Utc.etl"} | 
     Remove-Item -Verbose -ErrorAction Continue
}
else
{
    Write-Host "Хост $computername не отвечает!" -ForegroundColor Red
}
Write-Host
Write-Host "Работа скрипта завершена!" -ForegroundColor Cyan
Sleep(10)

Всё, что требуется — указать имя удалённого хоста или его IP-адрес. Добавлять блок try…catch не стал. Ограничился ErrorAction.

А что делать, если групповая политика отключила виновников торжества, а файлы как лежали себе, так и продолжают лежать и занимать драгоценное место?

Прикрутите к тому же объекту групповой политики скрипт автозагрузки с таким содержимым:

$pathtoetl = [System.IO.Path]::Combine($env:ProgramData, "Microsoft\Diagnosis\ETLLogs")
Get-ChildItem -Path $pathtoetl -Filter *.etl |
Where-Object {$_.Name -notlike "INVAGENT_Utc.etl"} | 
Remove-Item

Когда будут обработаны все хосты — можно закомментировать содержимое в скрипте.

Вместо P.S.: этой конструкцией я пользовался, когда тестировал скрипты:

$newfile = [System.IO.Path]::Combine($env:ProgramData, "Microsoft\Diagnosis\ETLLogs\test.etl")
New-Item -Path $newfile

Этот код создаёт файл-пустышку test.etl по заветному пути и дальше можно проверять как отработал тот или иной скрипт.