Powershell для удаления файлов журнала из пути к папке журнала старше 180 дней

Мне нужен сценарий 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

Пожалуйста, будьте более описательными, чем «это не работает» - это выдает сообщения об ошибках? Удаление неправильных файлов? Удалить все файлы? Вы уверены, что на самом деле существуют файлы *.log, которые не записывались в течение 180 дней?

Mathias R. Jessen 13.06.2023 13:18

Код выглядит правильно, за исключением того, что он должен быть $Daysback = -180. Обязательно настройте задачу для запуска от имени пользователя, вошедшего в систему в данный момент, иначе сценарий не будет иметь доступа к каталогу профиля пользователя.

zett42 13.06.2023 13:46

@MathiasR.Jessen Никаких ошибок не выдает. После планирования в планировщике задач Windows задачи выполняются, но файлы .log не удаляются.

Akshay 13.06.2023 15:19

@ zett42, конечно, попробую с $Daysback = -180, так как задача уже настроена для запуска от имени пользователя, вошедшего в систему.

Akshay 13.06.2023 15:21
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Как насчет

$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.

lit 13.06.2023 17:20

Ах, конечно, в моем случае мой сценарий сначала архивировал старые файлы в .zip, имел несколько журналов в день, и я не хотел неполных дней и хотел использовать строку даты позже в коде. Итак, поскольку удаление работает нормально при передаче строки, в одной строке были отмечены все поля для многократного использования во всем скрипте. Неплохая фраза "Я знаю, что это работает, но не могу вспомнить, почему я сделал это именно так" :)

Keith Langmead 13.06.2023 18:08

Использование ToString() без указания формата создаст метку времени в соответствии с текущими региональными настройками. Лучше оставить $DatetoDelete как [datetime], а затем использовать $DatetoDelete.ToString(), когда он появится у пользователя.

lit 13.06.2023 19:51

Другие вопросы по теме

Объединение нескольких файлов журналов в один файл для автоматизации создания пакетов отладки
Как я могу исправить вывод разрывов строк с помощью утилиты script(1)?
Как создать файл журнала приглашения Windows при запуске файла bat
Как отправлять журналы из приложения Python в Datadog с помощью ddtrace?
Атрибуция стоимости журнала GCP
WARN StatusConsoleListener Использование сканирования пакетов для обнаружения подключаемых модулей устарело и будет удалено в будущем выпуске
В промежуточном программном обеспечении Rack, как игнорировать заголовки по умолчанию?
Почему поток всегда stderr, когда docker/containerd пишет *.json.log
Оптимизация ведения журнала в многопоточном серверном приложении C++ для повышения производительности и обеспечения целостности данных
ПО промежуточного слоя ASP.NET Core HTTP Logger приводит к выводу, что «вторая операция была запущена в этом экземпляре контекста до завершения предыдущей операции»