0

我知道以前这里有这样的问题,但在我的情况下,指定要在“删除”操作中排除的文件有特殊条件。

文件名示例:

A_001.xml
A_002.xml
B_001.xml
B_002.xml
B_003.xml
C_009.xml
D_002.xml

上面的文件在一个目录中,我需要删除所有文件,但保留每个文件的一份副本,文件名中的最高计数器是 A_002.xm、B_003.xml、C_009.xml 和 D_002.xml。

这可能吗?我是批处理文件创建的新手,所以请帮助我。我已经知道如何删除文件,甚至排除特定的文件扩展名,但我不知道在这种情况下该怎么做。

4

2 回答 2

1
@ECHO OFF

SETLOCAL enabledelayedexpansion
::
:: establish target directory
:: initialise PREFIX to a name that's invalid in a filename
::
SET target=.
SET prefix=:
FOR /f "tokens=1*delims=_" %%i IN (
 'dir /b/a-d/o-n "%target%\*_*.xml'
 ) DO (
IF !prefix!==%%i ECHO DEL "%target%\%%i_%%j"
SET prefix=%%i
)

此解决方案依赖于目标目录中 *xml 文件的名称中是否存在“_”。我在批处理开发目录中的一些虚拟文件上对其进行了测试,因此我.用于the current directory

DIR 命令生成目标目录中与模式匹配的文件列表。*_*.xml开关/b表示filename only,/a-d表示no directory names, even if they match/o-n表示in the reverse order of name因此,名称将出现在第一个之后的部分的最高数值_

FOR 读取此输出并将文件名的前缀%%i和其余部分分配给%%j由于prefix被初始化为文件名中的无效字符,它不可能匹配%%i遇到的第一个文件,因此DEL不会执行。然后将存储最后遇到的前缀。仅当下一个文件名具有匹配的前缀时才会DEL执行

请注意,我ECHODEL. 这是万一发生错误时的安全装置。PROPOSEDDEL操作将报告到屏幕上,而不是 EXECUTED。一旦您对批次正确感到满意,请移除 ,ECHO然后删除操作将继续。

观察点:

  • 一些编辑在去除或保留尾随空格方面相当随意。通常,这是无害的,但SET 批处理命令中的尾随空格会导致混乱。
于 2013-03-14T07:34:12.693 回答
1
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set newprefix=_
for /F %%a in ('dir /on /b /a-d *.xml') do (
for /F "delims=_" %%i in ("%%a") do (
   IF NOT *%%i*==*!newprefix!* (
   for /F %%q in ('dir /on /b /a-d %%i*.xml') do set lastitem=%%q
   attrib +r !lastitem!  > NUL
   del /s /q %%i*.xml 1>NUL 2>NUL 
   attrib -r !lastitem!  > NUL
   set newprefix=%%i
   )
)
)

对于 xml 文件的每个前缀,列出所有带有相关前缀的文件,以获取列表中的最后一个。然后将最后一个标记为只读。除只读外,删除所有具有给定模式的内容。重置只读标志并为下一个前缀重新开始。

于 2013-03-14T07:43:08.637 回答