我希望你一切都好。
我是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*"}
谢谢!
比较日期时,您将要使用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]*"
。
在中使用-File
参数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
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句