首页 > 解决方案 > 删除 Windows 目录中最旧的文件

问题描述

我正在开发一个批处理脚本,该脚本在文件夹中查找最旧的文件并将其删除,只留下最新的文件。我已经设法将以下脚本拼凑在一起,但是我无法使 if 语句正常工作。

@echo off
set cnt=0
for %%A in (C:\Test\*) do set /a cnt+=1
echo File count = %cnt%

pause

echo if "%cnt%"=="1" (breakLoop)
echo if "%cnt%" == "1" ( echo %cnt% file(s) remain! )
pause
:: if "%cnt%" == "1" ( 
:: echo %cnt% file(s) remaining! 
:: )


for /f "delims=" %%a in ('dir /b /a-d /t:w /o:d "C:\Test\*.*"') do (
    echo del "C:\Test\%%a"
     del "C:\Test\%%a"
    )
pause
:breakLoop

该脚本准确显示文件夹中的文件数量,并通过回显确认。我打算循环脚本,直到只剩下一个文件,但命令提示符在第二次暂停后关闭。

我特意添加了分号来指出哪里出错了。

标签: batch-file

解决方案


我看不到分号!冒号,我明白了——但不是分号。

echo if "%cnt%"=="1" (breakLoop)

如果echo删除了,如果cnt1,那么这将尝试执行 breakloop您需要goto breakloop跳到标签:breakloop

echo if "%cnt%" == "1" ( echo %cnt% file(s) remain! )

奇怪的是)- 它终止了前一级括号,但(echo语句中被视为普通文本字符。要将第一个)解释为普通字符,您需要使用插入符号对其进行转义^^)

如果您从提示符运行此批处理而不是单击它,您会看到cmd对语法的抱怨。

至于for /f- 好吧,如果你要使用-date倒序/o-d排序,那么遇到的第一行就是你希望保留的文件。

通过从提示符for执行来查看语法。for /?您会发现有一个方便的skip选项可以n在处理列表之前跳过列表的第一行,因此如果您要使用 a 跳过第一行,skip=1那么您将保存最年轻的并杀死其余的。


推荐阅读