PowerShell按date名称筛选文件

我有很多不同名字的文件每天。 我怎样才能按他们的名字过滤他们的date?

例如:

app_20130505.log app_20130506.log app_20130507.log app_20130508.log app_20130509.log 

和我的代码片段:

 $RetainedDays = 7 $FileNameRegex = "\w+_(\d+)\.\w+" $ArchiveBoundary = $(Get-Date -Format yyyyMMdd) - $RetainedDays $ProcessFiles = Get-ChildItem -Path $RootPath -Recurse | Where-Object { $_.Name -match $FileNameRegex } 

我有正则expression式筛选它: \w+_(\d+)\.\w+ ,这使我在$匹配variables中的date,但我怎么能结合他们,并取回文件列表,与这些文件7天以上?

我意识到这是一个4岁的问题。 但我想我会添加一个新的答案,因为目前还没有其他的投票。

我会这样做的方式是从文件名parsing到一个实际的DateTime对象的date。 那么你可以使用正常的date比较,而不是string比较。 最常见的方法是使用计算属性作为Select-Object语句的一部分。 在下面的例子中,我们将一个名为ParsedDate的计算属性添加到现有的输出中。

 $RetainedDays = 7 $FileNameRegex = "\w+_(\d+)\.\w+" $culture = [System.Globalization.CultureInfo]::InvariantCulture $ProcessFiles = Get-ChildItem -Path $RootPath -Recurse | Select-Object *,@{ L='ParsedDate'; E={ if ($_.Name -match $FileNameRegex) { $strDate = $matches[1]; [DateTime]::ParseExact($strDate,"yyyyMMdd",$culture) } } } | Where { $_.ParsedDate -lt (Get-Date).AddDays(-$RetainedDays) } 

正则expression式实际上使事情变得比他们可能需要的更复杂。 如果您的文件都具有完全相同的app_ <DATE> .log命名模式, 可以跳过正则expression式,并通过让ParseExact完成所有这些工作来简化。 您只需要通过用单引号括住格式string来转义字面字符。

 $RetainedDays = 7 $culture = [System.Globalization.CultureInfo]::InvariantCulture $ProcessFiles = Get-ChildItem -Path $RootPath -Recurse | Select FullName,@{ L='ParsedDate'; E={ [DateTime]::ParseExact($_.Name,"'app_'yyyyMMdd'.log'",$culture) } } | Where { $_.ParsedDate -lt (Get-Date).AddDays(-$RetainedDays) } 

从技术上讲,你也可以在Where子句中进行dateparsing,并跳过中间的Select子句。 但是我会把这个留给读者做一个练习。

看看这是否有助于让你更接近你想要做的事情。

 $RootPath = "C:\temp" $ProcessFiles = @() $RetainedDays = 7 $Today = get-date -format yyyyMMdd $FileNameRegex = "\w+_(\d+)\.\w+" foreach ($File in Get-ChildItem -Path $RootPath) { $match = [regex]::matches($File, $FileNameRegex ) $FileNameDate = $match[0].Groups[1].Value if (($Today - $FileNameDate) -ge $RetainedDays) { $ProcessFiles += $File } } $ProcessFiles 

这不是太好,但工作! 🙂

 $RetainedDays = 14 $ArchiveBoundary = (Get-Date).AddDays(-$RetainedDays).ToString('yyyyMMdd') $ProcessFiles = Get-ChildItem -Path $RootPath -Recurse | Where-Object { ($_.BaseName -split '_|\.')[1] -lt $ArchiveBoundary }