我是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
的预期结果?
答案 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)