【问题标题】:Node.js run command line (child_process?)Node.js 运行命令行(child_process?)
【发布时间】:2021-02-18 06:33:02
【问题描述】:

我有一个 Node.js 程序,我需要在其中单击按钮,在 Windows 命令行中运行 2 个命令。例如,我试图通过单击按钮来自动化的过程可以通过转到 cmd 并输入以下命令来手动完成:

pushd \\myserver.com\folder1\folder2         //Connect to remote server folder structure
mkdir NewFolder                              //Create new folder in the remote folder

我发现很多资源都指出我应该使用“child_process”,但是当涉及到 shell 脚本时,我完全迷失了方向,并且很难弄清楚如何做到这一点。这是我到目前为止的代码:

var cp = require('child_process');
cp.exec('pushd \\\\myserver.com\\folder1\\folder2\\', { shell: '/bin/bash' }, function(err, stdout, stderr){
    if(err){
        console.log(err);        
    }
});

但是上面的代码只是返回这个错误(奇怪地从给定的目录中删除了'\'):

{ Error: Command failed: pushd \\myserver.com\folder1\folder2\
/bin/bash: line 1: pushd: \myserver.comfolder1folder2: No such file or directory
    at ChildProcess.exithandler (child_process.js:281:12)

  killed: false,
  code: 1,
  signal: null,
  cmd: 'pushd \\\\myserver.com\\folder1\\folder2\\' }
/bin/bash: line 1: pushd: \myserver.comfolder1folder2: No such file or directory

我真的迷路了,如果有任何帮助,我将不胜感激。您必须对 child_process 进行任何替代也可能非常有帮助。谢谢!

【问题讨论】:

  • 您使用的是什么 bash?这真的与节点或javascript无关。 exec 也将删除新工作目录的上下文,因此您的 mkdir 2nd 命令将不起作用。你应该考虑用典型的文件系统调用来做,而不是去壳。
  • @DanielA.White 您能否详细说明“典型的文件系统调用”?如果您的意思是 fs.mkdir() 我得出的结论是无法在远程服务器中使用 fs 并且它只能在本地工作。这实际上是导致我尝试这种 cmd 方式的原因。有什么建议么?我已经被这个问题困扰了几个星期了
  • 您可能希望将共享挂载为卷,然后执行fs.mkdir
  • bash 不理解 unc 路径

标签: javascript node.js windows command-line child-process


【解决方案1】:

通常所有用于字符串的转义序列都使用 '\\' 作为单个反斜杠。可以理解你这里用的是windows的目录路径。

在 JS 中,特别是 '\\' 并不是这样工作的

'abc\
def' == 'abcdef' // true

'\a' == 'a' // true

当 '\' 后面没有任何特殊含义的字符时,它被认为是 LineContinuation。

从错误输出中可以看出,使用 '\\\\myserver.com' 被视为 '\myserver.com'。简单的解决方法是使用 '\\\\' 作为单个 '\' 或使用 '/' 进行路径分隔,我不太确定 shell 是否会执行它。 这是详细解释它的博客之一Link

【讨论】: