0

Powershell 2 中有没有办法创建非模态 Windows.Form / Dialog?表单应在函数内创建并保持打开状态,直到手动关闭。然而,函数的执行必须继续。即使任何脚本的执行完成并且用户返回到交互模式,也应该让表单保持打开状态。

我试过这样,但它甚至没有创建带有 start-job 的表单。直接调用 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 question In PowerShell Form.Show() 无法正常工作,但 Form.ShowDialog() 可以

于 2012-08-19T02:38:33.697 回答