批处理脚本问题

时间:2009-11-18 14:07:13

标签: windows scripting batch-file

要删除文件,我将使用下面的代码删除目录中最旧的文件并每天运行它。它来自我的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%

编辑:很抱歉忘了这个问题,我的尝试失败了,我会很高兴以任何方式指导如何让它发挥作用。

2 个答案:

答案 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%