CMD 脚本:"for"循环中未正确计算变量



我制作了一个cmd脚本来获取电脑中每个驱动器的可用空间,并在低于某个值(常数"MyLimit"(时发送警报。我发现在我的";对于";循环(驱动器列表中的循环(

这就是";对于";循环:

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总是假定";对于";环那么IF总是失败。。。

错误在哪里?

感谢您对的支持

Ale

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

@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(来强制发送消息。。。

只是代码中的一个小问题:元变量%%a的行为与正常的%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个字符,这样在不久的将来,当磁盘变得更大时,你就不会有麻烦了。(

最新更新