为什么是CMD批IF与延迟扩展给我错误的结果在For循环?

在循环内使用延迟扩展,如果语句给我不正确的结果

@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 (但可能需要一个非数字包括,以确保它不被解释为八进制)如果分隔符像空格使用然后“引用参数”。 这个想法是使两个值的长度相同,以便逐字符的从左到右的比较按预期进行。 空间是“普遍的选择”,因为它把最少的正常字符排序。