[英]Redirect output of another PowerShell script to a TextBox on the fly
嗨,我有一个ps脚本,它使用WPF和[System.Windows.Controls.TextBox]
来显示GUI。 在GUI上,我将通过单击各种按钮来调用其他ps脚本,因此我想将其输出即时重定向到TextBox。
有两件事我无法使它起作用:
首先,我使用cmdlet尝试了此操作,以更新TextBox的Text属性,该属性起作用,但仅在cmdlet完成后才起作用。 因此,我需要一种动态更新文本的方法。
接下来是我尝试调用其他ps脚本的方法,与cmdlet不同,即使它们完成,我也无法捕获其输出。 我猜是因为这些脚本使用的是Write-Host
而不是Write-Output
? 否则,我还需要一种方法来捕获ps脚本的输出以动态更新文本。
我还认为,如果有可以添加到GUI的PowerShell cmd控件会容易得多,因此我不必执行上述操作即可实现我想要的功能。 该控件可以执行ps脚本并在其中打印输出,更好的是,读取用户交互式输入。 如果可能的话,将以此为答案。
没有示例代码,这很难回答。
通常,文本块用于显示文本,文本框用于输入文本,我可能不会对两者都使用同一框。
如果要动态更新文本块或框,则wpf有一个计时器,您可以在其中监视变量并将其放在UI中,如果您的UI和逻辑位于不同的线程中,则这特别有用。 因此,您可以获得启动更新变量的脚本,计时器会监视该变量的更改并更新UI。
Add-Type -AssemblyName windowsbase
$updateBlock = {
$wpftextbox.text = $yourVaribletoWatchGoesHere
}
$timer = new-object System.Windows.Threading.DispatcherTimer
# Which will fire 100 times every second
$timer.Interval = [TimeSpan]"0:0:0.01"
# And will invoke the $updateBlock
$timer.Add_Tick($updateBlock)
# Now start the timer running
$timer.Start()
if ($timer.IsEnabled)
{
Write-Output 'UI timer started'
}
else
{
$clock.Close()
Write-Output 'UI update timer did not start'
}
您是正确的,如果他们使用写主机,则它们的输出将难以捕获。 您应该编辑脚本,以便它们使用写输出而不是写主机。 这是为什么这是最佳实践的一个很好的例子。
我不确定powershell cmd控件的含义,但是据我所知,这里没有捷径。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.