首页  编辑  

PowerShell Runspace中输出控制台最简单优雅的方法

Tags: /计算机文档/脚本,批处理/   Date Created:
Powershell中,可以使用Runspace来开启子进程任务,但我们无法直接在Runspace中实时输出到控制台:
例如
$runspace = [powershell]::Create()

# 向 Runspace 添加脚本
$runspace.AddScript({
    Write-Host "Hello from Runspace!"
})

$runspace.Invoke() | Out-Null
你会发现,根本看不到 "Hello from Runspace!"的输出!
当然我们可以用下面的方法,即等Runspace运行完成后,把整个Runspace的输出再输出到控制台:
# 创建Runspace池
$pool = [RunspaceFactory]::CreateRunspacePool(1, 5)
$pool.Open()
 
# 创建PowerShell实例并设置Runspace池
$powershell = [PowerShell]::Create().AddScript({
    "Hello from Runspace!"
})
$powershell.RunspacePool = $pool
 
# 执行脚本并收集输出
$result = $powershell.Invoke()
 
# 打印输出到控制台
$result
 
# 清理
$powershell.Dispose()
$pool.Dispose()
然而上面的方法都不够简单优雅,且无法实时输出到控制台。
这个问题在于控制台默认时在主线程的,Runspace中无法得到主线程的控制台对象,因此我们只需要把主线程的Console对象传递给Runspace就可以实现实时输出了:
$runspace = [powershell]::Create()

$runspace.AddScript({
    param ($consoleUI)

    # 使用传递的控制台 UI 输出
    $consoleUI.WriteLine("Hello from Runspace!")
}).AddArgument($Host.UI)  # 传递主线程的 Host.UI 对象

$runspace.Invoke() | Out-Null