Создать всплывающее сообщение в Powershell - PullRequest
1 голос
/ 06 марта 2019

Я пытаюсь создать функцию, которая позволит мне вызвать всплывающее сообщение, подождите, пожалуйста, запустите еще несколько скриптов и закройте всплывающее окно

.
Function Popup-Message {

    param ([switch]$show,[switch]$close)

    Add-Type -AssemblyName System.Windows.Forms  

    # Build Form
    $objForm = New-Object System.Windows.Forms.Form
    $objForm.Text = "Test"
    $objForm.Size = New-Object System.Drawing.Size(220,100)

    # Add Label
    $objLabel = New-Object System.Windows.Forms.Label
    $objLabel.Location = New-Object System.Drawing.Size(80,20) 
    $objLabel.Size = New-Object System.Drawing.Size(100,20)
    $objLabel.Text = "Hi there!"
    $objForm.Controls.Add($objLabel)



    If ($show)
    {
        $objForm.Show() | Out-Null
        $global:test = "Show"
    }


    If ($close)
    {
        # destroy form
        $objForm.Close() | Out-Null
        $global:test = "Close"
    }
}

Затем я могу получить всплывающее окно для отображения:

Popup-Message -show

На данный момент я вижу переменную $ test как Показать

Но когда я пытаюсь закрыть окно с помощью:

Popup-Message -close

Но всплывающее окно не закроется Если я снова посмотрю на $ test , он отобразится как Close

Я предполагаю, что это как-то связано с сохранением функции в Global Scope, но я не могу понять, как это сделать с помощью формы

Ответы [ 3 ]

1 голос
/ 06 марта 2019

Вы создаете новый экземпляр формы в каждом вызове Popup-Message. Итак, форма не закрывается, потому что вы пытаетесь закрыть новую форму, которая никогда не была открыта. Между тем, в старой форме больше нет никого, кто на нее ссылается, она просто сидит в космосе. Вы можете создать глобальную ссылку, как показано ниже, возможно, есть более хитрые способы сделать это.

Function Popup-Message {

param ([switch]$show,[switch]$close)

Add-Type -AssemblyName System.Windows.Forms  

# Build Form
if ($Global:objForm -eq $null){
$Global:objForm = New-Object System.Windows.Forms.Form
$Global:objForm.Text = "Test"
$Global:objForm.Size = New-Object System.Drawing.Size(220,100)

# Add Label
$Global:objLabel = New-Object System.Windows.Forms.Label
$Global:objLabel.Location = New-Object System.Drawing.Size(80,20) 
$Global:objLabel.Size = New-Object System.Drawing.Size(100,20)
$Global:objLabel.Text = "Hi there!"
$Global:objForm.Controls.Add($objLabel)
}



If ($show)
{
    $Global:objForm.Show() | Out-Null
    $global:test = "Show"
}


If ($close)
{
    # destroy form
    $Global:objForm.Close() | Out-Null
    $global:test = "Close"
}
}
0 голосов
/ 06 марта 2019

мы можем использовать одну строку для создания всплывающего окна powershell с COM-объектом Wscript.Shell

Синтаксис: intButton = objShell.Popup (strText, [nSecondsToWait], [strTitle], [nType])

#creating object os WScript
$wshell = New-Object -ComObject Wscript.Shell -ErrorAction Stop
#invoking the POP method using object
$wshell.Popup("please wait message?",5,"Wait Until Scrip execution",48+4)
0 голосов
/ 06 марта 2019

полезный ответ kpogue хорошо объясняет вашу проблему и предлагает эффективное, но неоптимальное решение из-за использования глобальных переменных .

Позвольте мне предложить другой подход, где вы используете функцию, чтобы просто определить форму и вернуть это определение , для которого вы можете вызвать .Show() и .Close() методы по мере необходимости:

Function New-PopUpForm {

  Add-Type -AssemblyName System.Windows.Forms  

    # Create the form.
    $objForm = New-Object System.Windows.Forms.Form -Property @{
      Text = "Test"
      Size = New-Object System.Drawing.Size 220,100
    }

    # Create a label...
    $objLabel = New-Object System.Windows.Forms.Label -Property @{
      Location = New-Object System.Drawing.Size 80,20
      Size = New-Object System.Drawing.Size 100,20
      Text = "Hi there!"
    }

    # ... and add it to the form.
    $objForm.Controls.Add($objLabel)

    # Return the form.
    return $objForm
}

Затем вы можете использовать функцию следующим образом:

$form = New-PopupForm

$form.Show() 

# ...

$form.Close()

Обратите внимание, что после вызова .Close() экземпляр формы, сохраненный в $form, удаляется и не может быть повторно использован - просто снова вызовите New-PopupForm, чтобы создать новый экземпляр.

...