首页 > 解决方案 > 全局停止作业:作业未定义为 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()

感谢您提供的任何帮助。

标签: powershellpingwindows-forms-designer

解决方案


我添加了一些评论来帮助您理解思考过程。

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()

推荐阅读