使用PowerShell Invoke-Command和Process使stdout出现在控制台上

时间:2016-02-23 20:59:59

标签: node.js windows powershell

我有一个使用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会向stdout发出,因为当我使用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并在脚本块中尝试了以下内容,但无济于事:

$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控制台的任何建议吗?

1 个答案:

答案 0 :(得分:2)

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

Write-Output

您将看到输出流实时复制到您的主机。如果您对将结果传递到管道

感兴趣,也可以使用{{1}}