按文件名 Powershell 中的日期列出文件
List files by date in filename Powershell
希望你一切都好
我是 Powershell 的新手,我正在尝试制作一个脚本,允许根据文件名中的日期列出 7 天前的文件,然后 copy/move 它们到另一个目录。
文件结构:2020_06_11_DB.txtYYYY_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*"}
谢谢!
比较日期时,您需要使用 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
参数,returns 仅文件。
(Get-Date).AddDays(-7).Date
是 7 天前的今天午夜。
$_.BaseName -match '\d{4}_\d{2}_\d{2}'
匹配格式为 ####_##_##
.
的文件
[regex]::Match($_.BaseName,'\d{4}_\d{2}_\d{2}').Value
returns 匹配的字符串 ####_##_##
。 [datetime]::ParseExact()
将匹配的字符串(格式 'yyyy_MM_dd')转换为 DateTime
对象。
-le
小于等于运算符。所以 -le $DateRef
returns 日期早于或等于 $DateRef
.
希望你一切都好
我是 Powershell 的新手,我正在尝试制作一个脚本,允许根据文件名中的日期列出 7 天前的文件,然后 copy/move 它们到另一个目录。
文件结构:2020_06_11_DB.txtYYYY_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*"}
谢谢!
比较日期时,您需要使用 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
参数,returns 仅文件。
(Get-Date).AddDays(-7).Date
是 7 天前的今天午夜。
$_.BaseName -match '\d{4}_\d{2}_\d{2}'
匹配格式为 ####_##_##
.
[regex]::Match($_.BaseName,'\d{4}_\d{2}_\d{2}').Value
returns 匹配的字符串 ####_##_##
。 [datetime]::ParseExact()
将匹配的字符串(格式 'yyyy_MM_dd')转换为 DateTime
对象。
-le
小于等于运算符。所以 -le $DateRef
returns 日期早于或等于 $DateRef
.