Powershell get-childitem исключает диапазон дат - PullRequest
0 голосов
/ 21 декабря 2018

Я использую Get-ChildItem, чтобы получить все файлы журнала tomcat, где дата не равна текущей дате / сегодня.Я хотел бы получить файлы журнала tomcat, где дата не входит в диапазон дат.Например, имена файлов за последние 7 дней не должны быть перечислены.

Пример имени файла журнала tomcat:
catalina.2018-12-21.log
host-manager.2018-12-21.log

$date=Get-Date (get-date).addDays(-0) -UFormat "%Y-%m-%d"
$file=Get-ChildItem "C:\tomcat\logs" -exclude "*$date*"

foreach($files in $file)
{
    Move-Item -Path $files -Destination "C:\expiredlogs"
}

[.....]Get all of the logs filename where date is not in the last 7 days range from "C:\expiredlogs"

Есть ли какой-нибудь хороший и эффективный способ извлечь все имена файлов, не входящие в диапазон 7 дней назад до сих пор?

Ответы [ 3 ]

0 голосов
/ 21 декабря 2018

Если вы настаиваете на использовании имен файлов, вам нужно проанализировать имена по датам, поскольку Get-ChildItem не знает о датах.Что-то вроде этого должно сработать:

Get-ChildItem "c:\programdata\dgs\cathi\log" | `
where { ([DateTime]::ParseExact($_.Name.Substring($_.Name.Length-14,10),'yyyy-MM-dd', $null) -lt (Get-Date).addDays(-7))} 

Число 14 - не магическое число, это длина даты + '.log'.

0 голосов
/ 21 декабря 2018

Вышеупомянутый способ использования LastWriteTime является правильным способом сделать это.Но если в именах файлов есть отметки времени, как у вас, фильтрация может быть более эффективной, чем Where-Object, и вы можете присвоить ей массивы.

Сначала создайте массив дат, которые следует исключить:

$range =  -3 .. -5 | ForEach-Object { "*$(Get-Date (Get-Date).addDays($_) -UFormat '%Y-%m-%d')*" }

Что сегодня возвращает:

*2018-12-18*
*2018-12-17*
*2018-12-16*

И передайте это Get-ChildItem:

Get-ChildItem "C:\tomcat\logs" -Exclude $range
0 голосов
/ 21 декабря 2018

Я предполагаю, что вы просто хотите получить все файлы независимо от их имени.До сих пор вы основывали это на самом имени файла, но вы могли основывать поиск на атрибутах файлов.В этом примере я получаю все файлы старше 7 дней.

$files=Get-ChildItem "C:\tomcat\logs" | Where-Object LastWriteTime -gt (Get-Date).AddDays(-7).Date

foreach($file in $files)
{
    Move-Item -Path $file -Destination "C:\expiredlogs"
}

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

Обновлено на основе рекомендаций @ LotPings

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