如何删除所有文件但排除特定文件(批处理文件)

时间:2013-03-14 05:24:15

标签: command-line batch-file cmd

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

文件名示例:

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。

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

2 个答案:

答案 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文件的每个前缀,列出具有相关前缀的所有文件以获取列表中的最后一个。然后将最后一个标记为只读。删除除给定模式以外的所有模式。重置只读标志并为下一个前缀执行。