Есть ли способ запустить всплывающее окно во время выполнения скрипта? - PullRequest
0 голосов
/ 23 октября 2018

Я создаю графический интерфейс и хочу, чтобы всплывающее окно сообщало, что оно занято, но затем закрывается, когда оно завершит эту конкретную задачу.Единственное, что я могу найти, это следующее ...

$popup = New-Object -ComObject wscript.shell
$popup.popup("Running Script, Please Wait....",0,"Running...",0x1)

Но проблема в том, что это ожидание ответа, а затем он запустит скрипт.Я не прошу некоторых написать мне сценарий, но некоторые рекомендации о том, где найти эту информацию.

Мне нужно PowerShell, чтобы открыть окно, а затем оставить его, пока выполняется скрипт, и затем закрыть его, когда скрипт завершится.Будет ли лучше просто иметь другую форму окна, которая запускает скрипт с надписью на нем?Это кажется чрезмерным количеством работы для простой задачи.Но это PowerShell ...

Есть ли что-то вроде ...

$popup = New-Object -ComObject wscript.shell
$popup.popup("Running Script, Please Wait....",0,"Running...",0x1)
###RUN SCRIPT HERE...
$popup.close()

РЕДАКТИРОВАТЬ ::: На вопрос "Почему я пытаюсь получить всплывающее окно, а не writeprogress иличто-то "... Причина в том, что я делаю это в графическом интерфейсе.Не в командной строке.Поэтому мне нужен графический интерфейс, чтобы в основном информировать человека, что он занят, выполнение некоторых задач может занять более 6 часов, и я не хочу, чтобы они щелкали и выполняли другие действия, пока выполняется текущая задача.

РЕДАКТИРОВАТЬ 2 ::: Я оставлю это открытым, так как исходный вопрос не был дан ответ, но я создал обходной вариант со следующим кодом.

$LabelAlert = New-Object system.windows.forms.label
$LabelAlert.Text = "Working, Please wait."
$LabelAlert.location = New-Object System.Drawing.Point(0,180)
$LabelAlert.width = 590
$LabelAlert.height = 25
$LabelAlert.Visible = $false
$LabelAlert.TextAlign = "TopCenter"
$Form.Controls.Add($LabelAlert)
$FormGroupBox = New-Object System.Windows.Forms.GroupBox
$FormGroupBox.Location = New-Object System.Drawing.Size(0,0) 
$FormGroupBox.width = 600
$FormGroupBox.height = 375
$Form.Controls.Add($FormGroupBox)
$startAlert = {
$LabelAlert.Visible = $true
$FormGroupBox.Visible = $false            
}
$stopAlert = {
$LabelAlert.Visible = $false
$FormGroupBox.Visible = $true            
}

Каждая часть формы была перемещена внутригрупповая коробка.Размер группового блока совпадает с размером моего окна.

И для каждого скрипта, потребляющего время, я запускаю

&$startAlert
....script commands go here...
&$stopAlert

1 Ответ

0 голосов
/ 23 октября 2018

Вы можете использовать Start-Job для запуска всплывающего окна в фоновом задании, которое позволит сценарию продолжить работу после его появления:

$Job = Start-Job -ScriptBlock {   
    $popup = New-Object -ComObject wscript.shell
    $popup.popup("Running Script, Please Wait....",0,"Running...",0x1)
}

#Run script here..

Но я не вижу способа заставитьвсплывающее окно закрывается в конце вашего скрипта (пробовал Remove-Job -Force и даже Stop-Process conhost -Force, но ни один из них, похоже, не работал).

Как уже говорили другие, лучшим вариантом будет запись статуса в окно PowerShell.Возможно, вы захотите взглянуть на командлет Write-Progress, который можно использовать для отображения индикатора выполнения поверх запущенного сценария.

...