将另一个PowerShell脚本的输出重定向到TextBox

时间:2016-11-30 02:16:08

标签: wpf powershell

您好我有一个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脚本并在那里打印输出,更好的是,读取用户交互输入。如果可能的话,会选择这个作为答案。

1 个答案:

答案 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控件的意思,但据我所知,这里没有捷径。