我在生成许多文件的软件方面遇到问题。 我无法控制文件的生成,但是以后可以处理它们。 文件具有这种名称:
“ RandomString”。* ProjectNumber *。* Date *。* Time * .txt
例如:
1297729137.0004202.20180925.232147.txt
我想保留相同的ProjectNumber,仅保留最后生成的TXT文件。
有什么主意我可以轻松做到吗?
答案 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
。
请注意,此代码假定:
答案 2 :(得分:1)
与Mark Wragg类似的方法,但使用
Where-Object
。Select-Object
,用于为ProjectName和DateTime附加计算的属性PN和DT -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 }