我很好奇为什么Start-Job增加了两个。我担心的是我做错了什么使得新工作的ID跳了2。
Start-Job -ScriptBlock {Get-WinEvent -LogName system -MaxEvents 1000}
Get-Job
显示的结果Id Name State HasMoreData Command
-- ---- ----- ----------- -------
2 Job2 Completed False Get-WinEvent -LogName system -MaxEvents 1000
4 Job4 Completed False Get-WinEvent -LogName system -MaxEvents 1000
6 Job6 Completed True Get-WinEvent -LogName system -MaxEvents 1000
问题:您可以控制Start-Job Id增量,还是强制它们只是1?
答案 0 :(得分:10)
每次开始工作时,它都包含父工作和一个或多个子工作。如果您运行get-job | fl
,您将看到子作业,并且您会看到他们的名字是“缺少的”奇数名称。
答案 1 :(得分:5)
@ 1.618给出正确的答案,这里有更多细节:
Start-Job -ScriptBlock {Get-Process}
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 Job2 BackgroundJob Running True localhost Get-Process
Get-Job | fl *
State : Completed
HasMoreData : True
StatusMessage :
Location : localhost
Command : Get-Process
JobStateInfo : Completed
Finished : System.Threading.ManualResetEvent
InstanceId : 49a67ca4-840b-49ec-b293-efa9303e38bb
Id : 2
Name : Job2
ChildJobs : {Job3}
PSBeginTime : 03/03/2014 20:43:54
PSEndTime : 03/03/2014 20:44:00
PSJobTypeName : BackgroundJob
Output : {}
Error : {}
Progress : {}
Verbose : {}
Debug : {}
Warning : {}
get-job -IncludeChildJob
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 Job2 BackgroundJob Completed True localhost Get-Process
3 Job3 Completed True localhost Get-Process
这就是为什么当你开始工作时,powershell会创建两个工作?
通过Start-Job
创建的Windows PowerShell作业始终由父作业和子作业组成。孩子的工作做了实际的工作。如果使用Invoke-Command
及其–AsJob
参数对多个远程计算机运行作业,则每个远程计算机将获得一个子作业。
管理作业时,您对父作业执行的任何操作都会自动应用于任何子作业。删除或停止父作业会对子作业执行相同的操作。获取父作业的结果意味着您将获得所有子作业的结果。
您可以直接访问子作业以检索其数据,这是一项简单的工作,例如,您可以通过父作业或子作业访问数据:
Receive-Job -Id 2 -Keep
Receive-Job -Id 3 -Keep
当您有多个子作业时,通常可以更容易地依次访问子作业:
$jobs = Get-Job -Name Job2 | select -ExpandProperty ChildJobs
foreach ($job in $jobs){Receive-Job -Job $job -Keep}