情况:
在我的Node-RED流程中,调用另一个程序,我使用exec节点。 参数在函数节点中设置,并作为msg.payload传递给exec节点。 只要命令中没有空格,这样就可以正常工作并返回预期的结果。
问题:
客户不能在他的系统上使用对命令的调用,因为安装程序的路径包含空格。
我尝试过但没有工作:
/opt/path^ toProgram^ directory/program
\\
:/opt/path\\ toProgram\\ directory/program
""
:"/opt/path toProgram directory/program"
"/opt/path\\ toProgram\\ directory/program"
''
:'/opt/path toProgram directory/program'
""
并将上述任何一点与其参数组合到一个字符串(在为该exec节点设置参数的函数节点中)并将其作为msg传递。有效载荷 - > exec节点配置面板中的输入参数。没有成功。什么不是问题:
程序本身运行良好,在我的和客户系统上,它只是不同的路径
除了具有空格的特定命令字符串之外,exec节点及其msg.payload(=输入参数或参数)的配置以及"使用spawn()而不是exec() ?"很好,工作
请求
有没有其他方法可以逃避我不知道的空白,从而可以找到程序的路径?根据我的理解,空格被解释为输入参数的分隔符,它应该是,但不是命令字符串。 在我看来,这应该是一个快速解决方案,但似乎没有什么工作通常适用于node,js,php或bash ..提前感谢任何提示和想法!
环境:
Node-RED版本:v0.15.2 | Node.js版本:v5.12.0 | Mac OS X 10.11.6 = Darwin 15.6.0 x64 LE
截图
答案 0 :(得分:1)
经过一夜好眠之后,解决方案(至少我当时的想法)是在节点 - 红色本身中调整exec节点:原始代码将附加参数(由空格分隔的参数)附加到命令,然后用空格将整个字符串切成数组(node.cmd是带或不带空格的命令的路径):
之前:var arg = node.cmd; arg += " "+msg.payload; arg = arg.match(/(?:[^\s"]+|"[^"]*")+/g);
和(之前的,不完整的)解决方案是在切片操作之后将带有内置array.unshift(<value>)
函数的命令添加到数组中,以便具有空白的命令路径不受数组创建的影响:< / p>
之后:var arg = "";
...添加msg.payload并将arg字符串切片到数组中.. arg.unshift(node.cmd);
该文件位于:nodered node 75-exec.js on github,在第46-51行
中经过进一步调查后很清楚,Use spawn() instead of exec()?
选项是问题所在:带双引号空格和使用exec()的命令部分工作正常。当命令路径包含参数时,我的方法无法使用,例如在/home/foo bar/date -r 1000
。
在the official github repository of node-red处的问题之后,命令部分在切片之后的开头的arguments数组中,而是使用带引号的空格的命令路径,然后解包它们,在使用exec()时复制行为。他在第51行:if (/^".*"$/.test(cmd)) { cmd = cmd.slice(1,-1); }
之后在原始文件中添加了这一行,现在spawn()和exec()的工作方式相同 - 对他来说很遗憾,不幸的是我不知道他的用户名。
答案 1 :(得分:1)
我刚刚对此进行了测试,选项3(使用&#34引用路径;&#34;)运行正常。
将"/home/foo/foo bar/date"
放在exec节点的命令部分中正确执行二进制文件