如何从童工中获得一项财产和产出?

时间:2017-01-13 09:27:23

标签: windows powershell properties jobs

我在文件test.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 个答案:

答案 0 :(得分:0)

您的计数为2,因为您的作业会返回字符串CREATE FUNCTION AddHours(timeValue datetime, addValue int) RETURNS datetime RETURN DATE_ADD(timeValue, INTERVAL addValue HOUR); 和您的自定义对象"Hallo 2"。来自documentation

  

在WindowsPowerShell®中,即使没有包含Return关键字的语句,每个语句的结果也会作为输出返回。

@{Not_found="agurk"}不会跳过或删除该字符串,而是会创建一个包含空属性Select-Object的新自定义对象,因此最终得到如下结果:

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

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

Not_found

进入这个:

"Hallo $p"

或者首先不要创建不需要的输出。

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

Write-Host

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

答案 1 :(得分:0)

两个计数来自作业返回两行输出"Hallo $p"和对象的事实。

因为您正在进行无条件选择,所以无论属性是否存在,Powershell似乎都会返回对象。

您可以更改查询以使用Where-Object检查属性是否已填充:

$a = Get-Job | Receive-Job | Where-Object { $_.Not_Found -match ".+" }

然后使用$a.Not_Found

进行访问

或者,直接从结果中访问属性似乎也只返回非空值:

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