Start-Job

启动 PowerShell 后台作业。

语法

Start-Job
     [-Name <String>]
     [-ScriptBlock] <ScriptBlock>
     [-Credential <PSCredential>]
     [-Authentication <AuthenticationMechanism>]
     [[-InitializationScript] <ScriptBlock>]
     [-RunAs32]
     [-PSVersion <Version>]
     [-InputObject <PSObject>]
     [-ArgumentList <Object[]>]
     [<CommonParameters>]
Start-Job
     [-DefinitionName] <String>
     [[-DefinitionPath] <String>]
     [[-Type] <String>]
     [<CommonParameters>]
Start-Job
     [-Name <String>]
     [-Credential <PSCredential>]
     [-FilePath] <String>
     [-Authentication <AuthenticationMechanism>]
     [[-InitializationScript] <ScriptBlock>]
     [-RunAs32]
     [-PSVersion <Version>]
     [-InputObject <PSObject>]
     [-ArgumentList <Object[]>]
     [<CommonParameters>]
Start-Job
     [-Name <String>]
     [-Credential <PSCredential>]
     -LiteralPath <String>
     [-Authentication <AuthenticationMechanism>]
     [[-InitializationScript] <ScriptBlock>]
     [-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

从 Windows PowerShell 3.0 开始,Start-Job 可以启动自定义作业类型(例如计划作业)的实例。 有关如何 Start-Job 启动具有自定义类型的作业的信息,请参阅作业类型功能的帮助文档。

作业的默认工作目录是硬编码的。 Windows 默认值为 $HOME\Documents,Linux 或 macOS 上的默认值为 $HOME。 后台作业中运行的脚本代码需要根据需要管理工作目录。

示例

示例 1:启动后台作业

此示例启动在本地计算机上运行的后台作业。

Start-Job -ScriptBlock { Get-Process -Name powershell }

Id  Name   PSJobTypeName   State     HasMoreData   Location    Command
--  ----   -------------   -----     -----------   --------    -------
1   Job1   BackgroundJob   Running   True          localhost   Get-Process -Name powershell

Start-Job 使用 ScriptBlock 参数将 Get-Process 作为后台作业运行。 Name 参数指定查找 PowerShell 进程 powershell。 当作业在后台运行时,会显示作业信息并且 PowerShell 会返回提示。

若要查看作业的输出,请使用 Receive-Job cmdlet。 例如 Receive-Job -Id 1

示例 2:使用 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-ContentC:\Servers.txt 文件获取服务器名称。

ScriptBlock 参数指定 Get-Service 获取 WinRM 服务的命令。 JobName 参数指定作业的易记名称:WinRM。 ThrottleLimit 参数将并发命令的数量限制为 16 个。 AsJob 参数启动在服务器上运行命令的后台作业。

示例3:获取作业信息

此示例获取有关作业的信息并显示在本地计算机上运行的已完成作业的结果。

$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 来获取 System 日志。 Credential 参数指定有权在计算机上运行作业的域用户帐户。 作业对象存储在 $j 变量中。

$j 变量中的对象沿着管道发送到 Select-Object。 Property 参数指定星号 (*) 以显示作业对象的所有属性。

示例 4:将脚本作为后台作业运行

在此示例中,本地计算机上的脚本作为后台作业运行。

Start-Job -FilePath C:\Scripts\Sample.ps1

Start-Job 使用 FilePath 参数指定存储在本地计算机上的脚本文件。

示例 5:使用后台作业获取进程

此示例使用后台作业按名称获取指定进程。

Start-Job -Name PShellJob -ScriptBlock { Get-Process -Name PowerShell }

Start-Job 使用 Name 参数指定易记的作业名称 PShellJob。 ScriptBlock 参数指定 Get-Process 以获取名为 PowerShell 的进程。

示例 6:使用后台作业收集和保存数据

此示例启动一个收集大量地图数据的作业,然后将其保存在 .tif 文件中。

Start-Job -Name GetMappingFiles -InitializationScript {Import-Module -Name MapFunctions} -ScriptBlock {
   Get-Map -Name * | Set-Content -Path D:\Maps.tif } -RunAs32

Start-Job 使用 Name 参数指定易记的作业名称 GetMappingFiles。 InitializationScript 参数运行导入 MapFunctions 模块的脚本块。 ScriptBlock 参数运行 Get-Map,并且 Set-Content 将数据保存在 Path 参数指定的位置。 RunAs32 参数以 32 位运行该进程,即使在 64 位操作系统上也是如此。

示例 7:将输入传递到后台作业

此示例使用 $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 参数来运行带有 $input 自动变量的 Get-Content$input 变量从 InputObject 参数获取对象。 Receive-Job 使用 Name 参数指定作业并输出结果。 Keep 参数保存作业输出,以便在 PowerShell 会话期间再次查看。

示例 8:使用 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 和 notepad 是在本地计算机上运行的进程。

若要查看作业的输出,请使用 Receive-Job cmdlet。 例如 Receive-Job -Id 1

参数

-ArgumentList

为由 FilePath 参数指定的脚本或用 ScriptBlock 参数指定的命令指定参数或参数值的数组。

参数必须作为一维数组参数传递到 ArgumentList。 例如,以逗号分隔的列表。 有关 ArgumentList 的行为的详细信息,请参阅 about_Splatting

Type:Object[]
Aliases:Args
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Authentication

指定用于对用户凭据进行身份验证的机制。

此参数的可接受值如下所示:

  • 默认值
  • 基本
  • Credssp
  • 摘要
  • Kerberos
  • Negotiate
  • NegotiateWithImplicitCredential

默认值为 Default。

CredSSP 身份验证仅在 Windows Vista、Windows Server 2008 和更高版本的 Windows 操作系统中可用。

有关此参数的值的详细信息,请参阅 AuthenticationMechanism

注意

在凭据安全支持提供程序 (CredSSP) 身份验证中,用户凭据传递到远程计算机中进行验证,这种验证用于要求对多个资源进行验证的命令(例如访问远程网络共享时使用的命令)。 此机制增加了远程操作的安全风险。 如果远程计算机的安全受到威胁,则传递给该计算机的凭据可用于控制网络会话。

Type:AuthenticationMechanism
Accepted values:Default, Basic, Negotiate, NegotiateWithImplicitCredential, Credssp, Digest, Kerberos
Position:Named
Default value:Default
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Credential

指定有权执行此操作的用户帐户。 如果未指定 Credential 参数,该命令将使用当前用户的凭据。

键入用户名,如 User01 或 Domain01\User01;或输入 Get-Credential cmdlet 生成的 PSCredential 对象。 如果键入用户名,系统会提示输入密码。

凭据存储在 PSCredential 对象中,密码存储为 SecureString

注意

有关 SecureString 数据保护的详细信息,请参阅 SecureString 的安全性如何?

Type:PSCredential
Position:Named
Default value:Current user
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-DefinitionName

指定此 cmdlet 启动的作业的定义名称。 使用此参数来启动具有定义名称的自定义作业,例如计划作业。

使用 Start-Job 启动计划作业的实例时,将立即启动该作业,而不考虑作业触发器或作业选项。 生成的作业实例是计划作业,但它不会和触发的计划作业一样保存到磁盘。 不能使用 Start-JobArgumentList 参数为运行在计划作业中的脚本的参数提供值。 有关详细信息,请参阅 about_Scheduled_Jobs

此参数是在 PowerShell 3.0 中引入的。

Type:String
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-DefinitionPath

指定此 cmdlet 启动的作业的定义的路径。 输入定义路径。 DefinitionPath 和 DefinitionName 参数的值的串联为作业定义的完全限定路径。 使用此参数来启动具有定义路径的自定义作业,例如计划作业。

对于计划作业,DefinitionPath 参数的值为 $HOME\AppData\Local\Windows\PowerShell\ScheduledJob

此参数是在 PowerShell 3.0 中引入的。

Type:String
Position:1
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-FilePath

指定 Start-Job 作为后台作业运行的本地脚本。 输入脚本的路径和文件名,或使用管道将脚本路径发送到 Start-Job。 该脚本必须位于本地计算机上或本地计算机可以访问的文件夹中。

使用此参数时,PowerShell 会将指定脚本文件的内容转换为脚本块,并将该脚本块作为后台作业运行。

Type:String
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-InitializationScript

指定在作业开始前运行的命令。 若要创建脚本块,请将命令括在大括号 ({}) 中。

使用此参数可以准备运行作业的会话。 例如,可以使用它将函数、管理单元和模块添加到会话中。

Type:ScriptBlock
Position:1
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-InputObject

指定命令的输入。 请输入包含对象的变量,或者键入可生成对象的命令或表达式。

在 ScriptBlock 参数的值中,请使用 $input 自动变量来表示输入对象。

Type:PSObject
Position:Named
Default value:None
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-LiteralPath

指定此 cmdlet 作为后台作业运行的本地脚本。 在本地计算机上输入脚本的路径。

Start-Job 使用的 LiteralPath 参数值与所键入的形式完全相同。 不会将任何字符解释为通配字符。 如果路径包括转义符,请将其括在单引号中。 单引号告知 PowerShell 不要将任何字符解释为转义序列。

Type:String
Aliases:PSPath
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-Name

为新作业指定一个友好名称。 可以使用名称区分该作业与其他作业 cmdlet,例如 Stop-Job cmdlet。

默认易记名称为 Job#,其中 # 是针对每个作业进行递增的序号。

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-PSVersion

指定版本。 Start-Job 使用 PowerShell 版本运行作业。 此参数的可接受的值是 2.03.0

此参数是在 PowerShell 3.0 中引入的。

Type:Version
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-RunAs32

指示 Start-Job 在 32 位进程中运行作业。 RunAs32 强制作业在 32 位进程中运行,即使在 64 位操作系统上也是如此。

在 64 位版本的 Windows 7 和 Windows Server 2008 R2 上,当 Start-Job 命令包含 RunAs32 参数时,将无法使用 Credential 参数来指定另一个用户的凭据。

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ScriptBlock

指定要在后台作业中运行的命令。 若要创建脚本块,请将命令括在大括号 ({}) 中。 使用 $input 自动变量访问 InputObject 参数的值。 此参数是必需的。

Type:ScriptBlock
Aliases:Command
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-Type

指定由 Start-Job 启动的作业的自定义类型。 输入自定义作业类型名称,例如 PSScheduledJob(对于计划作业)或 PSWorkflowJob(对于工作流作业)。 此参数对标准后台作业无效。

此参数是在 PowerShell 3.0 中引入的。

Type:String
Position:2
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

输入

String

可以通过管道将具有 Name 属性的对象传递给此 cmdlet 的 Name 参数。 例如,可以通过管道从 Get-ChildItem 传递 FileInfo 对象。

输出

System.Management.Automation.PSRemotingJob

此 cmdlet 将返回一个表示其启动的作业的 PSRemotingJob 对象。

备注

Windows PowerShell 包含以下 Start-Job 别名:

  • sajb

为了在后台运行,Start-Job 将在当前会话中它自身的会话中运行。 使用 Invoke-Command cmdlet 在远程计算机上的会话中运行 Start-Job 命令时,Start-Job 将在远程会话中的会话中运行。