2009-11-18 149 views
1

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

你的问题是什么? – 2009-11-18 14:11:07

+0

我不确定你的问题 – 2009-11-18 14:11:40

+0

对不起,请检查编辑:) – Hellnar 2009-11-18 14:14:32

回答

1

第一,似乎set不像变量和=符号之间的空格:如果您放置空格,变量名称将包含空格。所以你必须删除空间来正确定义变量名称。

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

然后,当在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 /O-D %BACKUPDIR%') DO SET OLDEST=%%i 
DEL %BACKUPDIR%\%OLDEST% 
) 
+0

非常感谢这个建议,但是它的升级很奇怪,现在它不在乎countfiles是大于还是小于21,无论如何删除了一个文件:S – Hellnar 2009-11-18 14:33:41

+0

我在'set'命令中添加了更多关于空格的信息这可能有助于解决问题。 – 2009-11-18 14:53:31

+0

现在我纠正了你的变量设置的方式... – 2009-11-18 16:25:24

0

这不工作......你不能在for循环中设置'正常'变量。前几天我遇到了同样的问题,并用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% 
+0

实际上我提到的第一个脚本对我来说工作的很好。欢呼声 – Hellnar 2009-11-18 14:22:34

+0

@Hellnar,哦对不起......好像我完全误解了你。 *尴尬* – Bobby 2009-11-18 14:48:23