2017-01-13 37 views
1

我有一個文件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

由於作業返回字符串"Hallo 2"和您的自定義對象@{Not_found="agurk"},您將得到2的計數。從documentation

在WindowsPowerShell®中,即使沒有包含Return關鍵字的語句,也會將每個語句的結果作爲輸出返回。

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的或更新的版本,以便能夠重定向比成功和錯誤流等流。

+0

好的,但是輸出是所需的,因爲調用者可能會將其指向輸出文件。但是調用者也想要檢測財產的價值。這是否意味着,他必須遍歷所有輸出來查找屬性對象?這聽起來很麻煩 – user2304458

+0

如果你想能夠單獨地從返回的對象中重定向輸出,你需要把它寫到一個[不同的流](https://blogs.technet.microsoft.com/heyscriptingguy/2014/03/30/ Understanding-streams-redirection-and-write-host-in-powershell /),例如詳細流('Write-Verbose')。請注意,您需要PowerShell v3或更高版本才能重定向除成功和錯誤流以外的流。 –

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 
相關問題