我知道我的代码在循环方面不太正确,此时,一旦我单击开始按钮,窗口就会冻结,并且表单/按钮不会响应任何输入,我知道这是由于到无限 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()
您需要将 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
}
})