Мне нужен сценарий Powershell для удаления файлов журнала из пути к папке журнала старше 180 дней, что можно выполнить с помощью планировщика задач.
Я написал этот скрипт, но он не работает.
$Path = "C:\Users\akshay.tanpure\Music\logs"
$Daysback = "-180"
$CurrentDate = Get-Date
$DatetoDelete = $CurrentDate.AddDays($Daysback)
Get-ChildItem $Path -Recurse -Include *.log | Where-Object { $_.LastWriteTime -lt $DatetoDelete } | Remove-Item -Force
Код выглядит правильно, за исключением того, что он должен быть $Daysback = -180
. Обязательно настройте задачу для запуска от имени пользователя, вошедшего в систему в данный момент, иначе сценарий не будет иметь доступа к каталогу профиля пользователя.
@MathiasR.Jessen Никаких ошибок не выдает. После планирования в планировщике задач Windows задачи выполняются, но файлы .log не удаляются.
@ zett42, конечно, попробую с $Daysback = -180, так как задача уже настроена для запуска от имени пользователя, вошедшего в систему.
Как насчет
$Path = "C:\Users\akshay.tanpure\Music\logs"
$Daysback = "-180"
$CurrentDate = Get-Date
$DatetoDelete = $CurrentDate.AddDays($Daysback)
Get-ChildItem $Path -Recurse -filter *.log | Where-Object { $_.LastWriteTime -lt $DatetoDelete } | Remove-Item -Force
Я написал и использую подобное на наших серверах. Редактирование вашего кода в соответствии с синтаксисом, который я использую, заканчивается успешно:
$Path = "C:\Users\akshay.tanpure\Music\logs"
$Daysback = -180
$DatetoDelete = (Get-Date).AddDays($Daysback).ToString("MM/dd/yyyy")
Get-ChildItem $Path -Recurse -Include *.log | Where-Object { $_.LastWriteTime -lt $DatetoDelete } | Remove-Item -Force
Как заметил Zett42, -180
не обязательно заключать в кавычки, и в моем случае я обнаружил, что мне нужно получить информацию о дате в ожидаемом формате даты через ToString("MM/dd/yyyy")
Не нужно использовать ToString()
. Get-Date
создает объект [datetime]
для сравнения с LastWriteTime
.
Ах, конечно, в моем случае мой сценарий сначала архивировал старые файлы в .zip, имел несколько журналов в день, и я не хотел неполных дней и хотел использовать строку даты позже в коде. Итак, поскольку удаление работает нормально при передаче строки, в одной строке были отмечены все поля для многократного использования во всем скрипте. Неплохая фраза "Я знаю, что это работает, но не могу вспомнить, почему я сделал это именно так" :)
Использование ToString()
без указания формата создаст метку времени в соответствии с текущими региональными настройками. Лучше оставить $DatetoDelete
как [datetime]
, а затем использовать $DatetoDelete.ToString()
, когда он появится у пользователя.
Пожалуйста, будьте более описательными, чем «это не работает» - это выдает сообщения об ошибках? Удаление неправильных файлов? Удалить все файлы? Вы уверены, что на самом деле существуют файлы
*.log
, которые не записывались в течение 180 дней?