powershell - 全局停止作业:作业未定义为 ID 或值
问题描述
这是一个基本的 ping 工具,经过了许多更改,但由于某种原因,它在第一个按钮下的停止功能没有定义并且不允许进程停止。
Add-Type -AssemblyName System.Windows.Forms, System.Drawing
$job = $null
$isRunning = $false
$form = New-Object System.Windows.Forms.Form
$form.Text = 'Clevagroup Pinger'
$form.Size = New-Object System.Drawing.Size(350,150)
$form.StartPosition = 'CenterScreen'
$form.Topmost = $true
$Button = New-Object System.Windows.Forms.Button
$Button.Location = New-Object System.Drawing.Size(35,35)
$Button.Size = New-Object System.Drawing.Size(120,23)
$Button.Text = "Ping"
$Button.Add_Click({
if($global:isRunning -eq $false){
$global:job = Start-Job -ScriptBlock {Ping 8.8.8.8 -t > $env:userprofile\desktop\PingResults}
$Button.Text = "Running"
$global:isRunning = $true
} else {
$Button.Text = "Stop Pinging"
Stop-Job $global:job
$global:isRunning = $false
}
})
$Form.Controls.Add($Button)
$Button1 = New-Object System.Windows.Forms.Button
$Button1.Location = New-Object System.Drawing.Size(195,35)
$Button1.Size = New-Object System.Drawing.Size(120,23)
$Button1.Text = "Close"
$Button1.Add_Click({
if($global:job -ne $null){
Stop-Job $global:job
}
})
$Form.Controls.Add($Button1)
$form.Add_Shown({$Button.Select()})
$result = $form.ShowDialog()
感谢您提供的任何帮助。
解决方案
我添加了一些评论来帮助您理解思考过程。
Add-Type -AssemblyName System.Windows.Forms, System.Drawing
# Set a reference hashtable where you can store the Job's object
$jobRef = @{ Job = '' }
$form = New-Object System.Windows.Forms.Form
$form.Text = 'Clevagroup Pinger'
$form.Size = New-Object System.Drawing.Size(350,150)
$form.StartPosition = 'CenterScreen'
$Button = New-Object System.Windows.Forms.Button
$Button.Location = New-Object System.Drawing.Size(35,35)
$Button.Size = New-Object System.Drawing.Size(120,23)
$Button.Text = "Ping"
$Button.Add_Click({
# Save the Job on the reference hashtable
$jobRef.Job = Start-Job -ScriptBlock {
Ping 8.8.8.8 -t
}
# Disable the Ping Button
$this.Enabled = $false
# Enable the Stop Button
$button1.Enabled = $true
})
$Form.Controls.Add($Button)
$Button1 = New-Object System.Windows.Forms.Button
$Button1.Location = New-Object System.Drawing.Size(195,35)
$Button1.Size = New-Object System.Drawing.Size(120,23)
$Button1.Text = "Stop"
# This button should be disabled by Default an only become
# Enabled after 'Ping' button is Clicked
$Button1.Enabled = $false
$Button1.Add_Click({
# Stop the Job
Stop-Job $jobRef.Job
# Receive the Job's result and store them in a Txt file
Receive-Job $jobRef.Job | Out-File $env:userprofile\desktop\PingResults.txt
# Remove the Job
Remove-Job $jobRef.Job
# Enable the Ping Button
$button.Enabled = $true
# Disable this Button
$this.Enabled = $false
})
$form.Controls.Add($Button1)
$form.Add_Shown({
$this.Activate()
$Button.Select()
})
$form.ShowDialog()
推荐阅读
- facebook - Facebook API - retrieve notifications for my own messages
- python - Shapely's Simplify does not simplify
- flutter - 修改 SVG 文件颤动
- java - Split huge Json objects for saving into database
- python - What's the proper way to check in a Model's save() method if a FileField was committed in Django?
- ag-grid - Exception has occurred: TypeError: Cannot assign to read only property with ag-grid-community cellEditor: 'numericEditor'
- php - 使用 isset() 检查值是否存储在数据库中
- python - How to aggregate data and plot all groups
- mysql - 获取员工以及有多少员工为他们工作
- php - 如何在不保存到文件的情况下以 HTML 格式显示图像