DOORS 9.6批处理模式下向DXL脚本传递数组参数报错排查
DOORS批处理模式向DXL传递数组参数的解决方案
问题根因
- DXL语法错误:
- 数组初始化使用了双层大括号
{{1,2,3,4}},DXL数组初始化仅支持单层大括号写法,双层大括号属于非法语法,会直接导致DOORS进程启动报错。你命令里的双层大括号是Python.format()方法输出单个大括号的转义写法,直接在cmd执行测试命令时必须去掉一层。 - 测试DXL脚本存在语法笔误:输出语句缺少流运算符、笔误写了不存在的
couts方法,会导致脚本执行中断。
- 数组初始化使用了双层大括号
- 路径与重定向逻辑错误:
- 命令中
script.dxl使用相对路径,DOORS批处理模式不会从当前工作目录查找脚本,会直接报文件不存在错误。 - 直接把
> D:\output.txt重定向语法拼入subprocess调用的命令字符串无效,subprocess默认不会调用cmd shell解析重定向规则,导致输出文件永远不会生成。 - 你测试命令外层包裹的
r'...'是Python原始字符串标记,直接在cmd执行时会被识别为命令的一部分,触发路径找不到错误。
- 命令中
- 未做异常捕获:没有重定向stderr流,DOORS批处理报错时不会弹出明确提示,只能看到cmd窗口闪退,无法定位问题。
正确实现方式
1. 可直接在cmd执行的正确命令
注意替换所有路径为绝对路径,加2>&1将错误流也重定向到输出文件方便排查:
"C:\Program Files\IBM\Rational\DOORS\9.6\bin\doors.exe" -d 36677@server.com -u user -P passw -p PRJ -dxl "int reqName[]={1,2,3,4}; string planned=\"TestPlanned 1\"; string result=\"TestResult 1\";" -batch "D:\script\script.dxl" > D:\output.txt 2>&1
2. Python调用的正确实现
不要用字符串拼接命令,使用参数列表传参避免转义问题,通过subprocess自身参数实现输出重定向,不要把重定向语法写在命令里:
import subprocess # 待传递的参数 int_arr = [1,2,3,4] planned_text = "TestPlanned 1" result_text = "TestResult 1" # 拼接合法的DXL内联代码,自动处理大括号转义、数组格式转换 dxl_code = f''' int reqName[]={{{','.join(map(str, int_arr))}}}; string planned="{planned_text.replace('\\', '\\\\').replace('"', '\\"')}"; string result="{result_text.replace('\\', '\\\\').replace('"', '\\"')}"; ''' # 命令参数列表,所有路径使用绝对路径 cmd_args = [ r"C:\Program Files\IBM\Rational\DOORS\9.6\bin\doors.exe", "-d", "36677@server.com", "-u", "user", "-P", "passw", "-p", "PRJ", "-dxl", dxl_code, "-batch", r"D:\script\script.dxl" ] # 执行命令,将标准输出、错误输出统一写入文件 with open(r"D:\output.txt", "w", encoding="utf-8") as out_file: subprocess.run( cmd_args, stdout=out_file, stderr=subprocess.STDOUT, check=True )
传递字符串数组时逻辑完全一致,拼接DXL代码时给每个字符串元素包裹双引号即可,例如string strArr[]={"val1","val2","val3"};
3. 修正后的测试DXL脚本
修正语法错误,增加变量存在性判断避免未定义报错:
if (exists(planned)) cout << planned << "\r\n" if (exists(result)) cout << result << "\r\n" if (exists(reqName)) print sizeof(reqName) "\n"
注意事项
- DOORS批处理模式下所有路径必须用绝对路径,不要依赖当前工作目录查找文件。
- 拼接DXL代码时必须对字符串里的反斜杠、双引号做转义,否则会触发DXL语法错误。
- 调试阶段一定要把stderr重定向到输出文件,绝大多数报错都是语法错误、权限不足、路径不存在这类基础问题,查看错误流可以快速定位。
内容的提问来源于stack exchange,提问作者Catosh
相关产品推荐
相关产品推荐

