2010-01-13 3 views
4

Я пытаюсь показать окно сообщения от PowerShell с кнопками «да» и «Нет».Вызовите Messagebox.Show() из PowerShell с более чем кнопкой по умолчанию?

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

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

И я могу создать переменную $ кнопок с кнопками я хочу:

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

И я могу видеть, что шоу() статический метод перегружен и что один из вариантов состоит в том, чтобы дать три параметра:

Показать (String, String, MessageBoxButtons) Dis воспроизводит окно сообщения с указанным текстом, заголовком и кнопками. (?)

Поэтому, естественно, я решил назвать это:

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

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

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

Но есть перегрузка для «Показать», которая принимает три аргумента!

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

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

ответ

5

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

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

Уведомление "::" вместо "" в первой строке. Значение YesNo определяется staticly в System.Windows.Forms.Messageboxbuttons, поэтому вы должны использовать «::» (статический вызов) вместо «.».

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

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

Седрик

Редактировать ---

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

+0

Я понял :: был для статического звонка, но потом не мог объяснить себе, почему PowerShell сделает это. Понятно, что MessageBox - это класс, а не объект; следовательно :: вместо. представляется ненужным. Зачем добавлять более точный синтаксис, если интерпретатору это не нужно? И это смущает пользователя? –

+0

В зависимости от используемого синтаксиса (т.е. :: или.), [YourType] является эквивалентом C# typeof (YourType) или пути доступа к статическим методам. Интерпретатору необходимо знать, что вы хотите сделать! Как бы вы поступили? –

+0

Я думаю, что я сделал бы это как в C#. –

5

Try таким образом:

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

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

+0

Ok for :: vs., Но ваше решение не работает (то же сообщение, что и OP) ... может быть проблема с разрешением перегрузки ... должно быть хорошо с явный листинг –

+0

Я проверил, что он работает как с PowerShell 1.0, так и с 2.0. Вы уверены, что занимаетесь сборкой Windows Forms: Add-Type -AssemblyName System.Windows.Forms? –

+0

сборка была добавлена. Я все еще использую CTP здесь. О, и сообщение: «Несколько неоднозначных перегрузок, найденных для« Показать », и количество аргументов:« 3 ». –

Смежные вопросы