在循环内使用延迟扩展,如果语句给我不正确的结果
@ECHO OFF SETLOCAL ENABLEDELAYEDEXPANSION SET volume=k: SET REQUIRED_SPACE=1073741824 FOR /f "tokens=1* delims=:" %%i IN ('fsutil volume diskfree %volume%') DO ( SET FREE_SPACE=%%j ) SET FREE_SPACE=!FREE_SPACE: =! IF NOT %FREE_SPACE% LSS %REQUIRED_SPACE% ( ECHO %FREE_SPACE% not less %REQUIRED_SPACE% )ELSE ECHO %FREE_SPACE% less %REQUIRED_SPACE% FOR /l %%A IN (1,1,1) DO ( FOR /f "tokens=1* delims=:" %%i IN ('fsutil volume diskfree %volume%') DO ( SET FREE_SPACE=%%j ) SET FREE_SPACE=!FREE_SPACE: =! IF NOT !FREE_SPACE! LSS !REQUIRED_SPACE! ( ECHO !FREE_SPACE! not less !REQUIRED_SPACE! )ELSE ECHO !FREE_SPACE! less !REQUIRED_SPACE! ) pause
结果是:
268685312 less 1073741824 268685312 not less 1073741824 Press any key to continue . . .
我不明白什么是错的。
在else … else中需要使用ELSE
括号和ELSE
关键字之间的空格。
批处理对SET
语句中的空格敏感。 SET FLAG = N
将名为“FLAG Space ”的变量设置为“ Space N”的值
语法SET "var=value"
(其中值可以是空的)用于确保所分配的值中不包括任何杂散尾随空格。 set /a
可以安全地使用“无引号”。
(这在你设置的“required_space”中是很重要的,后者包含一个尾部空间, 但对if
语句没有任何影响;只是需要注意的事项)
请注意,您正在接近批次数字范围的限制-2147483648..2147483647。 如果任何一个值比较超过这个限制,你需要转换为字母模式,并填充你的值与前导字符,例如
set "padded_var= %var%" set "padded_var=%padded_var:~-25%"
填充字符( 这里)不是特别重要的,是响应
0
(但可能需要一个非数字包括,以确保它不被解释为八进制)如果分隔符像空格使用然后“引用参数”。 这个想法是使两个值的长度相同,以便逐字符的从左到右的比较按预期进行。 空间是“普遍的选择”,因为它把最少的正常字符排序。