如何在PowerShell中调用Messagebox.Show()函数并使用非默认按钮?

5

我正在尝试使用PowerShell显示一个带有“是”和“否”按钮的消息框。

我可以显示一个带有“确定”按钮的消息框:

[system.windows.forms.messagebox]::show("Hello, world!")

我可以创建一个名为$buttons的变量,并将所需的按钮放入其中:

$buttons=[system.windows.forms.messageboxbuttons].yesno

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

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

所以自然而然(?)我决定调用它:

[system.windows.forms.messagebox]::show("Are you sure?","",$buttons)

这会导致错误:

找不到"Show"的重载和参数计数:"3"。

但是确实有一个接受三个参数的"Show"的重载!

我做错了什么?

(还有,为什么在PowerShell中调用方法通常使用点语法:object.method(),但对于MessageBox类需要使用"::"?这很令人困惑。)

2个回答

6
尝试以下方法:
[windows.forms.messagebox]::show('body','title','YesNo')

使用::.的区别在于静态方法和实例方法。请注意上面我们没有创建MessageBox对象,而是使用了MessageBox的静态方法,并使用了::语法。


可以使用双冒号或点号,但你的解决方案不起作用(与原始问题相同的错误信息)……可能是一个重载解析问题……如果进行显式转换应该没问题。 - Cédric Rup
我已经验证它可以在PowerShell 1.0和2.0上运行。你确定你正在引用Windows Forms程序集吗:Add-Type -AssemblyName System.Windows.Forms? - Keith Hill
汇编已添加。我仍在使用CTP。哦,消息是“找到多个模糊的重载 'Show' 和参数计数:'3'”。 - Cédric Rup
我想知道这是否是在 CTP 和最终版本之间修复的问题? - Keith Hill

6

正确的做法可以是:

$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
编辑---
Keith的解决方案使用了PowerShell进行枚举的隐式转换,更加优雅。 但它在我仍在使用的PS V2 CTP 3上无法正常工作,但在RTM版本上可以正常工作。 虽然完整的解释值得给出。

我原以为::是用于静态调用的,但随后无法解释为什么PowerShell会有这种区别。很明显MessageBox是一个类,而不是一个对象;因此使用::而不是.似乎是不必要的。如果解释器不需要更精确的语法并且会让用户感到困惑,那么为什么要添加更多精确的语法呢? - Andrew J. Brehm
根据所使用的语法(即::或者.),[YourType] 相当于 C# 的 typeof(YourType) 或者一个访问静态方法的路径。解释器需要它来知道你想做什么!你会怎么做? - Cédric Rup
我认为我会像在C#中那样做。 - Andrew J. Brehm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接