2011-12-07 3 views
4

PowerShellの手段を超えて可能性のあることを試みる中で、私はレンガの壁にぶつかったようです。私はほとんどの機能を編成するメインフォームスクリプトを持っていますが、リスナー(system.Net.Sockets.Udpclient.Receive)を開き、プログラムの実行中にメインフォームのテキストボックスに情報を入力し続けるために別のスクリプトが必要です。 私の人生のために、仕事が苦しんでいるこの幼稚園以外の環境を乗り越えることはできません。ドットソーシングなし、グローバルスコープ変数なし、何もありません。私はオブジェクトのリスナーを入れて状態を変更し、別のリスナを開いてこの方法で試してみてください。しかし、それは非常に乱雑で信頼できません。実行時に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