2016-03-02 2 views
0

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

Файлы именуются как таковые

jflksafjlkasfs_2016-01-01_jkfdfjlkajklldsa.log 
j221373213478_2016-01-02_jkdjdsalkdfusalkfl.log 

В сценарии у меня есть 2 переменной

StartDate = 
EndDate = 

В настоящее время я запрашивая файлы, используя базовую GCI.

$htLogFiles.All += Get-Childitem -Path $Directory -OutBuffer 1000 -filter "*.log.gz" |Select FullName, Name 

Мне нужно отфильтровать список файлов, чтобы исключить любые файлы, которые не попадают в диапазон дат.

ответ

1

Вот пример использования имен регулярных выражений и некоторых фиктивных файлов. В вашем примере вы хотели бы заменить $fileNames на свою начальную команду Get-ChildItem. Я просто связываю имена файлов с предложением where, которое использует регулярное выражение для записи года, месяца и дня. Затем я связываю это с другим предложением where, которое использует захваченные числа для построения объекта System.DateTime и сравнивает его с временем начала и окончания.

$startDate = New-Object -TypeName System.DateTime -ArgumentList @(2016, 1, 2) 
$endDate = New-Object -TypeName System.DateTime -ArgumentList @(2016, 1, 4) 

$fileNames = @(
"jflksafjlkasfs_2016-01-01_jkfdfjlkajklldsa.log", 
"j221373213478_2016-01-02_jkdjdsalkdfusalkfl.log", 
"j221373213478_2016-01-03_jkdjdsalkdfusalkfl.log", 
"j221373213478_2016-01-04_jkdjdsalkdfusalkfl.log", 
"j221373213478_2016-01-05_jkdjdsalkdfusalkfl.log") 

$fileNames | 
? { $_ -match "_(\d+)-(\d+)-(\d+)_" } | 
? { 
    $date = New-Object System.DateTime -ArgumentList $Matches[1], $Matches[2], $Matches[3] 
    $date -ge $startDate -and $date -le $endDate 
} 

Вот выход из приведенных выше команд:

j221373213478_2016-01-02_jkdjdsalkdfusalkfl.log
j221373213478_2016-01-03_jkdjdsalkdfusalkfl.log
j221373213478_2016-01-04_jkdjdsalkdfusalkfl.log

Я думаю, что модифицированная версия, соответствующая вашему сценарию, будет выглядеть примерно так (может быть, e незначительные синтаксические ошибки):

Get-Childitem -Path $Directory -OutBuffer 1000 -filter "*.log" | 
? { $_.Name -match "_(\d+)-(\d+)-(\d+)_" } | 
? { 
    $date = New-Object System.DateTime -ArgumentList $Matches[1], $Matches[2], $Matches[3] 
    $date -ge $startDate -and $date -le $endDate 
} | 
Select FullName, Name 
+0

ха-ха, он отлично работает! Но как/почему? Не могли бы вы объяснить, как это работает и/или указать мне в направлении, чтобы я мог сам это узнать. – user1451070

+0

@ user1451070 Какие части вы неясны? Я попробую и объясню их лучше. –

+0

Как получить $ Матчи [1], 2 и т. Д. – user1451070

Смежные вопросы