我有数百个类似这样的文件SageAccts Company Name 2018-06-21 00-00-10
。
时间和日期都在标题里。我想删除所有没有日期为2018-**-05
、2018-**-15
或 的文件2018-**-28
。
我没有丰富的编码经验,所以 PowerShell 或批处理文件是最好的。
答案1
最好先用正则表达式并使用(捕获组)来 grep 日期,
然后排除特殊日子05|15|28
您没有指定扩展名,所以我也没有指定。
## Q:\Test\2018\07\24\SU_1342824.ps1
#Requires -Version 3.0
Push-Location "X:\Folder\to\start"
$RE = [RegEx]'^SageAccts Company Name 2018-[01][0-9]-([0-3][0-9]) [0-2][0-9]-[0-5][0-9]-[0-5][0-9]$'
## year- month -( day ) hour - minute - second
Get-ChildItem 'SageAccts Company Name 2018-*' -File |
Where-Object {$_.BaseName -match $RE} |
Where-Object {$Matches[1] -notmatch '05|15|28' }|
Remove-Item -Whatif
如果输出看起来正常,请从cmdlet中删除该-WhatIf
参数Remove-Item
## to generate test files
1..30|%{new-Item -ItemType file -path ("SageAccts Company Name 2018-06-{0:00} 00-00-10.txt" -f $_)}
答案2
您在 PowerShell 中寻找的是正则表达式匹配,它使用负向后视(用 表示?(<!)
)来排除所需的日期。
Get-ChildItem "SageAccts Company Name *" | ?{ $_ -match '2018-(?:0\d|1[1,2])-(?:[0-2]\d|[3][0,1])(?<!05|15|28)' } | Remove-Item -WhatIf
- Get-ChildItem 的通配符过滤器可限制检索的文件信息。Get-ChildItem 不直接支持正则表达式。
- 这
?{}
是 Where-Object 命令行的简写。 - 与运算符一起使用的提供的正则表达式
-match
将获取您想要的文件列表。 Remove-Item 上的 What-If 开关可防止在报告将发生的情况时执行删除操作。它允许您在实际执行之前查看结果。如果一切正常,只需删除
-What-If
并再次运行即可。您随时可以使用 Get-Help 来了解有关命令行的更多信息。