PowerShell Start-Job
最后修改:2025 年 2 月 15 日
在本文中,我们将介绍PowerShell中的Start-Job
cmdlet。此cmdlet允许您在后台以独立作业的形式运行命令。后台作业对于长时间运行的任务很有用。
作业基础
PowerShell作业是在当前会话之外独立在后台运行的任务。作业允许命令并行执行,而不会阻塞控制台。每个作业都有一个唯一的ID和状态(运行中、已完成、失败)。Start-Job
cmdlet用于启动后台作业。
Start-Job 的基本用法
使用Start-Job
的最简单方法是使用包含要运行的命令的脚本块。作业会立即启动并在后台运行。您可以在作业执行期间继续工作。
Start-Job -ScriptBlock { Get-Process }
此命令启动一个后台作业,该作业检索进程信息。作业独立于当前会话运行。您可以使用Get-Job
检查其状态。
命名作业
您可以为作业分配一个名称以便于识别。使用 -Name 参数,后跟您选择的名称。在处理多个后台任务时,命名作业更容易管理。名称会出现在作业列表的输出中。
Start-Job -Name "ProcessJob" -ScriptBlock { Get-Process }
此命令启动一个已命名的后台作业。该作业在作业列表中显示为“ProcessJob”。命名作业可以通过名称而不是ID来引用,以便于使用。
向作业传递参数
您可以使用 -ArgumentList 参数向作业传递参数。参数在脚本块中可以作为$args或命名变量使用。这允许基于输入值的动态作业行为。参数是按位置传递的。
Start-Job -ScriptBlock { param($pname) Get-Process -Name $pname } -ArgumentList "chrome"
此命令启动一个按名称获取进程的作业。将“chrome”参数传递给脚本块。param块声明了参数,使代码更清晰。该作业将检索Chrome进程。
使用不同的凭据运行作业
可以使用 -Credential 参数使用不同的凭据运行作业。当任务需要提升的权限时,这很有用。除非已存储凭据,否则会提示您输入凭据。作业以指定用户的安全上下文运行。
$cred = Get-Credential Start-Job -ScriptBlock { Get-WmiObject Win32_ComputerSystem } -Credential $cred
此命令启动一个使用指定凭据运行的作业。Get-Credential cmdlet会提示输入用户名和密码。作业将使用这些凭据执行WMI查询。适用于管理任务。
在远程计算机上运行作业
作业可以使用 -ComputerName 参数在远程计算机上执行。这允许分布式任务执行。远程计算机必须启用PowerShell远程处理。结果会返回到本地会话。
Start-Job -ScriptBlock { Get-Service } -ComputerName "Server01"
此命令在Server01上启动一个列出服务的作业。作业在远程运行,而您可以在本地继续工作。需要远程计算机上配置WinRM。适用于管理多台服务器。
并行运行多个作业
您可以同时启动多个作业进行并行处理。每个作业都独立运行,拥有自己的资源。这对于可以分解的任务很有用。PowerShell会自动管理作业执行。
1..5 | ForEach-Object { Start-Job -Name "Job$_" -ScriptBlock { Start-Sleep -Seconds 5; "Job $_ completed" } }
此命令启动五个作业,每个作业休眠5秒。作业并行运行,比顺序执行完成得更快。作业的名称分别为Job1到Job5,以便于识别。演示了并行处理能力。
运行带有初始化的作业
作业可以使用 -InitializationScript 参数包含初始化脚本。这将在主脚本块之前运行。对于设置环境变量或模块很有用。初始化脚本对每个作业运行一次。
$init = { Import-Module ActiveDirectory } Start-Job -InitializationScript $init -ScriptBlock { Get-ADUser -Filter * }
此命令在运行主脚本之前初始化AD模块。然后,作业可以使用AD cmdlets。初始化确保了所需组件的可用性。适用于复杂的作业设置。
使用不同的Runspace运行作业
高级用户可以为作业指定自定义Runspace。-Runspace参数接受一个Runspace对象。这允许对作业执行环境进行细粒度的控制。适用于特殊场景。
$rs = [RunspaceFactory]::CreateRunspace() $rs.Open() Start-Job -Runspace $rs -ScriptBlock { [System.Environment]::OSVersion }
此命令为作业创建了一个自定义Runspace。作业在此隔离的环境中运行。演示了高级作业配置。Runspace必须在使用前打开。需要理解PowerShell托管。
来源
在本文中,我们介绍了PowerShell中的Start-Job cmdlet。
作者
列出 所有 PowerShell 教程。