Batch脚本输出set命令而非预期集合值的问题求助
问题根源
你的脚本有两个关键问题:
- 变量扩展时机错误:循环里的
%i%是预解析的,在for循环执行前就被替换成初始值0,不管循环中i怎么递增,实际用的都是0,所以输出里一直是!MY_REG_VALUES:~0,1!。 - 字符串截取不适合多元素列表:
!MY_REG_VALUES:~%i%,1!是按单个字符截取字符串,但你的值是空格分隔的独立元素,这种方式拿不到12000、450这类完整数值。
修复方案
下面是两种简单可行的修复方式,优先选第一种,更直观高效:
方案一:用数组存储值列表
把值列表转成数组,循环时按索引同步取值:
@echo off setlocal enabledelayedexpansion rem 定义寄存器地址和对应值 set MY_REG_ADDRESSES=3 22 28 29 31 32 21 51 94 97 104 105 77 set MY_REG_VALUES=4 12000 450 40 100 40 1440 100 450 10000 0 0 1000 rem 将值列表存入数组,索引从1开始 set idx=0 for %%v in (%MY_REG_VALUES%) do ( set /a idx+=1 set value[!idx!]=%%v ) rem 遍历地址列表,同步取对应索引的值 set idx=0 for %%a in (%MY_REG_ADDRESSES%) do ( set /a idx+=1 echo modpoll -r %%a -t 4 -4 1 COM3 !value[!idx!]! ) endlocal
方案二:同步遍历两个列表
通过文本流转换,让for循环同时读取地址和值:
@echo off setlocal enabledelayedexpansion set "MY_REG_ADDRESSES=3 22 28 29 31 32 21 51 94 97 104 105 77" set "MY_REG_VALUES=4 12000 450 40 100 40 1440 100 450 10000 0 0 1000" rem 把空格分隔的列表转成每行一个元素 set "addr_lines=" for %%a in (%MY_REG_ADDRESSES%) do set "addr_lines=!addr_lines!%%a\n" set "val_lines=" for %%v in (%MY_REG_VALUES%) do set "val_lines=!val_lines!%%v\n" rem 按行号同步读取地址和值 for /f "tokens=1,* delims=:" %%x in ('echo !addr_lines!^|findstr /n "."') do ( for /f "tokens=2 delims=:" %%y in ('echo !val_lines!^|findstr /n "." ^|findstr "^%%x:"') do ( echo modpoll -r %%y -t 4 -4 1 COM3 %%z ) ) endlocal
关键说明
- 必须启用
setlocal enabledelayedexpansion,这样循环里的动态变量值(比如!idx!、!value[!idx!]!)才能被正确解析。 - 方案一的数组方式最适合你的场景,两个列表长度一致时,能精准对应每个地址和值。
内容的提问来源于stack exchange,提问作者Jimmy Fredrickson
相关产品推荐
相关产品推荐

