批处理脚本问题

为了删除文件,我将使用下面的代码删除目录中最旧的文件,并每天运行它。 它来自我的问题 。

应用于原始批处理脚本

SET BACKUPDIR=C:\PATH\TO\BACKUPS FOR /F %%i IN ('DIR /B /OD %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 /OD %BACKUPDIR%') DO SET OLDEST=%%i DEL %BACKUPDIR%\%OLDEST% 

编辑:对不起,忘记了这个问题,我的尝试失败了,我会很乐意以任何方式指导如何使其工作。

首先,它似乎set不像变量和=符号之间的空格:如果你把一个空格,变量名将包括一个空格。 所以你必须删除空间来正确定义变量名称。

另外,将命令的输出捕获到变量中的语法是错误的。 我知道的唯一方法(绝望地搜索stackoverflow的答案之后)是使用for循环技巧来使用临时变量(请参阅此问题的更多详细信息)。 实际上,您还需要转义管道才能正确解析命令。

那么当if表达式中的测试变量不存在时,结果总是为真,所以确保变量存在。 通过删除上面所述的空间,if表达式中的名字将与你的变量名称匹配,并且测试将正确执行。

那么你忘了围绕最后2个命令。 实际上,你正在测试你是否有超过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 /OD %BACKUPDIR%') DO SET OLDEST=%%i DEL %BACKUPDIR%\%OLDEST% ) 

这是行不通的…你不能在for循环中设置'正常'的变量。 前几天我也遇到了同样的问题,并用这个博客文章解决了这个问题。

基本上,你需要设置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 /OD %BACKUPDIR%') DO SET OLDEST=%%i DEL %BACKUPDIR%\%OLDEST%