【问题标题】:List files by date in filename Powershell按文件名Powershell中的日期列出文件
【发布时间】:2021-02-25 13:06:07
【问题描述】:

希望你一切都好。

我是 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
}

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

Get-ChildItem $SourceDB -Filter '*.txt' | Where-Object {$_.BaseName -le "*$DateRef*"}

谢谢!

【问题讨论】:

  • 不是比较日期字符串,而是比较日期对象。所以将您的文件名转换为日期时间对象并将其与您的目标日期时间对象进行比较。

标签: powershell filenames get-childitem


【解决方案1】:

比较日期时,您需要使用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
        } 
    

说明:

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

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

(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。

【讨论】:

  • 谢谢,效果很好。感谢使用日期时间对象的提示。
猜你喜欢
  • 2017-05-06
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多