Start-Job
启动 PowerShell 后台作业。
语法
Start-Job
[-Name <String>]
[-ScriptBlock] <ScriptBlock>
[-Credential <PSCredential>]
[-Authentication <AuthenticationMechanism>]
[[-InitializationScript] <ScriptBlock>]
[-WorkingDirectory <String>]
[-RunAs32]
[-PSVersion <Version>]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Start-Job
[-DefinitionName] <String>
[[-DefinitionPath] <String>]
[[-Type] <String>]
[-WorkingDirectory <String>]
[<CommonParameters>]
Start-Job
[-Name <String>]
[-Credential <PSCredential>]
[-FilePath] <String>
[-Authentication <AuthenticationMechanism>]
[[-InitializationScript] <ScriptBlock>]
[-WorkingDirectory <String>]
[-RunAs32]
[-PSVersion <Version>]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Start-Job
[-Name <String>]
[-Credential <PSCredential>]
-LiteralPath <String>
[-Authentication <AuthenticationMechanism>]
[[-InitializationScript] <ScriptBlock>]
[-WorkingDirectory <String>]
[-RunAs32]
[-PSVersion <Version>]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
说明
Start-Job
cmdlet 在本地计算机上启动 PowerShell 后台作业。
PowerShell 后台作业在不与当前会话交互的情况下运行命令。 启动后台作业时,即使作业需要较长时间才能完成,作业对象也会立即返回。 当该作业运行时,你可以继续在此会话中工作而不会发生中断。
作业对象包含有关该作业的有用信息,但是不包含作业结果。
作业完成后,使用 Receive-Job
cmdlet 获取作业的结果。 有关后台作业的详细信息,请参阅 about_Jobs。
若要在远程计算机上运行后台作业,请使用许多 cmdlet 上提供的 AsJob 参数,或使用 Invoke-Command
cmdlet 在远程计算机上运行 Start-Job
命令。 有关详细信息,请参阅 about_Remote_Jobs。
从 PowerShell 3.0 开始,Start-Job
可以启动自定义作业类型的实例,例如计划作业。 有关如何使用 Start-Job
通过自定义类型启动作业的信息,请参阅作业类型功能的帮助文档。
从 PowerShell 6.0 开始,可以使用 ampersand (&
) 后台运算符启动作业。 后台运算符的功能类似于 Start-Job
。 启动作业的这两种方法都创建 PSRemotingJob 作业对象。 有关使用和号(&
),请参阅 about_Operators。
PowerShell 7 引入了指定后台作业的初始工作目录的 WorkingDirectory 参数。 如果未指定参数,Start-Job
默认为启动作业的调用方当前工作目录。
注释
在其他应用程序(如 PowerShell Azure Functions)中托管 PowerShell 的情况下,不支持使用 Start-Job
创建进程外后台作业。
这是设计使然,因为 Start-Job
依赖于 pwsh
下可用的 $PSHOME
可执行文件来启动进程外后台作业,但是当应用程序托管 PowerShell 时,它直接使用 PowerShell NuGet SDK 包,并且不会附带 pwsh
。
该方案中的替换项是从模块 Start-ThreadJob
。
示例
示例 1:启动后台作业
此示例启动在本地计算机上运行的后台作业。
Start-Job -ScriptBlock { Get-Process -Name pwsh }
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Running True localhost Get-Process -Name pwsh
Start-Job
使用 ScriptBlock 参数将 Get-Process
作为后台作业运行。
Name 参数指定查找 PowerShell 进程,pwsh
。 将显示作业信息,PowerShell 在后台运行作业时返回提示。
若要查看作业的输出,请使用 Receive-Job
cmdlet。 例如,Receive-Job -Id 1
。
示例 2:使用后台运算符启动后台作业
此示例使用 ampersand (&
) 后台运算符在本地计算机上启动后台作业。 该作业获得的结果与示例 1 中的 Start-Job
相同。
Get-Process -Name pwsh &
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
5 Job5 BackgroundJob Running True localhost Microsoft.PowerShell.Man...
Get-Process
使用 Name 参数来指定 PowerShell 进程,pwsh
。 和 (&
) 将命令作为后台作业运行。 将显示作业信息,PowerShell 在后台运行作业时返回提示。
若要查看作业的输出,请使用 Receive-Job
cmdlet。 例如,Receive-Job -Id 5
。
示例 3:使用 Invoke-Command 启动作业
此示例在多台计算机上运行作业。 作业存储在变量中,并使用 PowerShell 命令行上的变量名称执行。
$jobWRM = Invoke-Command -ComputerName (Get-Content -Path C:\Servers.txt) -ScriptBlock {
Get-Service -Name WinRM } -JobName WinRM -ThrottleLimit 16 -AsJob
使用 Invoke-Command
的作业将创建并存储在 $jobWRM
变量中。
Invoke-Command
使用 ComputerName 参数指定运行作业的计算机。
Get-Content
从 C:\Servers.txt
文件中获取服务器名称。
ScriptBlock 参数指定一个命令,该命令 Get-Service
获取 WinRM 服务。
JobName 参数指定作业的友好名称,WinRM。
ThrottleLimit 参数将并发命令数限制为 16。
AsJob 参数启动在服务器上运行命令的后台作业。
示例 4:获取作业信息
此示例获取有关作业的信息,并显示在本地计算机上运行的已完成作业的结果。
$j = Start-Job -ScriptBlock { Get-WinEvent -Log System } -Credential Domain01\User01
$j | Select-Object -Property *
State : Completed
HasMoreData : True
StatusMessage :
Location : localhost
Command : Get-WinEvent -Log System
JobStateInfo : Completed
Finished : System.Threading.ManualResetEvent
InstanceId : 27ce3fd9-40ed-488a-99e5-679cd91b9dd3
Id : 18
Name : Job18
ChildJobs : {Job19}
PSBeginTime : 8/8/2019 14:41:57
PSEndTime : 8/8/2019 14:42:07
PSJobTypeName : BackgroundJob
Output : {}
Error : {}
Progress : {}
Verbose : {}
Debug : {}
Warning : {}
Information : {}
Start-Job
使用 ScriptBlock 参数运行指定 Get-WinEvent
以获取 系统 日志的命令。
Credential 参数指定有权在计算机上运行作业的域用户帐户。 作业对象存储在 $j
变量中。
将 $j
变量中的对象向下发送到 Select-Object
。
属性 参数指定一个星号(*
)以显示所有作业对象的属性。
示例 5:将脚本作为后台作业运行
在此示例中,本地计算机上的脚本作为后台作业运行。
Start-Job -FilePath C:\Scripts\Sample.ps1
Start-Job
使用 FilePath 参数指定存储在本地计算机上的脚本文件。
示例 6:使用后台作业获取进程
此示例使用后台作业按名称获取指定的进程。
Start-Job -Name PShellJob -ScriptBlock { Get-Process -Name PowerShell }
Start-Job
使用 Name 参数指定友好作业名称,PShellJob。
ScriptBlock 参数指定 Get-Process
获取名称 为 PowerShell的进程。
示例 7:使用后台作业收集和保存数据
此示例启动收集大量地图数据的作业,然后将其保存在 .tif
文件中。
Start-Job -Name GetMappingFiles -InitializationScript {Import-Module -Name MapFunctions} -ScriptBlock {
Get-Map -Name * | Set-Content -Path D:\Maps.tif }
Start-Job
使用 Name 参数指定友好作业名称,GetMappingFiles。
初始化Script 参数运行一个脚本块,该脚本块导入 MapFunctions 模块。
ScriptBlock 参数 Get-Map
运行,Set-Content
将数据保存在 Path 参数指定的位置。
示例 8:将输入传递到后台作业
此示例使用 $input
自动变量来处理输入对象。 使用 Receive-Job
查看作业的输出。
Start-Job -ScriptBlock { Get-Content -Path $input } -InputObject "C:\Servers.txt"
Receive-Job -Name Job45 -Keep
Server01
Server02
Server03
Server04
Start-Job
使用 ScriptBlock 参数通过 Get-Content
自动变量运行 $input
。
$input
变量从 InputObject 参数中获取对象。
Receive-Job
使用 Name 参数指定作业并输出结果。
Keep 参数保存作业输出,以便在 PowerShell 会话期间再次查看它。
示例 9:为后台作业设置工作目录
WorkingDirectory 允许为作业指定备用目录,以便从中运行脚本或打开文件。 在此示例中,后台作业指定与当前目录位置不同的工作目录。
PS C:\Test> Start-Job -WorkingDirectory C:\Test\Scripts { $PWD } | Receive-Job -AutoRemoveJob -Wait
Path
----
C:\Test\Scripts
此示例的当前工作目录 C:\Test
。
Start-Job
使用 WorkingDirectory 参数来指定作业的工作目录。
ScriptBlock 参数使用 $PWD
来显示作业的工作目录。
Receive-Job
显示后台作业的输出。
AutoRemoveJob 删除作业,Wait 将取消命令提示符,直到收到所有结果。
示例 10:使用 ArgumentList 参数指定数组
此示例使用 ArgumentList 参数来指定参数数组。 该数组是进程名称的逗号分隔列表。
Start-Job -ScriptBlock { Get-Process -Name $args } -ArgumentList powershell, pwsh, notepad
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Running True localhost Get-Process -Name $args
Start-Job
cmdlet 使用 ScriptBlock 参数来运行命令。
Get-Process
使用 Name 参数指定自动变量 $args
。
ArgumentList 参数将进程名称数组传递给 $args
。 进程名称 powershell、pwsh 和记事本是在本地计算机上运行的进程。
若要查看作业的输出,请使用 Receive-Job
cmdlet。 例如,Receive-Job -Id 1
。
示例 11:在 Windows PowerShell 5.1 中运行作业
此示例使用值为 5.1 的 PSVersion 参数在 Windows PowerShell 5.1 会话中运行作业。
$PSVersionTable.PSVersion
Major Minor Patch PreReleaseLabel BuildLabel
----- ----- ----- --------------- ----------
7 0 0 rc.1
$job = Start-Job -ScriptBlock { $PSVersionTable.PSVersion } -PSVersion 5.1
Receive-Job -Job $job
Major Minor Build Revision
----- ----- ----- --------
5 1 14393 3383
参数
-ArgumentList
为由 FilePath 参数指定的脚本或 ScriptBlock 参数指定的命令指定参数或参数值数组。
参数必须作为单维数组参数传递给 ArgumentList。 例如,逗号分隔的列表。 有关 ArgumentList 的行为的详细信息,请参阅 about_Splatting。
类型: | Object[] |
别名: | Args |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-Authentication
指定用于对用户凭据进行身份验证的机制。
此参数的可接受值如下所示:
- 违约
- 基本
- Credssp
- 摘要
- Kerberos
- 谈判
- NegotiateWithImplicitCredential
默认值为 Default。
CredSSP 身份验证仅在 Windows Vista、Windows Server 2008 和更高版本的 Windows 操作系统中可用。
有关此参数的值的详细信息,请参阅 AuthenticationMechanism。
谨慎
在凭据安全支持提供程序 (CredSSP) 身份验证中,用户凭据传递到远程计算机中进行验证,这种验证用于要求对多个资源进行验证的命令(例如访问远程网络共享时使用的命令)。 此机制增加了远程操作的安全风险。 如果远程计算机的安全受到威胁,则传递给该计算机的凭据可用于控制网络会话。
类型: | AuthenticationMechanism |
接受的值: | Default, Basic, Negotiate, NegotiateWithImplicitCredential, Credssp, Digest, Kerberos |
Position: | Named |
默认值: | Default |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-Credential
指定有权执行此操作的用户帐户。 如果未指定 Credential 参数,该命令将使用当前用户的凭据。
键入用户名(如 User01 或 Domain01\User01),或输入由 cmdlet 生成的 Get-Credential
对象。 如果键入用户名,系统会提示输入密码。
凭据存储在 PSCredential 对象中,密码存储为 SecureString。
注释
有关 SecureString 数据保护的详细信息,请参阅 SecureString 的安全性如何?。
类型: | PSCredential |
Position: | Named |
默认值: | Current user |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-DefinitionName
指定此 cmdlet 启动的作业的定义名称。 使用此参数可以启动具有定义名称的自定义作业类型,例如计划作业。
使用 Start-Job
启动计划作业的实例时,无论作业触发器或作业选项如何,作业都会立即启动。 生成的作业实例是计划作业,但它不会像触发的计划作业一样保存到磁盘。 不能使用 Start-Job
参数为在计划作业中运行的脚本的参数提供值。
此参数是在 PowerShell 3.0 中引入的。
类型: | String |
Position: | 0 |
默认值: | None |
必需: | True |
接受管道输入: | False |
接受通配符: | False |
-DefinitionPath
指定此 cmdlet 启动的作业的定义的路径。 输入定义路径。 DefinitionPath 和 DefinitionName 参数的值的串联是作业定义的完全限定路径。 使用此参数启动具有定义路径的自定义作业类型,例如计划作业。
对于计划作业,DefinitionPath 参数的值 $HOME\AppData\Local\Windows\PowerShell\ScheduledJob
。
此参数是在 PowerShell 3.0 中引入的。
类型: | String |
Position: | 1 |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-FilePath
指定 Start-Job
作为后台作业运行的本地脚本。 输入脚本的路径和文件名,或使用管道将脚本路径发送到 Start-Job
。 该脚本必须位于本地计算机或本地计算机可以访问的文件夹中。
使用此参数时,PowerShell 会将指定脚本文件的内容转换为脚本块,并将脚本块作为后台作业运行。
类型: | String |
Position: | 0 |
默认值: | None |
必需: | True |
接受管道输入: | False |
接受通配符: | False |
-InitializationScript
指定在作业启动前运行的命令。 若要创建脚本块,请将命令括在大括号 ({}
) 中。
使用此参数准备运行作业的会话。 例如,可以使用它向会话添加函数、管理单元和模块。
类型: | ScriptBlock |
Position: | 1 |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-InputObject
指定命令的输入。 输入包含对象的变量,或键入生成对象的命令或表达式。
在 ScriptBlock 参数的值中,使用 $input
自动变量来表示输入对象。
类型: | PSObject |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | True |
接受通配符: | False |
-LiteralPath
指定此 cmdlet 作为后台作业运行的本地脚本。 在本地计算机上输入脚本的路径。
Start-Job
按类型化方式使用 LiteralPath 参数的值。 不会将任何字符解释为通配字符。 如果路径包含转义字符,请将它括在单引号中。 单引号告知 PowerShell 不要将任何字符解释为转义序列。
类型: | String |
别名: | PSPath, LP |
Position: | Named |
默认值: | None |
必需: | True |
接受管道输入: | False |
接受通配符: | False |
-Name
指定新作业的友好名称。 可以使用名称将作业标识到其他作业 cmdlet,例如 Stop-Job
cmdlet。
默认友好名称为 Job#
,其中 #
是每个作业递增的序号。
类型: | String |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | True |
接受通配符: | False |
-PSVersion
指定要用于运行作业的 PowerShell 版本。 PSVersion 的值 5.1 作业在 Windows PowerShell 5.1 会话中运行。 对于任何其他值,作业将使用当前版本的 PowerShell 运行。
此参数已添加到 PowerShell 7 中,仅适用于 Windows。
类型: | Version |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-RunAs32
从 PowerShell 7 开始,RunAs32 参数不适用于 64 位 PowerShell(pwsh
)。
如果在 64 位 PowerShell 中指定了 RunAs32,Start-Job
将引发终止异常错误。
若要使用 pwsh
启动 32 位 PowerShell()进程,需要安装 32 位 PowerShell。
在 32 位 PowerShell 中,RunAs32 强制作业在 32 位进程中运行,即使在 64 位作系统上也是如此。
在 64 位版本的 Windows 7 和 Windows Server 2008 R2 上,当 Start-Job
命令包含 RunAs32 参数时,无法使用 Credential 参数来指定其他用户的凭据。
类型: | SwitchParameter |
Position: | Named |
默认值: | False |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-ScriptBlock
指定要在后台作业中运行的命令。 若要创建脚本块,请将命令括在大括号 ({}
) 中。 使用 $input
自动变量访问 InputObject 参数的值。 此参数是必需的。
类型: | ScriptBlock |
别名: | Command |
Position: | 0 |
默认值: | None |
必需: | True |
接受管道输入: | False |
接受通配符: | False |
-Type
指定由 Start-Job
启动的作业的自定义类型。 输入自定义作业类型名称,例如计划作业的 PSScheduledJob 或工作流作业的 PSWorkflowJob。 此参数对标准后台作业无效。
此参数是在 PowerShell 3.0 中引入的。
类型: | String |
Position: | 2 |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-WorkingDirectory
指定后台作业的初始工作目录。 如果未指定参数,作业将从默认位置运行。 默认位置是启动作业的调用方当前工作目录。
此参数是在 PowerShell 7 中引入的。
类型: | String |
Position: | Named |
默认值: | $HOME on Unix (macOS, Linux) and $HOME\Documents on Windows |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
输入
可以通过管道将具有 Name 属性的对象传递给此 cmdlet 的 Name 参数。 例如,可以通过管道从 通过 Get-ChildItem
对象。
输出
System.Management.Automation.PSRemotingJob
此 cmdlet 返回一个 PSRemotingJob 对象,该对象表示启动的作业。
备注
PowerShell 包含以下与 Start-Job
相关的别名:
- 所有平台:
sajb
若要在后台运行,Start-Job
在当前会话中在其自己的会话中运行。 使用 Invoke-Command
cmdlet 在远程计算机上的会话中运行 Start-Job
命令时,Start-Job
在远程会话中的会话中运行。