我目前正在使用带有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)
还有其他人遇到过这类问题吗?
答案 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”
希望这会有所帮助......