ZetCode

PowerShell Stop-Job

最后修改:2025 年 2 月 15 日

在本文中,我们将介绍 PowerShell 中的 Stop-Job cmdlet。此 cmdlet 用于停止 PowerShell 中正在运行的后台作业。它对于管理长时间运行的任务非常有用。

作业基础

PowerShell 中的作业是独立运行的后台任务。作业允许您在不阻塞控制台的情况下运行命令。每个作业都有唯一的 ID 和状态(正在运行、已完成、失败)。Stop-Job cmdlet 用于终止正在运行的作业。

Stop-Job 的基本用法

使用 Stop-Job 的最简单方法是配合作业对象。首先,使用 Start-Job 启动一个作业。然后将作业传递给 Stop-Job。这将立即终止后台任务。

stopjob1.ps1
$job = Start-Job -ScriptBlock { Start-Sleep -Seconds 60 }
Stop-Job -Job $job

此脚本启动一个将睡眠 60 秒的后台作业。Stop-Job cmdlet 在其完成之前停止它。作业状态变为已停止。

按 ID 停止作业

可以使用作业的唯一 ID 号来停止作业。首先,使用 Get-Job 列出作业以查找 ID。然后将 ID 传递给 Stop-Job。这在管理多个作业时很有用。

stopjob2.ps1
Start-Job -ScriptBlock { Start-Sleep -Seconds 30 }
Get-Job
Stop-Job -Id 1

这会启动一个睡眠作业,列出所有作业,然后停止 ID 为 1 的作业。作业 ID 显示在 Get-Job 的输出中。ID 按顺序分配。

停止多个作业

可以使用管道输入一次停止多个作业。首先使用 Get-Job 过滤作业,然后将其通过管道传递给 Stop-Job。这对于批量作业管理非常有效。

stopjob3.ps1
Start-Job -ScriptBlock { Start-Sleep -Seconds 20 }
Start-Job -ScriptBlock { Start-Sleep -Seconds 30 }
Get-Job -State Running | Stop-Job

这会启动两个睡眠作业,然后停止所有正在运行的作业。管道将每个正在运行的作业传递给 Stop-Job。两个作业都会被终止。

按名称停止作业

创建作业时可以为其命名,并按名称停止。在 Start-JobStop-Job 中都使用 -Name 参数。在复杂的脚本中,命名作业更容易管理。

stopjob4.ps1
Start-Job -Name "MyJob" -ScriptBlock { Start-Sleep -Seconds 40 }
Stop-Job -Name "MyJob"

这会创建一个名为“MyJob”的作业,该作业将睡眠 40 秒。Stop-Job cmdlet 按名称停止它。命名作业更容易跟踪。

强制停止卡死的作业

有些作业可能不响应正常的停止请求。-Force 参数可以终止顽固的作业。对于无响应的作业,应将其作为最后手段使用。

stopjob5.ps1
$job = Start-Job -ScriptBlock { while($true) { } }
Stop-Job -Job $job -Force

这会启动一个无限循环作业。-Force 参数确保终止。强制停止可能会导致资源处于不一致状态。

停止远程作业

远程计算机上运行的作业也可以被停止。首先使用 Invoke-Command 创建一个远程作业。然后使用作业对象或 ID 停止它。

stopjob6.ps1
$session = New-PSSession -ComputerName Server01
$job = Invoke-Command -Session $session -ScriptBlock { Start-Sleep -Seconds 50 } -AsJob
Stop-Job -Job $job

这会创建一个远程会话并启动一个睡眠作业。Stop-Job cmdlet 终止远程作业。远程作业管理需要适当的权限。

停止前确认

-Confirm 参数会在停止每个作业前进行提示。这可以防止意外终止作业。在生产环境中很有用。

stopjob7.ps1
Start-Job -ScriptBlock { Start-Sleep -Seconds 10 }
Stop-Job -Id 1 -Confirm

这会启动一个睡眠作业,然后在停止它之前进行提示。确认信息会显示作业的详细信息。输入“Y”继续或“N”取消。

停止所有作业

可以使用 Get-JobStop-Job 一次停止所有作业。这是清理所有后台任务的快捷方式。请注意,它会停止所有作业。

stopjob8.ps1
Start-Job -ScriptBlock { Start-Sleep -Seconds 15 }
Start-Job -ScriptBlock { Start-Sleep -Seconds 25 }
Get-Job | Stop-Job

这会启动两个睡眠作业,然后停止所有作业。管道将所有作业传递给 Stop-Job。所有后台任务都被终止。

来源

PowerShell 文档

在本文中,我们介绍了 PowerShell 中的 Stop-Job cmdlet。

作者

我的名字是 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出 所有 PowerShell 教程