【问题标题】:Batch Script issue批处理脚本问题
【发布时间】:2009-11-18 14:07:12
【问题描述】:

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

编辑:很抱歉忘记了这个问题,我的尝试失败了,我会很高兴以任何方式指导如何使其工作。

【问题讨论】:

  • 我不知道你的问题是什么
  • 对不起,请检查编辑:)

标签: windows scripting batch-file


【解决方案1】:

首先,set 似乎不喜欢变量和= 符号之间的空格:如果你放一个空格,变量名将包含一个空格。所以你必须删除空格才能正确定义变量名。

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

那么,当if表达式中测试的变量不存在时,结果始终为真,所以要确保变量存在。通过删除上面所说的空格,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%
)

【讨论】:

  • 非常感谢您的建议,但它有点奇怪,现在它不在乎 countfiles 是大于还是小于 21,无论如何都会删除一个文件:S
  • 我确实在set 命令中添加了一些关于空格的更多信息,这可能有助于解决问题。
【解决方案2】:

这不起作用...您不能在 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%

【讨论】:

  • 实际上我提到的第一个脚本对我来说效果很好。欢呼
  • @Hellnar,哦,对不起...好像我完全误解了你。 尴尬
猜你喜欢
  • 1970-01-01
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多