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