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,以防它很重要。非常感谢!
答案 0 :(得分: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