我在文件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
以获得价值。
我想创建一个生成一些输出的子作业,以及一个属性,只有一个用于调用的调用者。我怎样才能做到这一点?
答案 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