我正在处理一个批处理脚本,它找到文件夹中最旧的文件并将其删除,只留下最新的文件。我已经设法将以下脚本拼凑在一起,但是我无法让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
该脚本准确显示文件夹中的文件数量,这是通过回声确认的。我打算循环脚本,直到只剩下一个文件,但命令提示符在第二次暂停后关闭。
我故意添加分号以指出它出错的地方。
答案 0 :(得分:2)
我看不到分号!我看到冒号 - 但不是分号。
echo if "%cnt%"=="1" (breakLoop)
如果移除了echo
,如果cnt
为1
,则会尝试执行 breakloop
您需要goto breakloop
}跳到标签:breakloop
。
echo if "%cnt%" == "1" ( echo %cnt% file(s) remain! )
关于)
的奇怪之处 - 它终止了前一级括号,但(
语句中的echo
被视为普通文本字符。要将第一个)
解释为普通字符,您需要使用插入符^
来转义它:^)
如果您是从提示中运行此批处理而不是点击它,则会看到cmd
对语法的抱怨。
至于for /f
- 如果你使用/o-d
来排序反向 - 日期顺序,那么第一个行遇到的是您希望保留的文件。
通过从提示符执行for
来查看for /?
语法。你会发现有一个方便的skip
选项可以在处理之前跳过列表的第一行n
,所以如果你要用skip=1
跳过第一行,那么你&& #39; d保存最年轻的并杀死其余部分。