只有一个作业在运行时,Get-Job出现意外行为

时间:2013-01-31 13:13:22

标签: powershell powershell-v2.0

我是Powershell的新手,我遇到了Get-Job命令的问题。在我的脚本中,我正在测试多线程并且正在做类似的事情:

$Program = {
    "Thread " + $args[0];
    Start-Sleep 5;
}
Start-Job $Program -ArgumentList @($i) | Out-Null

Start-Job调用实际上处于循环中,我正在创建多个作业。在此之下,我有:

Get-Job
"Jobs Running: " + $(Get-Job -State Running).count 

如果有多个作业在运行,我会得到如下输出:

Id              Name            State      HasMoreData     Location             Command
--              ----            -----      -----------     --------             -------
2201            Job2201         Running    True            localhost            ...
2199            Job2199         Running    True            localhost            ...
2197            Job2197         Running    True            localhost            ...
2195            Job2195         Running    True            localhost            ...
2193            Job2193         Completed  True            localhost            ...
2191            Job2191         Completed  True            localhost            ...
2189            Job2189         Completed  True            localhost            ...
2187            Job2187         Completed  True            localhost            ...
Jobs Running: 4

但是如果只有一个作业在运行,那么$(Get-Job -State Running).count似乎没有返回任何内容:

Id              Name            State      HasMoreData     Location             Command
--              ----            -----      -----------     --------             -------
2207            Job2207         Running    True            localhost            ...
Jobs Running:

正如您所看到的,有一个作业正在运行,但$(Get-Job -State Running).count不会返回任何内容。知道这里发生了什么吗?对我来说,看起来如果有多个作业,$(Get-Job -State Running)返回一个具有.count属性的作业集合,而如果只有一个作业,它只返回该作业,并且没有.count属性。如果是这种情况(或者我做错了什么),我应该使用什么命令来获得$(Get-Job -State Running).count == 1的预期结果?

2 个答案:

答案 0 :(得分:3)

尝试使用Measure-Object

$(Get-Job -State Running | Measure-Object).count

答案 1 :(得分:2)

在PS 2.0中count仅适用于数组。当Get-Job仅返回一个作业时,它将其作为OBJECT返回,而不是数组。为了使它工作,你可以例如强制Get-Job始终使用@(code)返回数组。试试这个:

$Program = {
    "Thread " + $args[0];
    Start-Sleep 5;
}
Start-Job $Program -ArgumentList @($i) | Out-Null

Get-Job
"Jobs Running: " + $(@(Get-Job -State Running).count)