要删除文件,我将使用下面的代码删除目录中最旧的文件并每天运行它。它来自我的question。
申请原始批处理脚本:
SET BACKUPDIR=C:\PATH\TO\BACKUPS
FOR /F %%i IN ('DIR /B /O-D %BACKUPDIR%') DO SET OLDEST=%%i
DEL %BACKUPDIR%\%OLDEST%
检查文件数量是否为21的内容,如果是,则删除最新的文件:
SET BACKUPDIR=C:\test
SET countfiles = dir BACKUPDIR /b | find /v /c "::"
if countfiles > 21
FOR /F %%i IN ('DIR /B /O-D %BACKUPDIR%') DO SET OLDEST=%%i
DEL %BACKUPDIR%\%OLDEST%
编辑:很抱歉忘了这个问题,我的尝试失败了,我会很高兴以任何方式指导如何让它发挥作用。
答案 0 :(得分:1)
首先,似乎set
不喜欢变量和=
符号之间的空格:如果放置空格,变量名称将包含空格。所以你必须删除空格才能正确定义变量名。
加上,将命令输出捕获到变量中的语法是错误的。我知道的唯一方法(在拼命搜索stackoverflow之后)是使用for循环技巧来使用临时变量(有关详细信息,请参阅this question)。实际上,您还需要转义管道才能正确解析命令。
然后,当在if
表达式中测试的变量不存在时,结果始终为true,因此请确保该变量存在。通过删除如上所述的空格,if表达式中的名称将与您的变量名称匹配,并且测试将正确执行。
然后你忘记围绕最后两个命令进行阻止。实际上,如果您有超过21个文件并且计算最旧的文件,那么您正在测试它是否为真,那么您总是删除最旧的文件。
此外,大于运算符>
可以理解为重定向。您可能需要使用GTR运算符。
SET BACKUPDIR=C:\test
FOR /F %%i in ('dir BACKUPDIR /b ^| find /v /c "::"') DO SET countfiles=%%i
if countfiles GTR 21 (
FOR /F %%i IN ('DIR /B /O-D %BACKUPDIR%') DO SET OLDEST=%%i
DEL %BACKUPDIR%\%OLDEST%
)
答案 1 :(得分:0)
这不起作用......你不能在for循环中设置'normal'变量。几天前我遇到了同样的问题并用this blog entry解决了这个问题。
基本上,您需要设置SETLOCAL ENABLEDELAYEDEXPANSION
,然后使用!
代替%
...
set FILES=
for /f %%a IN (‘dir /b *.txt’) do set FILES=!FILES! %%a
echo %FILES%
所以,这应该适合你:
SETLOCAL ENABLEDELAYEDEXPANSION
SET OLDEST=
FOR /F %%i IN ('DIR /B /O-D %BACKUPDIR%') DO SET OLDEST=%%i
DEL %BACKUPDIR%\%OLDEST%