批处理脚本RAM分支判断异常:所有取值均触发最后一条if语句
问题分析与解决方案
核心问题
你的批处理脚本存在两个关键错误:
- 延迟扩展未正确使用:开启
EnableDelayedExpansion后,仍用%ram%读取变量值。批处理中%变量%会在代码块解析阶段就完成展开,此时ram还未被PowerShell的赋值语句更新,导致判断用的是旧值甚至空值。 - 浮点数的字符串比较异常:PowerShell返回的RAM容量是浮点数(比如8GB会返回
8.0),批处理的lss/geq是字符串比较逻辑,按ASCII码顺序对比时,"8.0"会被判定为大于"16"(因为第一个字符8的ASCII码比1大),直接跳过前两个判断分支,触发最后一条geq 32的逻辑。
修改后的脚本
:function.texture_streaming setlocal EnableDelayedExpansion :: 获取整数形式的总RAM容量 for /f "usebackq tokens=*" %%a in ( `PowerShell -Command "[int]((Get-WmiObject Win32_PhysicalMemory | Measure Capacity -Sum).Sum/1GB)"` ) do ( set "ram=%%a" ) :: 用延迟扩展的变量语法读取最新值 if !ram! lss 16 ( call :error.insufficient_ram "!ram!" endlocal goto :prompt.performance ) if !ram! geq 16 if !ram! lss 32 ( call :subroutine.limited_texture_streaming endlocal goto :prompt.performance ) if !ram! geq 32 ( call :subroutine.full_texture_streaming endlocal goto :prompt.performance ) endlocal goto :prompt.performance
关键修改说明
- 在PowerShell命令中加入
[int]强制将结果转换为整数,确保返回8/16/32这类纯整数值,规避字符串比较的逻辑错误。 - 将所有判断条件中的
%ram%替换为!ram!,确保每次判断都能获取到PowerShell赋值后的最新变量值。 - 去掉判断条件中变量和数值的引号,直接以整数形式比较,批处理会自动按数值逻辑处理,而非字符串逻辑。
内容的提问来源于stack exchange,提问作者leiseg
相关产品推荐
相关产品推荐

