使用超过默认按钮从PowerShell调用Messagebox.Show()?

And*_*ehm 4 powershell winforms

我试图用PowerShell显示一个消息框,带有yes和no按钮.

我可以使用OK按钮显示一个消息框:

[system.windows.forms.messagebox]::show("Hello, world!")
Run Code Online (Sandbox Code Playgroud)

我可以使用我想要的按钮创建一个变量$按钮:

$buttons=[system.windows.forms.messageboxbuttons].yesno
Run Code Online (Sandbox Code Playgroud)

我可以看到Show()静态方法被重载,其中一个选项是给出三个参数:

Show(String,String,MessageBoxButtons)显示带有指定文本,标题和按钮的消息框.

那么自然(?)我决定这样称呼:

[system.windows.forms.messagebox]::show("Are you sure?","",$buttons)
Run Code Online (Sandbox Code Playgroud)

这会导致错误:

找不到"Show"的重载和参数count:"3".

但是"Show"有一个超载,接受三个参数!

我究竟做错了什么?

(并且有人可以告诉我为什么在PowerShell中调用方法通常使用点语法:object.method(),但MessageBox类需要"::"?这令人困惑.)

Kei*_*ill 5

试试这种方式:

[windows.forms.messagebox]::show('body','title','YesNo')
Run Code Online (Sandbox Code Playgroud)

而使用::.静态方法与实例方法之间的区别.请注意,我们没有创建MessageBox对象.我们只是在MessageBox上使用静态方法和::语法.


Céd*_*Rup 5

这样做的正确方法可以

$buttons=[system.windows.forms.messageboxbuttons]::yesno;
[system.windows.forms.messagebox]::Show("Are you sure?","",$buttons);
Run Code Online (Sandbox Code Playgroud)

注意"::"而不是"." 在第一行.YesNo值是在System.Windows.Forms.Messageboxbuttons上静态定义的,因此必须使用"::"(静态调用)而不是".".

请注意"[system.windows.forms.messageboxbuttons] .yesno"是尝试在System.Type的实例上调用"YesNo"属性,该实例不存在,因此导致$ null

希望能帮助到你 !

塞德里克

编辑---

Keith解决方案使用powershell为枚举制作的隐式转换更优雅.它只适用于我仍在使用的PS V2 CTP 3,但在RTM版本上运行良好.完整的解释值得给予,但......