系统学习 学习路径总入口:先选领域,再建立模型,最后用故障演练验证

版本信息最后核对:2026-10-25

把耗时任务放到后台或并行执行,并在需要时收集结果、停止和清理

适用场景

适合批量查询多台主机、下载或处理大量文件、同时跑多个互不依赖的检查,以及把长任务从交互会话里移开。远程批量任务用 Invoke-Command -AsJob,本机 I/O 等待型任务用后台作业或线程作业,大量小任务用 ForEach-Object -Parallel。

不适合需要窗口交互、需要共享大量可变状态、或必须严格顺序执行的任务。作业不是服务,宿主进程退出后本地作业通常就没了;需要持久化就用计划任务或真正的服务。

核心概念

5.1 与 7.x 差异

常用操作

# 1. 启动后台作业,等待后只取一次输出,再删除作业
PS C:\> Start-Job -Name Slow -ScriptBlock { Start-Sleep 3; Get-Date }
PS C:\> Get-Job -Name Slow
PS C:\> Wait-Job -Name Slow | Receive-Job
PS C:\> Remove-Job -Name Slow

# 2. 作业不继承变量,参数用 -ArgumentList 传入
PS C:\> $path = 'C:\Windows'
PS C:\> Start-Job -ScriptBlock { param($p) Get-ChildItem $p -Filter *.log } -ArgumentList $path

# 3. 多主机远程执行并作为作业管理,主线程可以继续做别的事
PS C:\> Invoke-Command -ComputerName SRV01, SRV02 -AsJob -ScriptBlock { Get-Service Spooler }
PS C:\> Get-Job | Wait-Job | Receive-Job

# 4. 线程作业启动更快,适合同一进程内的短任务
PS C:\> Start-ThreadJob -ScriptBlock { (Get-Process).Count }

# 5. 7.x 并行管道;每个输入用 $using: 引用外部变量
PS C:\> 1..10 | ForEach-Object -Parallel { Start-Sleep -Milliseconds 200; "完成 $_" } -ThrottleLimit 5

# 6. 超时控制:Wait-Job 超时后返回空,要自己检查状态
PS C:\> Get-Job | Wait-Job -Timeout 30
PS C:\> Get-Job | Where-Object State -eq 'Running' | Stop-Job

# 7. 取结果时保留缓存,方便再次查看;最后统一清理
PS C:\> Get-Job | Receive-Job -Keep
PS C:\> Get-Job | Remove-Job -Force

易错点

相关命令

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. Start-Job 里的脚本为什么读不到主会话的变量和当前目录?
  2. Receive-Job 第二次没有输出,怎么排查和避免?
  3. 什么情况下选线程作业,什么情况下必须用独立进程作业?
答案
  1. 后台作业在独立 PowerShell 进程中运行,只接收显式传入的参数和初始化脚本,不共享主会话的变量、函数、模块和当前位置。
  2. Receive-Job 默认取走并清空输出缓存;用 -Keep 保留,或先保存结果变量。若仍为空,再查 Get-Job 的状态和错误流。
  3. 短任务、同一进程内可接受共享状态时选线程作业;需要进程隔离、加载冲突模块或某任务可能崩溃/占用大量原生资源时用独立进程作业。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令