批处理文件中变量二次传递失败问题求助
批处理文件中变量二次传递失败问题求助
看起来你遇到的是批处理循环变量作用域的典型问题,我来帮你拆解和解决:
问题根源
批处理里的for循环变量(比如你用的%%b)只在循环的代码块内部有效。当循环执行完毕后,这个循环变量就会失效,所以你在循环外面调用atlas.DeviceRegistration.exe时写%%b,系统会把它当成普通字面量%b来处理,自然没法传递正确的注册表值。
解决方案
你需要把循环中获取到的%%b值,保存到一个普通的环境变量中,然后在后续命令里使用这个环境变量即可:
修正后的代码示例:
@echo off :: 初始化变量避免空值干扰 set "SN=" :: 从注册表读取序列号并保存到环境变量SN中 For /F "tokens=2* skip=2" %%a in ('reg query "HKLM\SOFTWARE\XXXXXX Systems\XXXXXaway" /v "SerialNumber"') do ( set "SN=%%b" ) :: 先检查变量是否获取成功,再执行后续命令 if defined SN ( "c:\program files (x86)\carefusion\RSS Component Manager\Tools\atlas.DeviceRegistration.exe" environment=SQE serialnumber=%SN% displayname=%computername% "devicetype=XXXXXX 2" "sapshipto=27703" ) else ( echo 未能成功读取注册表中的序列号! pause )
额外提示
- 如果你的系统是64位,而目标程序是32位的,注册表路径可能需要改为
HKLM\SOFTWARE\Wow6432Node\XXXXXX Systems\XXXXXaway,或者在reg query命令后加上/reg:32参数,指定查询32位注册表分支。 - 如果后续命令需要嵌套在
if/for这类代码块内部执行,你还需要开启延迟变量扩展,在脚本开头加上setlocal enabledelayedexpansion,然后用!SN!代替%SN%来调用变量。
备注:内容来源于stack exchange,提问作者GenShira
相关产品推荐
相关产品推荐

