按文件名 Powershell 中的日期列出文件

Ron*_*ina 2 powershell filenames get-childitem

我希望你一切都好。

我是 Powershell 的新手,正在尝试制作一个脚本,允许根据文件名中的日期列出 7 天前的文件,然后将它们复制/移动到另一个目录。

文件结构:2020_06_11_DB.txt YYYY_MM_dd

我设置了这段脚本,但它只将文件与参考日期(DateRef)相匹配,而不是至少(旧):

$SourceDB = "C:\DB\"
$DestinationDB = "C:\Destination\DB\"
$DateRef = Get-Date ((Get-Date).AddDays(-7)) -Format yyyy_MM_dd

$Query = Get-ChildItem $SourceDB -Filter "*$DateRef*" |
ForEach-object {
    Copy-Item -Path $_.FullName -Destination $DestinationDB
}
Run Code Online (Sandbox Code Playgroud)

我尝试过像 -le 和 -lt 这样的运算符,但没有成功。如果你能帮助我,我将不胜感激。

Get-ChildItem $SourceDB -Filter '*.txt' | Where-Object {$_.BaseName -le "*$DateRef*"}
Run Code Online (Sandbox Code Playgroud)

谢谢!

Adm*_*ngs 5

比较日期时,您将需要处理DateTime对象。因此,挑战在于从文件名中提取日期字符串并将它们转换为DateTime对象,然后再进行比较。

$SourceDB = "C:\DB\"
$DestinationDB = "C:\Destination\DB\"
$DateRef = (Get-Date).AddDays(-7).Date

$Query = Get-ChildItem $SourceDB -File | Where {
    $_.BaseName -match '\d{4}_\d{2}_\d{2}' -and [datetime]::ParseExact(([regex]::Match($_.BaseName,'\d{4}_\d{2}_\d{2}').Value),'yyyy_MM_dd',$null) -le $DateRef } |
        Foreach-Object {
            Copy-Item -Path $_.FullName -Destination $DestinationDB
        } 
    
Run Code Online (Sandbox Code Playgroud)

解释:

我不想阻止您使用,-Filter因为它比在Where-Object. 因此,您可以首先使用类似-Filter '*_*_*'或通配符您的 path 之类的内容进行部分过滤-Path "$SourceDB*[0-9][0-9][0-9][0-9]_[0-9][0-9]_[0-9][0-9]*"

使用-File参数 in Get-Childitem,只返回文件。

(Get-Date).AddDays(-7).Date 是今天午夜前 7 天。

$_.BaseName -match '\d{4}_\d{2}_\d{2}'匹配格式为 的文件####_##_##

[regex]::Match($_.BaseName,'\d{4}_\d{2}_\d{2}').Value返回匹配的字符串####_##_##[datetime]::ParseExact()将匹配的字符串(格式 'yyyy_MM_dd')转换为一个DateTime对象。

-le小于或等于运算符。因此-le $DateRef返回早于或等于 的日期$DateRef