使用Node JS中的回调函数执行Powershell脚本

时间:2018-06-21 11:27:16

标签: javascript node.js powershell

我编写了一个节点JS脚本,该脚本应使用PowerShell命令行执行。然后将PowerShell响应返回给angularjs。 PowerShell命令执行需要5分钟以上的时间。因此,节点正在向angularjs发送空响应。为此,我尝试了回调函数。但是我得到了同样的空洞回应。请帮我解决这个问题。

这是用于在节点js中使用回调函数执行powershell的代码

let ps = new shell({
        executionPolicy: 'Bypass',
        noProfile: true
    });

function getData(callback){
    ps.addCommand('C:/Users/sowmi096/Desktop/Code/jobid.ps1',a)
    ps.invoke()
    .then(output => {
        return callback(null,output);
    })
    .catch(err => {
        return callback(null,err);
        ps.dispose();
    });
}
getData(function onGetData(err,data){
    if(err)
        res.send(err);
    res.send(data);
});

2 个答案:

答案 0 :(得分:0)

这里提出了一个非常类似的问题:

Execute Powershell script from Node.js

有人建议使用Edge.js库。它允许从Node内部执行各种语言。包括C#,J#、. Net,SQL,Python,PowerShell和其他CLR语言。请注意,Edge.js需要PowerShell 3.0,并且只能在Windows上运行,但是许多其他功能也可以在Mac和Linux上运行。

Javier Castro还有一个代码示例,可以从Powershell返回结果。

答案 1 :(得分:0)

tl;博士

要使PowerShell命令完成执行,必须调用ps.dispose()


您似乎正在使用node-powershell npm package,并尝试修改其示例代码。

不幸的是,在撰写本文时,this sample code is flawed是因为成功案例中缺少对ps.dispose()代码的调用,这意味着PowerShell命令永远不会退出。

这是一个可行的示例(假设该软件包是通过npm install node-powershell安装的):

const shell = require('node-powershell')

let ps = new shell({
  executionPolicy: 'Bypass',
  noProfile: true
});

// You can pack everything into the 1st argument or pass arguments as
// parameter-name-value objects; note the need to use null for [switch] parameters.
ps.addCommand("write-verbose", [ { verbose: null }, { message: 'hello, world'} ])

// IMPORTANT: ps.dispose() MUST be called for execution to finish.
ps.invoke()
  .then(output => {
    console.log(output)
    ps.dispose()  // This was missing from your code.
  })
  .catch(err => {
    console.log(err)
    ps.dispose()
  });