按名称列出的日期过滤目录列表

时间:2016-03-02 02:31:55

标签: powershell powershell-v2.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 个答案:

答案 0 :(得分: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

我认为适合您的场景的修改版本看起来像这样(可能会有一些小的语法错误):

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