2016-03-02 57 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

這是一個使用正則表達式和一些虛擬文件名的例子。在你的例子中,你想用你的初始Get-ChildItem命令替換$fileNames。我只是將文件名輸送到使用正則表達式捕獲年份,月份和日期的where子句。然後,我將它傳遞給另一個where子句,該子句使用捕獲的數字構造一個對象並將其與開始和結束時間進行比較。

$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

我認爲修改後的版本適合你的場景會看起來像這樣(可能有som 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

它是如何獲得$ Matches [1],2等的。 – user1451070