批处理文件 - 根据文件名中的数字删除文件

时间:2014-03-10 21:14:55

标签: windows batch-file cmd

我有一个任务分配给我,我知道如何使用其他语言,但Windows批处理/ cmd要求让我有点困惑。

有一个包含多个文件的目录:

  • FileName0.txt
  • FileName0-2014.txt
  • FileName0-2013.txt
  • FileName1.txt
  • FileName1-2014.txt
  • FileName1-2013.txt
  • FileName2.txt
  • FileName2-2014.txt
  • FileName2-2013.txt

同样的模式可能会一直重复到FileName54.txt,依此类推。另外请记住,我已经出于各种原因简化了示例,但名称的格式是相同的。

基本上有主文件(FileName0.txt,FileName1.txt等),然后是早期的截断文件(FileName1-2014.txt,FileName1-2013.txt等),每个设置的数字都可以是0无论如何......我见过的最高的是54但可能会改变。

我需要做的是有一个批处理/ cmd文件,它将保留所有FileName0 * .tx文件,其他数字序列的主文件(FileName1.txt,FileName2.txt等),然后删除所有除FileName0集之外的任何序列的其他截断文件。

我认为我可以专注于" - "在序列号之后,所以基本上删除了FileName1 - * .txt,但是试图找出一种系统的方法来使所有序列都能在0以上工作让我感到困惑。

思想/评论/实例

3 个答案:

答案 0 :(得分:1)

滥用访问权限的丑陋方式:

attrib +r FileName0*.txt
del FileName*-*.txt
attrib -r FileName0*.txt

更好的方式:

for /L %i in (1,1,999) DO del FileName%i-*.txt

答案 1 :(得分:0)

@ECHO OFF
SETLOCAL
FOR %%a IN (filenames*.txt) DO FOR /f "tokens=1,2delims=-" %%s IN ("%%a") DO IF "%%t"=="" SET "keep=%%~na"&GOTO nextstep
:nextstep
ECHO keep %keep%*
FOR %%a IN (filenames*-*.txt) DO FOR /f "tokens=1,2delims=-" %%s IN ("%%a") DO IF "%%s" neq "%keep%" ECHO DEL "%%a"

GOTO :EOF

为了测试目的,所需的DEL命令仅为ECHO在您确认命令正确后,将ECHO DEL更改为DEL以实际删除文件。

(我已将模板更改为filenameS以适合我的测试)

答案 2 :(得分:0)

for /f "delims=" %%f in (
  'dir /a-d /b *.txt ^| findstr /r /c:"FileName[1-9][0-9]*-"'
) do echo del "%%~ff"

过滤文件列表以仅检索所需文件。