【问题标题】:NodeJS with Child_Process - How to escape my commandNodeJS with Child_Process - 如何逃避我的命令
【发布时间】:2014-01-16 22:12:14
【问题描述】:

我目前正在将 nodejs 与 child_process 模块一起使用。我们正在尝试一些奇怪的批处理操作。

基本上,我们只想使用 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 参数需要反斜杠,而 目标参数与斜杠一起使用吗?

  • 我正在使用spawn function of the child process module。似乎这并没有逃脱任何东西。我试图查看 nodejs 的代码,但是……这并不容易! spawn 函数是否会转义命令?

  • 如果我们确实需要自己转义命令,那么我们也想在 UNIX 上执行我们的命令。所以我认为转义方法不一样。而且我不想做一个

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

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

【问题讨论】:

  • 始终在 Windows 命令提示符下使用单反斜杠。它不需要转义(除了 for 循环中的一些 wmic 命令)。
  • @Endoro:感谢您的回答。但是,我没有在 Windows 命令提示符中执行这些命令。我用 nodejs 的 child_process 执行它们。这就是我遇到这些问题的原因。

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


【解决方案1】:

不熟悉 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 不知道您传递给它的内容,因此它不会进行任何转义。

【讨论】:

    【解决方案2】:

    我发现参数使用正斜杠,文件夹边界使用反斜杠 始终如一地工作。

    例如:

    xcopy /S /I /D /Y "DRIVE:\Folder1\Folder2" ".\Folder1"

    希望这会有所帮助...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-07
      • 2020-12-13
      • 2021-09-08
      • 1970-01-01
      • 1970-01-01
      • 2011-06-01
      • 2022-08-14
      相关资源
      最近更新 更多