带有Child_Process的NodeJS - 如何转义我的命令

时间:2013-10-09 09:54:37

标签: javascript node.js unix batch-file child-process

我目前正在使用带有child_process模块​​的nodejs。我们正在试验一些奇怪的批次。

基本上,我们只想使用xcopy命令复制文件。

例如,我们这样做:

xcopy "C:/my/path/myfile.test" "C:/my/path/mynewfile.test*" => Does not work. Windows needs backslash
xcopy "C:\my\path\myfile.test" "C:/my/path/mynewfile.test*" => Does not work. We need to escape backslash
xcopy "C:\\my\\path\\myfile.test" "C:/my/path/mynewfile.test*" => Works...

所以我有一些问题。

  • 为什么xcopy的source参数需要反斜杠 destination参数与斜杠一起使用?

  • 我正在使用spawn function of the child process module。这似乎没有逃避任何事情。我试着看看nodejs的代码但是很好......这并不容易! spawn函数是否会逃避命令?

  • 如果我们确实需要自己逃避命令,那么我们也想在UNIX上执行命令。所以我认为逃避方法不一样。我宁愿做一个

      if(window)
         escapeshellargWindow(arg)
      else if(unix)
         escapeshellargLinux(arg)
    

还有其他人遇到过这类问题吗?

2 个答案:

答案 0 :(得分:2)

不熟悉Windows,但我的猜测是第一个参数中的正斜杠可能会被解析为xcopy命令的选项。以下任何参数都不会被处理,因此会起作用。

至于转义,问题不是spawn,而是使用\在文字Javascript字符串中转义的一般方法。所以,如果你使用它:

spawn('xcopy', [ 'C:\my\path\myfile.test', ... ])

然后这是spawn将收到的内容(arguments):

{ '0': 'xcopy', '1': [ 'C:mypathmyfile.test' ] }

同样地:

> console.log( 'C:\my\path\myfile.test' )
C:mypathmyfile.test

因此,如果要为JS字符串添加反斜杠,则需要将其转义:

> console.log( 'C:\\my\\path\\myfile.test' )
C:\my\path\myfile.test

但这仅适用于代码中的 literal 字符串(在JS中硬编码)。对于以某种形式计算或传递的字符串(例如process.argv中的命令行),不需要额外的转义。

由于spawn对于传递给它的内容是不可知的,因此它不会自行转义。

答案 1 :(得分:0)

我发现使用正斜杠表示文件夹边界的参数和反斜杠 一贯的工作。

例如:

xcopy / S / I / D / Y“DRIVE:\ Folder1 \ Folder2”“。\ Folder1”

希望这会有所帮助......