Windows 如何从子作业中获取一个属性和输出?
我在文件test.ps1中有一个子作业:Windows 如何从子作业中获取一个属性和输出?,windows,powershell,properties,jobs,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|Rece
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>\test 2
PS>$a=获取作业|接收作业|选择对象-未找到属性
不幸的是,我
PS> $a.count
2
PS>$a.count
2.
为什么是2而不是1
我必须这么做
PS> $a[1].Not_found
agurk
PS>$a[1]。未找到
阿古尔克
为了得到这个值
我想创建一个子作业,它生成一些输出,以及一个属性,并且只有一个属性供调用方进行调查。如何实现这一点?由于作业返回字符串
“Hallo 2”
和自定义对象@{Not_found=“agurk”}
,因此您的计数为2。从:
在Windows PowerShell®中,每个语句的结果都作为输出返回,即使没有包含Return关键字的语句也是如此
选择对象
不会跳过或删除该字符串,而是创建了一个新的自定义对象,该对象的属性为空未找到
,因此结果如下:
[
{ 'Not_found': '' },
{ 'Not_found': 'agurk' }
]
为此:
Write-Host "Hallo $p"
或者首先不要创建不需要的输出
如果需要额外的输出,并且需要能够将其与返回的对象分开重定向,则不能使用Write Host
,因为该cmdlet直接写入主机控制台(意味着无法捕获或重定向其输出)。相反,您需要写入,例如详细流:
Write-Verbose "Hallo $p"
请注意,您需要PowerShell v3或更高版本才能重定向成功流和错误流以外的流。由于您的作业返回字符串
“Hallo 2”
和自定义对象@{Not_found=“agurk”}
,因此您的计数为2。从:
在Windows PowerShell®中,每个语句的结果都作为输出返回,即使没有包含Return关键字的语句也是如此
选择对象
不会跳过或删除该字符串,而是创建了一个新的自定义对象,该对象的属性为空未找到
,因此结果如下:
[
{ 'Not_found': '' },
{ 'Not_found': 'agurk' }
]
为此:
Write-Host "Hallo $p"
或者首先不要创建不需要的输出
如果需要额外的输出,并且需要能够将其与返回的对象分开重定向,则不能使用Write Host
,因为该cmdlet直接写入主机控制台(意味着无法捕获或重定向其输出)。相反,您需要写入,例如详细流:
Write-Verbose "Hallo $p"
请注意,您需要PowerShell v3或更高版本才能重定向成功流和错误流以外的流。两行的计数来自作业返回两行输出,
“Hallo$p”
和对象
因为您正在执行无条件选择,所以无论属性是否存在,Powershell似乎都在返回对象
您可以更改查询,以检查是否使用Where对象填充属性
:
$a = Get-Job | Receive-Job | Where-Object { $_.Not_Found -match ".+" }
然后使用$a进行访问。未找到
或者,从结果直接访问属性似乎也只返回非空值:
$a = $(Get-Job | Receive-Job | Select-Object -Property Not_Found).Not_Found
计数为2的原因是作业返回两行输出,“Hallo$p”
和对象
因为您正在执行无条件选择,所以无论属性是否存在,Powershell似乎都在返回对象
您可以更改查询,以检查是否使用Where对象填充属性
:
$a = Get-Job | Receive-Job | Where-Object { $_.Not_Found -match ".+" }
然后使用$a进行访问。未找到
或者,从结果直接访问属性似乎也只返回非空值:
$a = $(Get-Job | Receive-Job | Select-Object -Property Not_Found).Not_Found
好的,但是输出是需要的,因为调用者可能会将其指向一个输出文件。但是调用方还希望检测属性的值。这真的意味着,他必须遍历所有的输出才能找到属性对象吗?如果您希望能够将输出与返回的对象分开重定向,则需要将其写入一个对象,例如详细流(write verbose
)。请注意,您需要PowerShell v3或更高版本才能重定向成功和错误流以外的流。可以,但需要输出,因为调用方可能会将其定向到输出文件。但是调用方还希望检测属性的值。这真的意味着,他必须遍历所有的输出才能找到属性对象吗?如果您希望能够将输出与返回的对象分开重定向,则需要将其写入一个对象,例如详细流(write verbose
)。请注意,您需要PowerShell v3或更新版本才能重定向成功和错误流以外的流。