所以我有一个庞大的文件列表,我正在查询这些文件以生成稍后要操作的文件列表。每个文件的名称都有一个日期,我需要过滤任何不在特定日期范围内的文件。
文件名称为
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
我需要过滤文件列表,以排除任何不属于日期范围的文件。
答案 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