2011-12-07 1 views
4

PowerShell의 수단을 뛰어 넘는 일을 시도하는 동안 저는 벽돌 벽을 만났을 것입니다. 나는 대부분의 기능을 조정하는 메인 폼 스크립트를 가지고 있지만 리스너 (system.Net.Sockets.Udpclient.Receive)를 열고 전체 프로그램의 실행 중에 메인 폼의 텍스트 상자에 정보를 계속 입력해야하는 또 다른 스크립트가 필요하다. . 저의 삶에서 나는 직업이 겪는이 자식없는 환경을 헤쳐 나갈 수는 없습니다. 도트 소싱 없음, 글로벌 범위 변수 없음, 없음. 나는 statechanged을 완료하기 위해 object-listener를 놓을 수 있고 다른 리스너를 열어이 방법을 시도 할 수있다. 그러나 매우 지저분하고 신뢰할 수 없다.실행 중 PowerShell 작업에서 데이터를 자동으로 가져 오기

임시 해결책으로 응답을 위해 응용 프로그램을 정지시키지 않는 TCP/UDP 수신기, hasmoredata를 가져 오는 이벤트 또는 작업 내에서 기본 스크립트의 텍스트 상자를 updatign하는 방법을 좋아합니다.

답변

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 
#> 

주 작업이 실행되는 동안 여전히 프롬프트에서 입력 할 수 있습니다 : 여기

은 예입니다. 블록 주석에서 코드를 실행하여 작업 및 이벤트 listner를 중지하십시오.

+0

테스트 된 작업 AOK, 사용하기에 적합한 이벤트를 아는 것일뿐입니다. 대단히 감사합니다. 당신은 전설입니다. – UnhappyChappy

관련 문제