Robot Framework中Run Process能否传递带参数的自定义命令?
嘿,这个问题我之前碰到过好多次——从Execute Command切换到Run Process时,很容易因为两者的底层执行逻辑差异踩坑。这个WinError 2本质就是系统找不到你要执行的命令/批处理文件,下面给你几个针对性的解决思路:
1. 优先使用绝对路径指定命令
Run Process对路径的解析比Execute Command严格得多,如果你的自定义批处理或命令不在系统默认的PATH环境变量里,一定要传完整的绝对路径,别依赖系统自动查找。
比如你的批处理my_custom_task.bat在C:\automation_scripts目录下,写法应该是:
${process_output}= Run Process C:\\automation_scripts\\my_custom_task.bat shell=True
(Windows路径里的反斜杠要转义成两个,或者直接用正斜杠C:/automation_scripts/my_custom_task.bat,后者更不容易出错)
2. 必须加shell=True参数(重点!)
这是最常见的诱因!Execute Command默认是通过系统shell(比如Windows的cmd.exe)来执行命令的,它会帮你处理批解析、路径查找这些事;但Run Process默认是直接调用可执行文件,不经过shell。如果你的自定义命令是批处理脚本、或者依赖shell解析的系统内部命令,一定要加上shell=True参数,让它通过shell去执行:
*** Settings *** Library Process Library SSHLib *** Test Cases *** Wait For Background Process To Finish # 等待自定义批处理进程完成,获取执行结果 ${process_result}= Run Process my_custom_command.bat shell=True Log 进程执行状态码:${process_result.returncode} Log 进程输出内容:${process_result.stdout}
加上这个参数后,行为就和Execute Command一致了,系统会帮你找到对应的批处理文件。
3. 正确拆分命令与参数
如果你的命令需要带参数,Run Process要求把命令和每个参数分开作为单独的关键字参数传递,不能像Execute Command那样传一整串字符串。比如原来用Execute Command是:
Execute Command my_script.bat --env test --timeout 300
换成Run Process就得写成:
Run Process my_script.bat --env test --timeout 300 shell=True
要是把整个命令串成一个参数传进去,系统会把这整串当作要执行的文件名,自然会报找不到文件的错误。
4. 可选:指定工作目录
如果你的批处理依赖当前工作目录下的文件(比如读取同目录的配置),还可以用cwd参数指定执行时的工作目录:
Run Process my_script.bat shell=True cwd=C:\\automation_scripts
你可以先从添加shell=True和检查绝对路径开始试,这两个解决了90%以上这类问题。
内容的提问来源于stack exchange,提问作者Sarah

