You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Batch脚本输出set命令而非预期集合值的问题求助

问题根源

你的脚本有两个关键问题:

  1. 变量扩展时机错误:循环里的%i%是预解析的,在for循环执行前就被替换成初始值0,不管循环中i怎么递增,实际用的都是0,所以输出里一直是!MY_REG_VALUES:~0,1!。
  2. 字符串截取不适合多元素列表:!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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 10:51:09