如何在Node-RED exec node命令中转义空格

时间:2017-01-05 00:41:01

标签: node.js node-red

情况:

在我的Node-RED流程中,调用另一个程序,我使用exec节点。 参数在函数节点中设置,并作为msg.payload传递给exec节点。 只要命令中没有空格,这样就可以正常工作并返回预期的结果。

问题:

客户不能在他的系统上使用对命令的调用,因为安装程序的路径包含空格。

我尝试过但没有工作:

  1. 使用^在另一个问题中读取空格:/opt/path^ toProgram^ directory/program
  2. 使用\\/opt/path\\ toProgram\\ directory/program
  3. 转义空白
  4. 使用"""/opt/path toProgram directory/program"
  5. 引用整个字符串
  6. 引用整个字符串并转义空白:"/opt/path\\ toProgram\\ directory/program"
  7. 使用'''/opt/path toProgram directory/program'
  8. 引用整个字符串
  9. 将命令行留空/ ""并将上述任何一点与其参数组合到一个字符串(在为该exec节点设置参数的函数节点中)并将其作为msg传递。有效载荷 - > exec节点配置面板中的输入参数。没有成功。
  10. 什么不是问题:

    • 程序本身运行良好,在我的和客户系统上,它只是不同的路径

    • 除了具有空格的特定命令字符串之外,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

    截图

    这是流程的一部分:flow excerpt

    此配置有效:command without whitespace

    此配置不起作用: command with whitespace

2 个答案:

答案 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节点的命令部分中正确执行二进制文件