Как использовать оператор if с forfiles для сопоставления с шаблоном и удаления, если он старше x дня? - PullRequest
0 голосов
/ 03 января 2019

Как использовать оператор if в forfiles для сопоставления с шаблоном имени файла и сохранения файлов в течение 90 дней, удаляя старые файлы, а если шаблон не соответствует, то хранить в течение 30 дней.

Скрипт должен рекурсивно проверять путь для всех файлов и сохранять файл в течение 90 дней, если * pattern.log совпадает, а для всех остальных - только 30 дней. - Папки должны храниться в любом случае; - Он содержит огромное количество файлов, и использование только Powershell делает его очень медленным и занимает больше суток, поэтому, наконец, я застрял с использованием forfiles с условием if-else. Я довольно новичок в написании сценариев и не могу найти, как я могу использовать if-else, соответствующий шаблону.

Get-ChildItem -Path C:\Data | ForEach-Object {
    $serverpath = $_.FullName
    forfiles /p "$serverpath\Logs" /s /d -30 /c "cmd /c del /Q /F @file"
}

Этот код работает нормально и удаляет все файлы старше 30 дней. Тем не менее, теперь я должен сохранить имя файла шаблона в течение 90 дней, с которыми я застрял. Пожалуйста помоги.

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Поскольку Remove-Item принимает ввод по каналу, один Where-Object со сравнениями является ИМО более элегантным.

Get-ChildItem -Path C:\Data\Logs -Files -Recurse | Where-Object {
    $_.LastWriteTime -le (Get-Date).Date.AddDays(-90) -or
  ( $_.LastWriteTime -le (Get-Date).Date.AddDays(-30) -and
    $_.Extension -ne '.Log' ) } | Remove-Item -WhatIf

Если вывод выглядит нормально, удалите конечный -WhatIf

Мне любопытно, при каких условиях (номер файла / размер) forfiles превосходит по скорости.

0 голосов
/ 01 февраля 2019

Спасибо LotPings и T-Me , с вашими предложениями, которые я объединил и смог исправить мою ситуацию с помощью следующих строк кода, которые я вставил сюда для чьих-либо ссылок :

Get-ChildItem -Path "C:\Data" -Recurse -File | ForEach-Object {
if($_.LastWriteTime -le (get-date).AddDays(-90) -or ($_.Name -notlike "*pattern.log" -and $_.LastWriteTime -le (Get-Date).AddDays(-30))) {
    Remove-Item $_.FullName
    }
}

Кроме того, причина, по которой другие сценарии занимали много времени, заключалась в том, что я хранил информацию о файлах в переменных и заметил, что, поскольку в этом сценарии число файлов огромно, оно потребляло много оперативной памяти 10 + ГБ RAM и мне пришлось его принудительно закрыть. Запланированное задание, которое у меня было по расписанию, выполняемое каждый день с использованием сценария, на самом деле занимало около 5 дней и, следовательно, не выполнялось в течение 4-5 дней при каждом запуске. Но теперь это занимает всего пару часов, и проблема, с которой я столкнулся, изначально исправлена.

0 голосов
/ 03 января 2019

Вам не нужен старый пакетный исполняемый файл forfiles powershell полностью способен на это:

$Path = "C:\Data"
$Files = Get-ChildItem -Path $Path -Recurse -File  
ForEach($File in $Files)  { 
    if ($File.LastWriteTime -le (Get-Date).AddDays(-90)){
        Remove-Item $File
    } elseif ($File.Name -notlike "*.log" -and $File.LastWriteTime -le (Get-Date).AddDays(-30)){
        Remove-Item $File
    }
}

Замените $File.Name -notlike "*.log" на ваш шаблон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...