Вызвать Messagebox.Show() из PowerShell с помощью кнопки, превышающей стандартную?

Я пытаюсь показать окно сообщения из PowerShell с кнопками «да» и «нет».

Я могу отобразить окно сообщения с кнопкой OK:

[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)

И это приводит к ошибке:

Не удается найти перегрузку для "Показать" и количество аргументов: "3".

Но ЕСТЬ перегрузка для "Show", которая принимает три аргумента!

Что я делаю неправильно?

(И может ли кто-нибудь сказать мне, почему вызов метода в PowerShell обычно выполняется с использованием точечного синтаксиса: object.method(), но требует «::» для класса MessageBox? Это сбивает с толку.)


person Andrew J. Brehm    schedule 13.01.2010    source источник


Ответы (2)


Правильный способ сделать это может быть

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

Обратите внимание на "::" вместо "." в первой строке. Значение YesNo определяется статически на кнопках System.Windows.Forms.Messagebox, поэтому вы должны использовать "::" (статический вызов) вместо "."

Обратите внимание, что «[system.windows.forms.messageboxbuttons].yesno» — это попытка вызвать свойство «YesNo» для экземпляра System.Type, который не существует, и поэтому приводит к $null

Надеюсь, поможет !

Седрик

Изменить ---

Решение Кейта, использующее неявное приведение, сделанное powershell для перечисления, более элегантно. Он просто не работает на PS V2 CTP 3, который я до сих пор использую, но отлично работает на версии RTM. Полное объяснение стоило дать, хотя...

person Cédric Rup    schedule 13.01.2010
comment
Я подумал, что :: предназначен для статического вызова, но потом не мог объяснить себе, почему PowerShell имеет такое значение. Понятно, что MessageBox — это класс, а не объект; следовательно :: вместо . кажется ненужным. Зачем добавлять более точный синтаксис, если он не нужен интерпретатору И это сбивает с толку пользователя? - person Andrew J. Brehm; 13.01.2010
comment
В зависимости от используемого синтаксиса (например, :: или .), [YourType] является эквивалентом C# typeof(YourType) или путем доступа к статическим методам. Переводчик должен знать, что вы хотите сделать! Как бы вы поступили? - person Cédric Rup; 13.01.2010
comment
Я думаю, что я бы сделал это, как в C #. - person Andrew J. Brehm; 13.01.2010

Попробуйте так:

[windows.forms.messagebox]::show('body','title','YesNo')

И различие между использованием :: и . заключается в статическом методе и методе экземпляра. Обратите внимание, что мы не создавали объект MessageBox. Мы просто используем статический метод MessageBox с синтаксисом ::.

person Keith Hill    schedule 13.01.2010
comment
Хорошо для :: vs., но ваше решение не работает (то же сообщение, что и OP)... возможно, проблема с разрешением перегрузки... должно быть в порядке с явным приведением - person Cédric Rup; 13.01.2010
comment
Я убедился, что он работает как с PowerShell 1.0, так и с 2.0. Вы уверены, что загружаете сборку Windows Forms: Add-Type -AssemblyName System.Windows.Forms? - person Keith Hill; 13.01.2010
comment
добавлена ​​сборка. Я все еще использую CTP здесь. Да, и сообщение: «Обнаружено несколько неоднозначных перегрузок для Show и количество аргументов: 3». - person Cédric Rup; 13.01.2010
comment
Интересно, была ли эта проблема исправлена ​​между CTP и финальным релизом?? - person Keith Hill; 13.01.2010