用于删除指定文件名的脚本/工具

时间:2015-10-01 12:13:40

标签: file powershell batch-file

我需要一个批处理文件/脚本/工具来删除文件夹中的指定文件。 我有一个包含大量.xml文件的文件夹。它可以包含名为仅有几个字符的差异的文件(表示日期)。

// given the current url is http://example.com/user/3/inbox/unread?sort=desc
$route.updateParams({id:"2"});
// will become http://example.com/user/2/inbox/unread?sort=desc

这部分的长度是15个字符串

$("#dropDownList").val(selected_color);

此部分代表日期

aa_bb_000000001_2015_9_1.xml
aa_bb_000000001_2015_9_15.xml
aa_bb_000000001_2015_10_1.xml

aa_bb_000000002_2015_5_5.xml
aa_bb_000000002_2015_8_14.xml
aa_bb_000000002_2015_10_1.xml

aa_bb_000000005_2015_7_7.xml
.
.

我需要删除日期最早的名称部分的所有文件。 因此,批处理应仅保留文件:

  

aa_bb_000000001_2015_10_1.xml

     

aa_bb_000000002_2015_10_1.xml

     

aa_bb_000000005_2015_7_7.xml

     

     

1 个答案:

答案 0 :(得分:0)

这是一个相当短的解决方案。要了解代码的工作原理,最好关注Group-Object命令的作用,正则表达式以及它们与-match运算符的交互方式:

$Groups = Get-ChildItem "C:\XMLFiles\*.xml" | Group-Object {$_.Name.Substring(0, 15)}
$FilesToKeep = @{}
foreach ($Group in $Groups) {
    $MaxDate = "00000000"
    foreach ($FileInfo in $Group.Group) {
        $FileInfo.name -match "(\d{4})_(\d{1,2})_(\d{1,2}).xml$" | Out-Null
        $Date = $Matches[1]+([int]$Matches[2]).ToString("00")+([int]$Matches[3]).ToString("00")
        if ($Date -gt $MaxDate) {
            $MaxDate = $Date
            $FilesToKeep[$Group.Name] = $FileInfo.FullName
        }
    }
}
Get-ChildItem "C:\XMLFiles\*.xml" | Where-Object {-not $FilesToKeep.ContainsValue($_.FullName)} | Remove-Item