使用通配符删除文件

使用通配符删除文件

我有数百个类似这样的文件SageAccts Company Name 2018-06-21 00-00-10

时间和日期都在标题里。我想删除所有没有日期为2018-**-052018-**-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
  1. Get-ChildItem 的通配符过滤器可限制检索的文件信息。Get-ChildItem 不直接支持正则表达式。
  2. ?{}是 Where-Object 命令行的简写。
  3. 与运算符一起使用的提供的正则表达式-match将获取您想要的文件列表。
  4. Remove-Item 上的 What-If 开关可防止在报告将发生的情况时执行删除操作。它允许您在实际执行之前查看结果。如果一切正常,只需删除-What-If并再次运行即可。

    您随时可以使用 Get-Help 来了解有关命令行的更多信息。

相关内容