2

我目前正在将 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 的源参数需要反斜杠,而目标参数使用斜杠?

  • 我正在使用子进程模块的 spawn 功能。似乎这并没有逃脱任何东西。我试图查看 nodejs 的代码,但是……这并不容易!spawn 函数是否会转义命令?

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

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

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

4

2 回答 2

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

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

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

于 2013-10-09T12:48:15.103 回答
0

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

例如:

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

希望这可以帮助...

于 2014-01-16T14:12:14.200 回答