Обновление графического интерфейса в Powershell

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

Таким образом, программа должна работать все время, но, похоже, она застряла на:

[void] $Form.ShowDialog()

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

    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
$Form = New-Object System.Windows.Forms.Form
$Form.Text = "Test"
$Form.Size = New-Object System.Drawing.Size(300,300)
$Form.StartPosition = "CenterScreen"
$Form.BackColor = "Green"

$Form.Topmost = $True
$Form.Add_Shown({$Form.Activate()})
[void] $Form.ShowDialog()

while ($True)
    $test = Get-Content -Path C:\Users\admin\Documents\pro.txt
    if ($test -eq 2)
    {
    $Form.BackColor = "Green"
    } else {
    $Form.BackColor = "Red"
    }
     Start-Sleep -s 2

}

Спасибо за помощь!

1 ответ

Решение
$Form.ShowDialog()

Эта строка требует взаимодействия в форме. Код, следующий за этой строкой, не будет работать, пока форма не будет закрыта. Другой способ запустить форму будет выглядеть следующим образом:

$Form.Show()

Если вы запустите такую ​​форму, код должен продолжать работать. Хотя вам все еще может понадобиться лучшее решение, так как ваш следующий код использует start-sleep -s 2, Я верю, что это также может привести к сну вашей формы, что сделает ее потенциально непригодной для использования

Я бы порекомендовал узнать о обработчиках событий PowerShell здесь. Там может быть лучшее решение, используя обработчик событий для вашего решения. Пример обработчика события следует

$Form_Load {
     # Your commands and stuff here #
}

$Form это объект, на который смотрит событие, тогда у вас есть разделитель _, затем Load это имя фактического события, которое выполняется при выполнении кода. Таким образом, любой код внутри этих скобок будет запущен сразу, когда форма $Form запущен. Это может быть что угодно, от загрузки формы, нажатия кнопки или даже изменения выбранного индекса внутри списка.

Обработчики событий подняли мои возможности по построению графического интерфейса PowerShell на следующий уровень, когда я понял, что я имел возможность делать с формой. Поэтому я очень рекомендую узнать об обработчиках событий, если для вас нормальный графический интерфейс PowerShell, наиболее полезным инструментом, который вы можете купить, является SAPIEN PowerShell Studio, которая является чрезвычайно полезной средой разработки. Это в основном Visual Studio, созданная только для PowerShell. Я думаю, что это в диапазоне от 400 до 500 долларов.

Другие вопросы по тегам