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

Batch file 基于剩余空间和最旧文件的清理实用程序,batch-file,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

我想为我的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
每一行似乎都是单独工作的,但不是循环。 你能帮帮我吗

提前感谢=)

试试这个:

@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
不知道你说的“不是循环”是什么意思-有两个循环,但你说每一行都是分开工作的

在我的机器上工作得很愉快-那么你到底是什么意思

以下几点可能会有所帮助:

  • 前导的
    @
    仅表示“在执行此命令之前不要将其回显到控制台”。执行
    @echo off
    指令后,命令的回显将停止,因此
    @
    是冗余的。在
    @echo off
    命令中需要
    ,因为否则关闭echo的指令本身就是
    echo
    ed
  • 每个
    setlocal
    都会启动一个新的本地环境,继承所有当前环境变量。使用两个并没有错,它只是多余的<代码>设置本地启用扩展启用延迟扩展
    就足够了。在此例程中没有使用
    delayedexpansion
    ,因此
    本身就是冗余的。
    CMD.EXE
    的默认状态是
    enableextensions
    。您必须采取显式操作来禁用扩展,大多数批处理程序将采用默认条件

  • 在我的机器上,自由空间是线路上的第八个标记,而不是第七个。如果您的密码相同,则会将
    加载到
    免费密码中
  • 围绕
    dir
    命令的双引号是相等的。执行单引号之间的命令。除非要执行的命令中有一个单引号,否则添加双引号不会起任何作用
  • IF
    比较可能会出现严重错误。任何
    %var%
    都是在执行指令之前解析的,因此如果
    free
    包含的字符少于9个,
    %free:~0:-9%
    将解析为[nothing],并且如果lss 61…
    ,指令将作为
    执行,这将是一个语法错误。请注意,在您的情况下,
    空闲
    可能是
    ,即使在更正后,如果您的空闲字节少于100000000字节,
    %free:~0:-9%
    将被解析为零并生成错误
  • 如果通过
    dir
    命令找不到与您的选择条件匹配的文件,
    文件将包含启动批处理时所具有的任何值。很可能,变量
    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%"
    
    (大小写冗余-大写更改。
    %%x
    的元变量大小写重要)

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

    语法
    设置“var=somethingorevennothing”
    非常重要。一个简单的
    SET
    语句是针对字符串的,所以空格很重要。如果空格出现在
    =
    之前,则它将包含在所设置的变量名中。如果行的末尾有空格,也会包含空格。引用集合克服了第二个问题。警惕战胜了第一个

    SET/A
    忽略这些空格,但只能用于设置数值。这些数值实际上存储为字符串


    HTH

    除了彼得的所有评论之外,你的问题并没有在第二个星期循环

    阅读
    的帮助,然后您可以尝试以下内容

    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问题的主题。

    在我的机器上,自由空间是第五个标记:)就我个人而言,我更喜欢
    tokens=2delims=:
    ,它应该独立于语言,但离开
    free
    时有一个容易克服的前导空间。