【发布时间】:2013-01-31 13:13:21
【问题描述】:
我是 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 的预期结果?
【问题讨论】:
-
你看到了一点 PSH“帮助”(经常有帮助,但有时没有):如果表达式(包括管道)返回单个对象,如果有零个或多个一个对象,然后返回一个数组。因此,如果只存在一个作业,
Get-Job将返回没有Count(或Length)属性的作业对象。修复了当你总是想要一个数组时不使用@(…)(例如$jobs = @(get-job))强制数组。 -
所以如果只有一个作业,
$jobs是一个包含该作业的数组。如果有多个作业,由于Get-Job已经返回一个数组,我难道不希望$jobs是一个包含作业数组的数组吗?也许这里有更多的 PSH“帮助”? -
否:如果有 一个 工作,那么
$jobs将是那个工作对象;否则它将是一系列工作。包裹在@(...)中以始终获得一个数组。 -
我明白会发生什么。我只是指出,无论
Get-Job返回数组还是对象,@(Get-Job)始终是一维数组有点奇怪。