0

Powershell 2 で非モーダル Windows.Form/Dialog を作成する方法はありますか? フォームは関数内で作成し、手動で閉じるまで開いたままにする必要があります。ただし、関数の実行は継続する必要があります。スクリプトの実行が終了し、ユーザーが対話モードに戻った場合でも、フォームを開いたままにしておくことも可能です。

私はそのように試しましたが、開始ジョブでフォームを作成することすらできません。ただし、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

重要な場合に備えて、(構成を介して) .NET 4 で Powershell 2 を実行しています。どうもありがとう!

4

1 に答える 1

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

SO の質問を参照してください

于 2012-08-19T02:38:33.697 に答える