2012-08-14 4 views
0

Powershell 2에서 모달이 아닌 Windows.Form/Dialog를 만드는 방법이 있습니까? 양식은 함수 내에서 작성되어야하며 수동으로 닫을 때까지 열려 있어야합니다. 그러나 함수의 실행은 계속되어야합니다. 모든 스크립트 실행이 끝나고 사용자가 대화식 모드로 돌아가더라도 양식을 열린 상태로 유지하는 것이 가능해야합니다.Powershell 함수의 모달이 아닌 양식 생성

나는 이렇게 해봤지만 시작 작업으로 양식을 생성하지도 않는다. 그러나 makeform을 직접 호출하는 것은 예상대로 작동합니다.

function makeform { 
     [void][reflection.assembly]::LoadWithPartialName("System.Windows.Forms") 
     [System.Windows.Forms.Application]::EnableVisualStyles(); 

     $form = New-Object Windows.Forms.Form 
     $form.Text = 'Test Form' 

     $form.Add_Shown({$form.Activate()}) 
     $form.ShowDialog() 
} 

function show { 
    start-job { makeform } 
} 

show # does show nothing :| (expected the form to appear) 

start-job { makeform } -Name 'myjob' # expect the form to appear here - but it doesn't either :| 
Write-Host "Cont..." 
# simulate some long running task 
[Threading.Thread]::Sleep(10000) 

Wait-job myjob 
Remove-job myjob 
Write-Host "Done..." 
Get-Job 

중요한 경우에 대비하여 Powershell 2 with .NET 4 (config를 통해)를 실행 중입니다. 고마워요!

답변

1

일하는 방식이 맞지만 버그가 있습니다. 작업은 완전히 새로운 범위에서 실행되며 현재 범위에서 정의 된 변수 나 함수를 상속하지 않습니다. 따라서 기능 makeform은 귀하의 직업에 알 수 없습니다.

Start-Job { makeform } | Wait-Job | Receive-Job 

몇 가지 해결 방법 : 당신은 여기에서 확인할 수 있습니다

스크립트 블록에 makeform를 선언하고 -InitializationScript

$lib = { 
    function makeform {  
      [void][reflection.assembly]::LoadWithPartialName("System.Windows.Forms")  
      [System.Windows.Forms.Application]::EnableVisualStyles();  

      $form = New-Object Windows.Forms.Form  
      $form.Text = 'Test Form'  

      $form.Add_Shown({$form.Activate()})  
      $form.ShowDialog()  
    } 
} 

Start-Job { makeform } -InitializationScript $lib 

로 그 블록을 전달할 아니면 makeform 함수의 스크립트 블록을 전달할 수 있습니다 그 내용 자체는 다음과 같습니다.

Start-Job $function:makeform 

질문이 없습니다. In PowerShell Form.Show() does not work right, but Form.ShowDialog() does

관련 문제