我通过ssh从Robot Framework测试用例查询MS SQL表,并希望在查询结果中将Tab作为分隔符,因此我尝试传递选项-s“< Tab>”到sqlcmd。在Robot Framework中,我尝试了以下语法:
|${result} =|run process|ssh|admin@${SRV_IP}|sqlcmd|-S|.\\\\SQLEXPRESS|-d|${DB_NAME}|-s|\t|-W|-Q|"select ..."|
但显然\ t序列没有像我在日志中看到的那样扩展为Tab字符
10:47:32.411 INFO Starting process: ['ssh', 'admin@192.168.77.129', 'sqlcmd', '-S', '.\\\\SQLEXPRESS', '-d', 'test_main', '-s', '\t', '-W', '-Q', '"select ...;"']
执行stderr命令后
Sqlcmd:' - s':缺少参数。输入' - ?'寻求帮助。
我还尝试写\ x09而不是\ t但是\ t无论如何都出现在日志中。 Tab的语法是什么,当它作为命令行参数传递给进程时会被展开?
我假设我可以通过指定shell = True并将整个命令行写入一个字符串但是为Python语法手动转义一次字符而对shell语法进行两次转换变得麻烦,所以我不会立即这样做
答案 0 :(得分:1)
解决方案是添加更多反斜杠。在sqlcmd看到它之前很久就会被机器人吃掉第一个反斜杠。您可能需要两个反斜杠,可能需要三个或四个反斜杠。这取决于在最终执行命令之前还有什么替换。既然你有机器人调用ssh调用sqlcmd,你可能需要几个。
虽然反斜杠的数量是确定性的,但经验告诉我,有时最简单的事情就是不断添加更多直到它起作用。