Powershell GUI 问题

问题描述 投票:0回答:1

我知道我的代码在循环方面不太正确,此时,一旦我单击开始按钮,窗口就会冻结,并且表单/按钮不会响应任何输入,我知道这是由于到无限 do while 循环。这是我的第一个 Powershell GUI 脚本,我尝试寻找答案,但到目前为止未成功。 我希望代码继续在表单中运行,但允许表单可移动,并且停止按钮可以关闭 GUI/脚本。

这是代码示例:

        Set-ExecutionPolicy unrestricted
        Add-Type -assembly System.Windows.Forms
        #Form + Properties
        $main_form = New-Object System.Windows.Forms.Form
        $main_form.TopMost = $True
        $main_form.Text ='Techs'
        $main_form.Width = 300
        $main_form.Height = 450
        $main_form.AutoSize = $true
        
        #Textbox1 + Properties
        $TextBox1 = New-Object system.Windows.Forms.TextBox
        $TextBox1.BackColor = "Black"
        $TextBox1.multiline = $true
        $TextBox1.width = 295
        $TextBox1.height = 195
        $TextBox1.location = New-Object System.Drawing.Point(05,30)
        $TextBox1.Font = 'Microsoft Sans Serif,10'
        $main_form.Controls.Add($Textbox1)
        
        #Textbox2 + Properties
        $TextBox2 = New-Object system.Windows.Forms.TextBox
        $TextBox2.BackColor = "Black"
        $TextBox2.multiline = $true
        $TextBox2.width = 295
        $TextBox2.height = 195
        $TextBox2.location = New-Object System.Drawing.Point(05,225)
        $TextBox2.Font = 'Microsoft Sans Serif,10'
        $main_form.Controls.Add($Textbox2)
        
        #Start Button + Properties
        $buttonStart = New-Object system.Windows.Forms.Button
        $buttonStart.text = "Start"
        $buttonStart.Size = '80,20'
        $buttonStart.location = '05, 05'
        $buttonStart.Font = 'Microsoft Sans Serif,10'
        $main_form.Controls.Add($buttonStart)
        
        #Stop Button + Properties
        $buttonStop = New-Object system.Windows.Forms.Button
        $buttonStop.text = "Stop"
        $buttonStop.Size = '80,20'
    $buttonStop.location = '90, 05'

$buttonStop.Font = 'Microsoft Sans Serif,10'
$main_form.Controls.Add($buttonStop)

cls
$x=1
$TechArray = "1","2","3","4","5","6","7","8","9","10"
$url = "https://website/api/v3/techs/"
$tech_key = @{ 'authtoken' = '12345678-12AB-12AB-1111-1111'}

$buttonStart.Add_Click({
Do {
 
  $TextBox1.Text=""
  $TextBox2.Text=""
  foreach ($Tech in $TechArray) {
  $response = Invoke-RestMethod -Uri $url$Tech -Method get -Headers $tech_Key
  if ($response.tech.is_online -eq "1") 
    {
          $TextBox1.ForeColor = "Green"
          $TextBox1.AppendText("`n`n Online - " + $response.tech.login_name + "`n`n")
 
    }
  else 
    {
          $TextBox2.ForeColor = "Red"
          $TextBox2.AppendText("`n`n Offline - " + $response.tech.login_name + "`n`n")
         
    }

 }
  
  Start-Sleep -Seconds 5

}

while ($x -ne 0)
})

$main_form.ShowDialog()
powershell winforms user-interface
1个回答
0
投票

您需要将 Web 调用的获取与 UI 线程分开。
这意味着您需要创建一个单独的线程来将其作为后台任务执行。

在 Powershell (Core) 7+ 中有这个 cmdLet:

Start-ThreadJob
,但在 Powershell 5.1 中也有这个 cmdLet,您可以从以下位置下载:

https://www.powershellgallery.com/packages/ThreadJob/2.0.3

作为概念证明示例而不是这个,它会阻塞 UI 线程:

$buttonStart.Add_Click({
  Write-Host "Hi" 
  Start-Sleep -Seconds 5
}

尝试这个,你会发现窗口不再冻结:

$buttonStart.Add_Click({
  Start-ThreadJob -StreamingHost $Host -ScriptBlock {
    Write-Host "Hi"
    Start-Sleep -Seconds 5
  } 
})
© www.soinside.com 2019 - 2024. All rights reserved.