2

我是 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

4

2 回答 2

3

尝试使用测量对象

$(Get-Job -State Running | Measure-Object).count
于 2013-01-31T13:19:23.563 回答
2

在 PS 2.0count中仅适用于数组。当Get-Job只返回一个作业时,它将它作为一个对象返回,而不是一个数组。为了使其工作,您可以例如强制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) 
于 2013-01-31T13:25:49.667 回答