jjzjj

node.js - 使用 PowerShell Invoke-Command and Process 让标准输出出现在控制台上

coder 2024-06-21 原文

我有一个使用 Invoke-Command 的 Powershell 脚本。这是被调用的代码:

$scriptblock = {
  $process = New-Object system.Diagnostics.Process

  $si = New-Object System.Diagnostics.ProcessStartInfo
  $si.FileName = $cmd
  $si.Arguments = $cmd_args
  $si.UseShellExecute = false
  $si.RedirectStandardOutput = true

  $process.StartInfo = $si
  $process.Start()
  $processId = $process.Id
  $process.WaitForExit()
}

Invoke-Command -ScriptBlock $scriptblock

当脚本从 PowerShell 窗口运行时,该问题与让进程的标准输出显示到 PowerShell 控制台有关。

现在,我确定可执行文件 $cmd 会发送到标准输出,因为当我使用 cmd.exe 运行可执行文件时,它会向该控制台显示输出。当我从 NodeJS 脚本调用此 Powershell 脚本时,我也能够成功重定向输出,如下所示:

var exec  = require('child_process').exec,
var cmd   = 'powershell -ExecutionPolicy Bypass "' + launch_cmd + " \'" + ver + "\'\"";

console.log("\n\tUsing command for NodeJS child process:\n\t\t" + cmd + "\n\n")
child = exec(cmd, { cwd : prj }, function(stdout, stderr){});

child.stdout.on("data",function(data){
    process.stdout.write(data);
});

child.stderr.on("data",function(data){
    process.stderr.write(data);
});

child.on("exit",function(){
    console.log("\n\nFinished Process");
});

我希望能够将 StandardOutput 获取到 PowerShell 控制台。我评论了this TechNet documentation并在脚本 block 中尝试了以下内容,但无济于事:

$scriptblock = {
  $process = New-Object system.Diagnostics.Process

  $si = New-Object System.Diagnostics.ProcessStartInfo
  $si.FileName = $cmd
  $si.Arguments = $cmd_args
  $si.UseShellExecute = false
  $si.RedirectStandardOutput = true

  $process.StartInfo = $si
  $process.Start()
  $process.BeginOutputReadLine()
  $process.StandardOutput.ReadToEnd()
  $processId = $process.Id
  $process.StandardOutput
  $process.WaitForExit()
}

Invoke-Command -ScriptBlock $scriptblock

关于如何使进程将其标准输出显示到 PowerShell 控制台,有什么建议吗?

最佳答案

您需要不断读取 StandardOutput 流,直到进程退出以获取所有内容:

$scriptblock = {

    param($cmd, $cmd_args)

    $process = New-Object system.Diagnostics.Process

    $si = New-Object System.Diagnostics.ProcessStartInfo
    $si.FileName = $cmd
    $si.Arguments = $cmd_args
    $si.UseShellExecute = $false
    $si.RedirectStandardOutput = $true

    $process.StartInfo = $si
    $process.Start() | Out-Null

    do{ # Keep redirecting output until process exits
        Write-Host $process.StandardOutput.ReadLine()
    } until ($process.HasExited)
}

Invoke-Command -ScriptBlock $scriptblock -ArgumentList "cmd.exe","/c echo test1 & echo test2 & ping 127.0.0.1 -n 3 > nul & echo test3"

您会看到输出流被实时复制到您的主机。如果您有兴趣将结果传递到管道中,也可以使用 Write-Output

关于node.js - 使用 PowerShell Invoke-Command and Process 让标准输出出现在控制台上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35588062/

有关node.js - 使用 PowerShell Invoke-Command and Process 让标准输出出现在控制台上的更多相关文章

随机推荐