.net powershell函数中的非模态表单创建

.net powershell函数中的非模态表单创建,.net,winforms,powershell,.net,Winforms,Powershell,Powershell 2中是否有方法创建非模式的Windows.Form/Dialog?表单应在函数中创建,并在手动关闭之前保持打开状态。但是,必须继续执行该功能。即使任何脚本的执行已经完成并且用户返回到交互模式,表单也应该可以保持打开状态 我试过这样做,但它甚至不能创建带有start job的表单。但是,直接调用makeform的工作方式与预期的一样 function makeform { [void][reflection.assembly]::LoadWithPartia

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(通过配置),以防它很重要。非常感谢

作业方法是正确的,但您有一个bug。作业在一个全新的作用域中运行,不会继承当前作用域中定义的任何变量或函数。因此,您的工作不知道函数
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
函数本身的scriptblock作为作业的内容传递:

Start-Job $function:makeform
看到这样的问题了吗