首页 > 解决方案 > CMD 脚本:在“for”循环中未正确评估变量

问题描述

我制作了一个 cmd 脚本来获取 PC 中每个驱动器的可用空间,并在低于某个值(常量“MyLimit”)时发送警报。我发现在我的“for”循环(驱动器列表中的循环)中没有正确评估变量

这是“for”循环:

Set MyLimit=107374182400
for /f "tokens=1-3" %%a in ('WMIC LOGICALDISK GET FreeSpace^,Name^,Size ^|FINDSTR /I /V "Name"') do (
    
    if not "%%c"=="" (

        echo FreeSpace=%%a
        echo Name=%%b
        echo Size=%%c
        
        if %%a LSS %MyLimit% (
          Echo not enough free space in %%b
        ) else (
            echo "do nothing"
        )    
    )
)

但是变量%%a总是假定“for”循环的最后一个索引的值......那么 IF 总是失败......

错误在哪里?

谢谢你的支持

啤酒

我尝试了你的建议,见下文,但它仍然不起作用,也许我在代码中放了一些错误,我不太确定做得好:

@Echo off
SETLOCAL enabledelayedexpansion

Set GB100=107374182400
Set TB_10=10995116277760

Set MyLimit=%TB_10%

for /f "tokens=1-3" %%a in ('WMIC LOGICALDISK GET FreeSpace^,Name^,Size ^|FINDSTR /I /V "Name"') do (
    
    if not "%%c"=="" (
    
        echo FreeSpace=%%a
        echo Name=%%b
        echo Size=%%c

        call :padNum %%a
        call :padNum MyLimit

        echo %%a
        echo %MyLimit%      

        if "%%a" LSS "%MyLimit%" (
          Echo not enough free space in %%b
        ) else (
            echo "nothing"
        )
    )
)


:padNum
setlocal enableDelayedExpansion
set "n=000000000000000!%~1!"
set "n=!n:~-15!"
endlocal & set "%~1=%n%"
exit /b

我故意设置一个上限(10TB)来强制发送消息......

标签: for-loopbatch-filevariablescmd

解决方案


只是代码中的一个小问题:元变量的%%a行为不像 normal %environmentVariables%,所以你不能像使用它们一样。

@Echo off
SETLOCAL enabledelayedexpansion

Set GB100=107374182400
Set TB_10=10995116277760
Set MyLimit=%TB_10%

for /f "tokens=1-3" %%a in ('WMIC LOGICALDISK GET FreeSpace^,Name^,Size ^|FINDSTR /I /V "Name"') do (
    
    if not "%%c"=="" (
    
        echo FreeSpace=%%a
        echo Name=%%b
        echo Size=%%c
        set free=%%a
        call :padNum free
        call :padNum MyLimit

        echo free=    !free!
        echo MyLimit= !MyLimit!      

        if "!free!" LSS "!MyLimit!" (
          Echo not enough free space in %%b
        ) else (
            echo "nothing"
        )
    )
)
goto :eof

:padNum
setlocal enableDelayedExpansion
set "n=000000000000000000!%~1!"
set "n=!n:~-18!"
endlocal & set "%~1=%n%"
exit /b

(我自由地从 15 个字符扩展到 18 个字符,所以在不久的将来,当磁盘变大时,你不会遇到麻烦。)


推荐阅读