【问题标题】:Unexpected behavior with Get-Job when only one job running仅运行一项作业时 Get-Job 的意外行为
【发布时间】: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) 始终是一维数组有点奇怪。

标签: powershell powershell-2.0


【解决方案1】:

尝试使用测量对象

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

【讨论】:

    【解决方案2】:

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

    $Program = {
        "Thread " + $args[0];
        Start-Sleep 5;
    }
    Start-Job $Program -ArgumentList @($i) | Out-Null
    
    Get-Job
    "Jobs Running: " + $(@(Get-Job -State Running).count) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 2017-01-03
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 1970-01-01
      相关资源
      最近更新 更多