如何在Javascript中执行shell命令

IT技术 javascript shell command-line
2021-01-15 13:53:03

我想编写一个 JavaScript 函数,它将执行系统 ​​shell 命令(ls例如)并返回值。

我如何实现这一目标?

6个回答

这里的许多其他答案似乎从浏览器中运行的 JavaScript 函数的角度解决了这个问题。我会假设当提问者说“Shell Script”时他指的是 Node.js 后端 JavaScript,我将进行拍摄和回答。可能使用commander.js来使用你的代码框架:)

您可以使用节点 API 中child_processmodule。我粘贴了下面的示例代码。

var exec = require('child_process').exec, child;

child = exec('cat *.js bad_file | wc -l',
    function (error, stdout, stderr) {
        console.log('stdout: ' + stdout);
        console.log('stderr: ' + stderr);
        if (error !== null) {
             console.log('exec error: ' + error);
        }
    });
 child();

希望这可以帮助!

除了一件事。你会得到错误“孩子不是一个函数”。调用 exec() 执行命令 - 无需调用 child()。不幸的是,只要子进程有内容要输出,回调就不会被调用——它只在子进程退出时被调用。有时这没问题,有时则不然。
2021-04-03 13:53:03
为避免回调,您可以使用execSync
2021-04-04 13:53:03
谁谈过浏览器?它只说 JavaScript,仅此而已。
2021-04-07 13:53:03

不知道为什么之前的答案给出了各种复杂的解决方案。如果您只想执行像 那样的快速命令ls,则不需要 async/await 或回调或任何东西。这就是你所需要的 - execSync

const execSync = require('child_process').execSync;
// import { execSync } from 'child_process';  // replace ^ if using ES modules
const output = execSync('ls', { encoding: 'utf-8' });  // the default is 'buffer'
console.log('Output was:\n', output);

对于错误处理,在语句周围添加一个try/catch块。

如果您运行的命令需要很长时间才能完成,那么是的,请查看异步exec函数。

已确认适用于 Windows。此外,我看到有一个shell选项可以指定“用于执行命令的 Shell”。默认值:Unix 上的“/bin/sh”,Windows 上的 process.env.ComSpec。
2021-03-16 13:53:03
execSync 是否适用于 Mac、Linux 和 Windows 命令?
2021-04-07 13:53:03

……几年后……

ES6 已被接受为标准,而 ES7 即将到来,因此值得更新答案。我们以 ES6+async/await 和 nodejs+babel 为例,先决条件是:

您的示例foo.js文件可能如下所示:

import { exec } from 'child_process';

/**
 * Execute simple shell command (async wrapper).
 * @param {String} cmd
 * @return {Object} { stdout: String, stderr: String }
 */
async function sh(cmd) {
  return new Promise(function (resolve, reject) {
    exec(cmd, (err, stdout, stderr) => {
      if (err) {
        reject(err);
      } else {
        resolve({ stdout, stderr });
      }
    });
  });
}

async function main() {
  let { stdout } = await sh('ls');
  for (let line of stdout.split('\n')) {
    console.log(`ls: ${line}`);
  }
}

main();

确保你有 babel:

npm i babel-cli -g

安装最新预设:

npm i babel-preset-latest

通过以下方式运行它:

babel-node --presets latest foo.js
如果你只需要执行一个快速命令,所有的 async/await 都是多余的。你可以只使用execSync
2021-03-28 13:53:03
没有人要求提供 Node.js 解决方案。它只说 JavaScript。
2021-04-01 13:53:03
@Virus721:您想在哪个 JavaScript 运行时执行 shell 命令?
2021-04-06 13:53:03

这完全取决于 JavaScript 环境。请详细说明。

例如,在 Windows Scripting 中,您可以执行以下操作:

var shell = WScript.CreateObject("WScript.Shell");
shell.Run("command here");
这就是我一直在寻找的。那些谈论他们的 Node.js 的人很烦人。谁在这里要求使用 Node.js?没有人这样做。
2021-03-13 13:53:03
是否有可能在类似 Unix 的操作系统(如 Linux)中做同样的事情?
2021-04-07 13:53:03
我们如何运行这个命令: route print -4 | 找到 \"TAP-Windows 适配器\" ?? 我试过但什么都不返回
2021-04-08 13:53:03

简而言之:

// Instantiate the Shell object and invoke its execute method.
var oShell = new ActiveXObject("Shell.Application");

var commandtoRun = "C:\\Winnt\\Notepad.exe";
if (inputparms != "") {
  var commandParms = document.Form1.filename.value;
}

// Invoke the execute method.  
oShell.ShellExecute(commandtoRun, commandParms, "", "open", "1");
不熟悉那个特定的外壳“NutShell”;)
2021-03-25 13:53:03
似乎有很多关于它在哪个 Web 浏览器中运行的问题,但人们应该意识到 JavaScript 也是一种完全有效的 Windows shell 脚本语言。
2021-03-31 13:53:03