繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM