如何从子作业中获取一个 属性 和输出?
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
我在文件测试中有一个子作业。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