2011-12-07 45 views
4

雖然嘗試執行的操作可能超出了PowerShell的意義,但我似乎遇到了一堵磚牆。我有一個主要的表單腳本,它編排了我大部分的功能,但我需要另一個腳本來打開一個監聽器(system.Net.Sockets.Udpclient.Receive),並在整個程序的運行過程中持續向主窗體中的文本框提供信息。 對於我的生活,我無法擺脫工作中受苦的這種愚蠢的非兒童環境;沒有點源,沒有全局範圍的變量,什麼都沒有。我可以在它上面放置一個對象監聽器,以便statechanged完成,然後打開另一個監聽器並嘗試這種方式,但它會變得非常混亂和不可靠。在運行時自動從PowerShell作業中提取數據

作爲一種解決方法,我很喜歡TCP/UDP偵聽器,它不會掛起應用程序的響應,拉動hasmoredata的事件或從作業中更新主腳本中的文本框。

回答

7

您可以通過引發事件並將其轉發回本地會話來從作業返回數據。

下面是一個例子:

$job = Start-Job -Name "ReturnMessage" -ScriptBlock { 
    # forward events named "MyNewMessage" back to job owner 
    # this even works across machines 
    Register-EngineEvent -SourceIdentifier MyNewMessage -Forward 

    while($true) { 
     sleep 2 
     $i++ 
     $message = "This is message $i." 
     # raise a new progress event, assigning to $null to prevent 
     # it ending up in the job's output stream 
     $null = New-Event -SourceIdentifier MyNewMessage -MessageData $message 
    } 
} 

$event = Register-EngineEvent -SourceIdentifier MyNewMessage -Action { 
    Write-Host $event.MessageData -ForegroundColor Green 
} 

<# Run this to stop job and event listner 
$job,$event| Stop-Job -PassThru| Remove-Job 
#> 

注意,作業運行時仍可以在提示符下鍵入。執行塊註釋中的代碼以停止作業和事件列表程序。

+0

經測試工作AOK,我想這只是知道正確的事件使用的情況。非常感謝,你是一個傳奇人物。 – UnhappyChappy