当我使用Powershell和WinForms单击按钮时,我正在尝试打开联机帮助页(Get-Help别名)。
我有一个允许您输入cmdlet或帮助主题的文本框,当您按下按钮时,它应该打开GridView中的联机帮助页文档。目前,它打开了GridView并抓取了正确的帮助文档,但是在此过程中出现了一些问题,我认为它与解释在传递给GridView之前有关。
这就是我所拥有的:
[void][Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')
$form = New-Object Windows.Forms.Form
$input = New-Object Windows.Forms.TextBox
$input.Size = '100,20'
$input.Location = '10,20'
$button = New-Object Windows.Forms.Button
$button.Size = '100,20'
$button.Location = '10,60'
$button.Add_Click({
Invoke-Expression ("man " + ($global:input.Text)) | Out-GridView
})
$form.Controls.AddRange(@($input, $button)
$form.Add_Shown({$form.Activate()})
$form.ShowDialog()
GridView会打开,但标题会显示Invoke-Expression ("man " + ($input.Text)) | Out-GridView
,内容是联机帮助页的通用默认信息。
我尝试将Invoke-Expression
附加到变量,然后将变量传递给GridView。我尝试将(Get-Help ($input.Text))
设置为变量,然后将其传递给GridView。我甚至试图通过将$input.Text
放在$input.Text = ''
属性之后来初始化$input.Location
属性。
我真的认为它是Powershell引擎如何解释表达式,但我不知道如何告诉它按照我想要的方式工作。
我在这里做错了什么?
编辑:好的,我刚刚意识到了什么。我认为$ input.Text属性没有正确填充。
我所做的是在[Windows.Forms.MessageBox]::Show($input.Text)
的{{1}}事件中添加了Click
并注释了$button
。它应该做的是打开一个消息框并在其中放置文本框中键入的内容(Invoke-Expression
)。消息框为空白。我认为它可能与作用域有关,但$input.Text
应该是$input.Text
,并且可以从按钮控件项目的$global
事件中访问。
在输入最后一段后我搞砸了它,我意识到Click
属性已正确填充并可在$input.Text
范围内访问。我所做的是在脚本的最后添加$global
(在[Windows.Forms.MessageBox]::Show($input.Text)
之后),它显示了我在文本框中输入的内容。
那么,为什么我看不到$form.ShowDialog()
文本框属性?我没有遇到过我在Powershell中构建的其他一些WinForms应用程序的问题。
感谢您的见解。
答案 0 :(得分:0)
$input
是Powershell管道上下文中使用的自动变量,这就是它为空的原因。 Powershell会自行填充它,因此会覆盖您放入其中的任何内容。将$input
重命名为任何其他可用名称,它应该有效。
E.g:
[void][Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')
$form = New-Object Windows.Forms.Form
$box = New-Object Windows.Forms.TextBox
$box.Size = '100,20'
$box.Location = '10,20'
$button = New-Object Windows.Forms.Button
$button.Size = '100,20'
$button.Location = '10,60'
$button.Add_Click({
[Windows.Forms.MessageBox]::Show($box.Text)
Invoke-Expression ("man " + ($box.Text)) | Out-GridView
})
$form.Controls.AddRange(@($box, $button))
$form.Add_Shown({$form.Activate()})
$form.ShowDialog()