Powershell中,可以使用Runspace来开启子进程任务,但我们无法直接在Runspace中实时输出到控制台:
例如
$runspace = [powershell]::Create()
$runspace.AddScript({
Write-Host "Hello from Runspace!"
})
$runspace.Invoke() | Out-Null
你会发现,根本看不到 "Hello from Runspace!"的输出!
当然我们可以用下面的方法,即等Runspace运行完成后,把整个Runspace的输出再输出到控制台:
$pool = [RunspaceFactory]::CreateRunspacePool(1, 5)
$pool.Open()
$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)
$consoleUI.WriteLine("Hello from Runspace!")
}).AddArgument($Host.UI)
$runspace.Invoke() | Out-Null