2016-11-30 120 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

相關問題