如何根据旧文件名自动删除旧文件?

时间:2018-09-27 08:25:43

标签: regex windows powershell batch-file cmd

我在生成许多文件的软件方面遇到问题。 我无法控制文件的生成,但是以后可以处理它们。 文件具有这种名称:

“ RandomString”。* ProjectNumber *。* Date *。* Time * .txt

例如:

1297729137.0004202.20180925.232147.txt

我想保留相同的ProjectNumber,仅保留最后生成的TXT文件。

有什么主意我可以轻松做到吗?

3 个答案:

答案 0 :(得分:3)

@echo off
setlocal EnableDelayedExpansion

rem Search files, keep the last one by project
for /F "tokens=1-4 delims=." %%a in ('dir /B *.txt') do (
   if "%%c%%d" gtr "!project[%%b]!" set "project[%%b]=%%c%%d"
)

rem Remove the rest of files
for /F "tokens=1-4 delims=." %%a in ('dir /B *.txt') do (
   if "%%c%%d" neq "!project[%%b]!" del "%%a.%%b.%%c.%%d.txt"
)

此方法假定文件夹中仅存在此类文件;如果没有,只需通过*.*.*.*.txt

更改通配符

答案 1 :(得分:2)

我认为这应该满足您的需求:

$Files = Get-ChildItem *.txt

$ProjectFiles = $Files | ForEach-Object {
    $FileName = $_.Name -Split '\.'
    [pscustomobject]@{
        Name          = $_.Fullname
        RandomString  = $FileName[0]
        ProjectNumber = $FileName[1]
        DateTime      = [datetime]::parseexact($FileName[2] + $FileName[3], 'yyyyMMddHHmmss', $null)
    }
}

$FilesToRemove = ($ProjectFiles | Group-Object 'ProjectNumber') | ForEach-Object {
    ($_.Group | Sort-Object DateTime -Descending | Select-Object -Skip 1).Name
} | Where-Object { $_ -ne $null }

$FilesToRemove | Remove-Item -WhatIf

这将检索所有文本文件,然后创建一个新的自定义PowerShell对象,该对象具有文件名以及您在文件名中通过分割“。”而指定的属性。我们使用datetime方法将日期和时间字符串转换为parseexact对象。

然后我们可以使用这个新对象按照项目编号对文件进行分组,然后遍历每个组,按日期对结果进行排序,跳过第一个结果(应该是最新的项目文件),然后返回所有其他人的名字。

然后,我们可以使用Remove-Item删除这些文件名。当您感到满意时,请移除-WhatIf

请注意,此代码假定:

  • 您的目录仅包含* .txt文件,这些文件不包含其他文件
  • 文件始终具有您指定的文件名模式
  • 日期时间始终采用您指定的确切格式,例如两位数的24小时制等。
  • 您正在PowerShell 3或更高版本上运行它。

答案 2 :(得分:1)

与Mark Wragg类似的方法,但使用

  • 具有匹配和捕获组以分隔文件名元素的Where-Object
  • 一个Select-Object,用于为ProjectName和DateTime附加计算的属性PN和DT
  • 按ProjectName分组
  • 展开组,按DateTime降序排序,并跳过第一个(最新的)以保持它
  • 使用-WhatIf选项删除另一个,以显示要删除的内容。

Get-ChildItem *.txt | Where-Object Name -match '^(([^\.]+)\.){4}txt$' |
  Select-Object *,@{n='PN';e={$Matches[2]}},@{n='DT';e={$Matches[3]+$Matches[4]}} |
    Group-Object PN |
      ForEach-Object{ $_.Group | sort DT -desc | select -skip 1 | RM -Whatif }