如何从子作业中获取一个 属性 和输出?

How to get one property and output from a child job?

我在文件测试中有一个子作业。ps1:

param($unit)
$p = $unit

Start-Job -Name $unit -ScriptBlock {
    param($p)

    "Hallo $p"
    New-Object PSCustomObject -Property @{
        Not_found = "agurk"
    }
} -ArgumentList $p

当我这样做时:

PS> .\test 2
PS> $a=Get-Job|Receive-Job |Select-Object -Property Not_found

我不幸得到

PS> $a.count
2

为什么是 2 而不是 1?

而且我必须做

PS> $a[1].Not_found
agurk

为了取值

我想创建一个产生一些输出的子作业,一个 属性 并且只有一个供调用者调查。我怎样才能做到这一点?

您的计数为 2,因为您的工作 returns 字符串 "Hallo 2" 和您的自定义对象 @{Not_found="agurk"}。来自 documentation:

In Windows PowerShell®, the results of each statement are returned as output, even without a statement that contains the Return keyword.

Select-Object 不会跳过或删除该字符串,而是创建一个带有空 属性 Not_found 的新自定义对象,因此您最终得到如下结果这个:

[
  { 'Not_found': '' },
  { 'Not_found': 'agurk' }
]

如果您不想捕获字符串输出,请更改此行:

"Hallo $p"

进入这个:

Write-Host "Hallo $p"

或者一开始就不要创建不需要的输出。

如果需要额外的输出并且您需要能够将它与返回的对象分开重定向,则您不能使用 Write-Host,但是,因为该 cmdlet 直接写入主机控制台(意味着它的无法捕获或重定向输出)。相反,您需要写入 different stream,例如详细流:

Write-Verbose "Hallo $p"

请注意,您需要 PowerShell v3 或更新版本才能重定向成功和错误流以外的流。

二的计数来自作业 return 的两行输出,"Hallo $p" 和对象。

因为您正在执行无条件 select,所以 Powershell 似乎 returning 对象,无论 属性 是否存在。

您可以更改查询以检查是否使用 Where-Object:

填充了 属性
$a = Get-Job | Receive-Job | Where-Object { $_.Not_Found -match ".+" }

然后用$a.Not_Found

访问

或者,从您的结果中直接访问 属性 似乎也只有 return non-empty 个值:

$a = $(Get-Job | Receive-Job | Select-Object -Property Not_Found).Not_Found