2017-01-13 13 views
1

私は、ファイルtest.ps1に子ジョブを持っている:子ジョブから1つのプロパティと出力を取得するにはどうすればよいですか?

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

を行う必要があります。

出力を生成する子ジョブを作成し、呼び出し側が調べるプロパティを1つだけ作成したいとします。それをどうすれば実現できますか?

答えて

0

ジョブが文字列"Hallo 2"とカスタムオブジェクト@{Not_found="agurk"}を返すため、カウントが2になります。 documentationから:

WindowsPowerShell®では、Returnキーワードを含むステートメントがなくても、各ステートメントの結果が出力として返されます。

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

あなたの場合:

Select-Objectを飛ばしたり、その文字列を削除しません、代わりにそれはあなたがこのような結果に終わるので、空のプロパティNot_foundの新しいカスタムオブジェクトを作成します文字列の出力をキャプチャすることにしたい、この行を変更しないでください:これに

"Hallo $p" 

Write-Host "Hallo $p" 

または、最初に望ましくない出力を作成しないでください。

追加の出力が必要で、返されたオブジェクトとは別にリダイレクトできる必要がある場合は、Write-Hostを使用できません。そのコマンドレットはホストコンソールに直接書き込むため、出力をキャプチャできません。リダイレクト)。代わりにdifferent streamに書き込む必要があります。詳細ストリーム:

Write-Verbose "Hallo $p" 

成功ストリームとエラーストリーム以外のストリームをリダイレクトできるようにするには、PowerShell v3以降が必要です。

+0

[OK]をクリックします。ただし、出力が必要なのは、呼び出し元が出力ファイルに出力する可能性があるからです。しかし、呼び出し側はプロパティの値も検出したいと考えています。それは実際には、プロパティオブジェクトを見つけるためにすべての出力を反復処理する必要があるということですか?面倒なように聞こえます – user2304458

+0

返されたオブジェクトと別に出力をリダイレクトできるようにするには、[別ストリーム]に書き込む必要があります(https://blogs.technet.microsoft.com/heyscriptingguy/2014/03/30/理解ストリームリダイレクションとライトホストのパワーサル/)、例えば冗長ストリーム( 'Write-Verbose')。 SuccessおよびErrorストリーム以外のストリームをリダイレクトできるようにするには、PowerShell v3以降が必要です。 –

0

2つのカウントは、ジョブが2行の出力、つまり"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 
関連する問題