2016-11-30 89 views
0

您好我有一个显示使用WPF与[System.Windows.Controls.TextBox] GUI的PS脚本。在GUI上,我会通过点击各种按钮来调用其他一些ps脚本,所以我想将它们的输出重定向到TextBox。重定向另一PowerShell脚本的输出到一个文本框在飞行

有两件事情我无法得到它的工作:

首先,我想这与cmdlet来更新文本框,其工作的Text属性,但该cmdlet只完成后。所以我需要一种方法来即时更新文本。

接下来是我尝试同样与调用其他PS脚本,不同的cmdlet,我无法抓住它们的输出,即使在他们完成。我猜测,因为这些脚本使用Write-Host而不是Write-Output?否则,我还需要一种方法来捕获ps脚本的输出以便即时更新文本。

我还想到这将是,如果有一个PowerShell CMD控制,我可以添加到GUI要容易得多,所以我没有做上述达到我想要的。该控件可以执行ps脚本并在那里打印输出,更好的是读取用户交互式输入。如果可能的话,会选择这个答案作为答案。

回答

1

没有示例代码,这有点难以回答。

通常的TextBlocks是用于显示文本和文本输入框是用来输入文字,我可能会不使用两个相同的方块。

如果您想更新文本块或框,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控制的意思,但据我所知,这里没有捷径。

+0

谢谢!但我没有一个变量来观看,它是另一个脚本的输出。你有一个'$ wpftextbox.text = script.ps#输出另一个脚本'的例子吗? – user1589188

相关问题