我知道之前有这样的问题,但在我的情况下,在“删除”操作中指定要排除的文件有特殊条件。
文件名示例:
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。
这可能吗?我是批处理文件创建的新手,所以请帮助我..我已经知道如何删除文件甚至排除特定的文件扩展名,但我不知道在这种情况下该怎么做。
答案 0 :(得分: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
请注意,我已在ECHO
之前插入DEL
关键字。这是一个出错的安全装置。 PROPOSED DEL
操作将报告给屏幕,而不是EXECUTED。一旦您对批处理是否正确感到满意,请删除ECHO
并继续执行删除操作。
要遵守的要点:
SET
上有尾随空格
批处理命令会导致混乱。答案 1 :(得分: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文件的每个前缀,列出具有相关前缀的所有文件以获取列表中的最后一个。然后将最后一个标记为只读。删除除给定模式以外的所有模式。重置只读标志并为下一个前缀执行。