不知道你所说的“不是循环”是什么意思——有两个循环,但你说每行单独工作?
在我的机器上工作得非常愉快——那你到底是什么意思?
一些可能有帮助的事情:
- 前导
@
仅表示“在执行之前不要将此命令回显到控制台”。一旦@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 值。数值实际上存储为字符串。
高温高压