我正在尝试使用是和否按钮显示来自PowerShell的消息框。
我可以使用OK按钮显示一个消息框:
[system.windows.forms.messagebox]::show("Hello, world!")
我可以用我想要的按钮创建一个变量$按钮:
$buttons=[system.windows.forms.messageboxbuttons].yesno
我可以看到Show()静态方法被重载,其中一个选项是给出三个参数:
Show(String,String,MessageBoxButtons)显示带有指定文本,标题和按钮的消息框。
很自然地(?)我决定这样称呼:
[system.windows.forms.messagebox]::show("Are you sure?","",$buttons)
这会导致错误:
找不到“显示”和参数计数的重载:“3”。
但是“Show”有一个超载接受三个参数!
我做错了什么?
(并且有人可以告诉我为什么在PowerShell中调用方法通常使用点语法:object.method(),但MessageBox类需要“::”?这令人困惑。)
答案 0 :(得分:5)
尝试这种方式:
[windows.forms.messagebox]::show('body','title','YesNo')
使用::
和.
之间的区别是静态方法与实例方法。请注意,我们没有创建MessageBox对象。我们只是在MessageBox上使用::
语法的静态方法。
答案 1 :(得分:5)
这样做的正确方法可以是
$buttons=[system.windows.forms.messageboxbuttons]::yesno;
[system.windows.forms.messagebox]::Show("Are you sure?","",$buttons);
注意“::”而不是“。”在第一行。 YesNo值是在System.Windows.Forms.Messageboxbuttons上静态定义的,因此您必须使用“::”(静态调用)而不是“。”
请注意,“[system.windows.forms.messageboxbuttons] .yesno”是尝试在System.Type的实例上调用“YesNo”属性,该实例不存在,因此导致$ null
希望它有所帮助!
和Cédric
编辑---
使用powershell为枚举制作的隐式转换的Keith解决方案更优雅。 它只适用于我仍在使用的PS V2 CTP 3,但在RTM版本上运行良好。 完整的解释值得给予,但是......