不知道你所说的“不是循环”是什么意思——有两个循环,但你说每行单独工作?
在我的机器上工作得非常愉快——那你到底是什么意思?
一些可能有帮助的事情:
- 前导
@仅表示“在执行之前不要将此命令回显到控制台”。一旦@echo off执行了一条指令,命令的回显就会停止,因此@是多余的。它is需要@echo off命令,因为否则关闭回显的指令本身就会被ECHO编辑。
- 每个都
setlocal启动一个新的本地环境,继承所有当前的环境变量。使用两个并没有错,它只是多余的。setlocal enableextensions enabledelayedexpansion就足够了。你没有delayedexpansion在这个例程中使用,所以that它本身就是多余的。的默认状态CMD.EXE是enableextensions。您必须对扩展采取明确的措施DISABLE- 大多数批处理程序将假定默认条件。
- 在我的机器上,可用空间是线上的第 8 个标记,而不是第 7 个。如果您的相同,
:这将加载。free
- 命令周围的双引号
dir是多余的。执行单引号之间的命令。添加双引号没有任何作用,除非在要执行的命令中有单引号。
- 可悲的是,
IF比较可能会出错。Any%var%在指令执行之前被解析,因此应该free包含少于 9 个字符,%free:~0:-9%将被解析为 [nothing] 并且指令将被执行,因为if lss 61...这将是一个语法错误。请注意,在您的情况下,free甚至:在更正之后,您的可用字节数可能少于 1000000000,%free:~0:-9%将被解析为空并生成错误。
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%"
(案例是多余的 - CAPS 的变化。元变量 FOR 的案例%%x很重要)
请注意,严格来说,即使 SETLOCAL 也是多余的,但它确实确保了该批处理在终止后不会影响环境的状态。
语法SET "var=somethingorevennothing"很重要。一个简单的SET语句是针对 STRINGS 的,所以 SPACES 很重要。如果在 the 之前出现空格,=则它包含在正在设置的变量名中。如果行尾有空格,也包括在内。引用 SET 解决了第二个问题。警惕战胜了第一个。
SET /A忽略这些空格,但只能用于设置 NUMERIC 值。数值实际上存储为字符串。
高温高压