我想为我的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
每一行似乎分开工作,但不是循环。 你能帮我吗?
提前致谢=)
答案 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)
不确定你的意思是“不是循环” - 有两个循环,但你说每行都是单独工作的吗?
在我的机器上工作得非常愉快 - 那你究竟是什么意思?
可能有所帮助的一些事情:
@
仅仅意味着'在执行之前不要将此命令回显到控制台'。执行@echo off
指令后,命令的回显停止,因此@
是多余的。 is
命令需要@echo off
,否则关闭回显的指令本身就是ECHO
。setlocal
启动一个新的本地环境,继承所有当前环境变量。使用两个没有错,它只是多余的。 setlocal enableextensions enabledelayedexpansion
就足够了。您未在此例程中使用delayedexpansion
,因此that
本身就是多余的。默认状态CMD.EXE
为enableextensions
。您必须对DISABLE
扩展程序采取明确的操作 - 大多数批处理程序将采用默认条件。:
相同,则会将free
加载到dir
。IF
命令周围的双引号是冗余的。执行SINGLE引号之间的命令。添加双引号什么都不做,除非在命令中有单引号要执行。%var%
比较可能会出错。在执行指令之前解析了任何free
,因此如果%free:~0:-9%
包含少于9个字符,if lss 61...
将被解析为[nothing],指令将被执行为free
这将是一个语法错误。请注意,在您的情况下,:
可能是%free:~0:-9%
,即使在更正后,您的可用空间少于1000000000字节,dir
也会被解析为空,并生成错误。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%"
?因此,最好确保批处理中使用的任何变量都已初始化。所以 - 修改过:
%%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问题的主题。