调用PowerShell ScriptBlock时无法查看外部可执行文件输出怎么办?
解决ScriptBlock调用外部程序无输出的问题
核心原因
[ScriptBlock]::Invoke()方法会捕获脚本块的执行结果并返回对象集合,外部可执行文件(如cmd.exe)的控制台输出会被PowerShell封装为字符串对象,但不会自动显示到控制台;而键盘输入能正常传递是因为输入流仍关联到当前控制台。
解决方案
方案1:用&操作符调用ScriptBlock(推荐)
&是PowerShell的调用操作符,用它执行ScriptBlock时,会让脚本块在当前执行环境中运行,外部程序的输出会直接显示到控制台,完全保留交互性:
function Test-CMD {cmd.exe} $sb = [System.Management.Automation.ScriptBlock]::Create('Test-CMD') & $sb
方案2:修改ScriptBlock,强制输出到控制台
如果必须使用Invoke()方法,可以在脚本块内部用Out-Host将外部程序的输出直接发送到宿主控制台:
function Test-CMD {cmd.exe | Out-Host} $sb = [System.Management.Automation.ScriptBlock]::Create('Test-CMD') $sb.Invoke()
方案3:处理Invoke()的返回结果
将Invoke()返回的结果管道到Out-Host,也能让输出显示到控制台,但这种方式可能会丢失部分实时交互性:
function Test-CMD {cmd.exe} $sb = [System.Management.Automation.ScriptBlock]::Create('Test-CMD') $sb.Invoke() | Out-Host
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

