您好我有一个ps脚本,它使用带有[System.Windows.Controls.TextBox]
的WPF显示GUI。在GUI上,我将通过单击各种按钮调用其他一些ps脚本,因此我想将其输出重定向到TextBox中。
有两件事让我无法工作:
首先,我尝试使用cmdlet来更新TextBox的Text属性,该属性有效,但只有在cmdlet完成后才能使用。所以我需要一种方法来动态更新文本。
接下来,我尝试调用其他ps脚本,与cmdlet不同,即使完成后我也无法捕获它们的输出。我猜是因为这些脚本使用的是Write-Host
而不是Write-Output
?否则,我还需要一种捕获ps脚本输出的方法来动态更新Text。
我也认为如果有一个我可以添加到GUI的PowerShell cmd控件会更容易,所以我不必为了达到我想要的目的而做上述操作。此控件可以执行ps脚本并在那里打印输出,更好的是,读取用户交互输入。如果可能的话,会选择这个作为答案。
答案 0 :(得分:1)
没有示例代码,这有点难以回答。
通常文本块用于显示文本,而文本框用于输入文本,我可能不会为两者使用相同的框。
如果你想动态更新文本块或框,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'
}
你是对的,如果他们使用write-host,他们的输出很难捕获。您应该编辑脚本,以便它们使用写入输出,而不是写入主机。这是为什么这是最佳实践的一个很好的例子。
我不确定你对powershell cmd控件的意思,但据我所知,这里没有捷径。