基于剩余空间和最旧文件的清理实用程序

时间:2013-04-03 13:51:41

标签: batch-file

我想为我的RDX创建一个清理工具。 它将测试磁带上的可用空间是否小于某个阈值,并擦除最旧的文件,直到达到此阈值。

我从一些代码中修改了一些东西,但我无法弄清楚是什么问题:

@echo off
@setlocal enableextensions
@setlocal enabledelayedexpansion


for /f "tokens=7" %%a in ('fsutil volume diskfree e:') do set free=%%a
for /f "delims=" %%b in ('"dir e:\*.zip /A-D /OD /B"') do set file=%%b
if %free:~0,-9% lss 61 del e:\%file% else exit

每一行似乎分开工作,但不是循环。 你能帮我吗?

提前致谢=)

3 个答案:

答案 0 :(得分:0)

试试这个:

@echo off &setlocal enableextensions

for /f "tokens=7" %%a in ('fsutil volume diskfree e:') do set "free=%%a"
for /f "delims=" %%b in ('dir e:\*.zip /A-D /O-D /B') do set "file=%%b"
if %free:~0,-9% lss 61 (del "e:\%file%") else exit

答案 1 :(得分:0)

不确定你的意思是“不是循环” - 有两个循环,但你说每行都是单独工作的吗?

在我的机器上工作得非常愉快 - 那你究竟是什么意思?

可能有所帮助的一些事情:

  1. 前导@仅仅意味着'在执行之前不要将此命令回显到控制台'。执行@echo off指令后,命令的回显停止,因此@是多余的。 is命令需要@echo off,否则关闭回显的指令本身就是ECHO
  2. 每个setlocal启动一个新的本地环境,继承所有当前环境变量。使用两个没有错,它只是多余的。 setlocal enableextensions enabledelayedexpansion就足够了。您未在此例程中使用delayedexpansion,因此that本身就是多余的。默认状态CMD.EXEenableextensions。您必须对DISABLE扩展程序采取明确的操作 - 大多数批处理程序将采用默认条件。
  3. 在我的机器上,自由空间是线上的EIGHTH标记,而不是第7个。如果您的:相同,则会将free加载到dir
  4. IF命令周围的双引号是冗余的。执行SINGLE引号之间的命令。添加双引号什么都不做,除非在命令中有单引号要执行。
  5. %var%比较可能会出错。在执行指令之前解析了任何free,因此如果%free:~0:-9%包含少于9个字符,if lss 61...将被解析为[nothing],指令将被执行为free这将是一个语法错误。请注意,在您的情况下,:可能是%free:~0:-9%,即使在更正后,您的可用空间少于1000000000字节,dir也会被解析为空,并生成错误。
  6. 如果没有符合file命令找到的选择条件的文件,file将包含批处理启动时的值。很可能,变量myveryimportantfile永远不会被设置,但假设它被设置为@echo off setlocal FOR %%I IN (free file) DO SET "%%I=" for /f "tokens=8" %%a in ('fsutil volume diskfree e:') do set free=%%a for /f "delims=" %%b in ('dir e:\*.zip /A-D /OD /B') do set file=%%b IF NOT DEFINED FILE EXIT SET "FREE=%FREE:~0,-9%" IF NOT DEFINED FREE SET /A FREE=0 if %FREE% lss 61 del "e:\%file%" ?因此,最好确保批处理中使用的任何变量都已初始化。
  7. 所以 - 修改过:

    %%x

    (案例是多余的 - CAPS的变化。SET "var=somethingorevennothing"的元变量案例很重要

    请注意,严格来说,即使SETLOCAL是冗余的,但它确实确保此批处理在终止后不会影响环境状态。

    语法SET很重要。一个简单的=语句针对STRINGS,因此SPACES非常重要。如果在SET /A之前出现空格,则在设置的变量名称中 INCLUDED 。如果行末有空格,则还包括它们。引用SET克服了第二个问题。警惕性克服了第一次。

    {{1}}忽略这些空格,但只能用于设置NUMERIC值。实际上,数值存储为STRING。

    HTH

答案 2 :(得分:0)

除了Peter的所有评论之外,你的问题还没有在第二个FOR

中循环

阅读HELP FOR然后你会尝试这样的事情......

for /f "delims=" %%b in ('"dir e:\*.zip /A-D /OD /B"') do (
  set file=%%b
  if %free:~0,-9% lss 61 del e:\%file%
)

但等等,这里有更多问题:%free%在删除后没有刷新;比较可能不正确;变量%file%没有在每次循环迭代中得到更新......这些可能是其他SO问题的主题。