2012-01-09 8 views
3

私は以下のスクリプトを持っています。Powershellはパイプの内容を印刷しますか?

Get-Job | ? { $_.State -eq 'Completed' } | Remove-Job 

削除されたジョブを1つの連鎖パイプで表示したいとします。次のスクリプトは動作しません。

Get-Job | ? { $_.State -eq 'Completed' } | Remove-Job | % { echo "Removed: $_" } 

また、以下のエラーが発生します。

Get-Job | ? { $_.State -eq 'Completed' } | % { echo "Removed: $_" } | Remove-Job 

削除 - ジョブ:T彼のコマンドは、パイプライン入力 または入力を取らないと、そのプロパティは、パラメータのいずれかと一致しないため、入力オブジェクトは、 コマンドのいずれかのための任意のパラメータにバインドすることはできませんパイプライン入力を受け取る 行:2文字:81 + Get-Job | ? {$ .State -eq 'Completed'} | %{echo "削除済み:$"} |削除-仕事に< < < < + CategoryInfo:InvalidArgument:(削除:システム... n.PSRemotingJob:PSObject)[再入居ジョブ]、 ParameterBindingExceptionを + FullyQualifiedErrorId:InputObjectNotBound、Microsoft.PowerShell.Commands.RemoveJobComman
D

答えて

6
あなたはそれをシンプルに保つために、次のように行うことができます

あなたが動作するようにしようとしていた何のため
get-job | ?{$_.state -eq "Completed"} | 
    %{ Remove-Job $_; Write-host "Removed $($_.Name)" } 

、あなたがしなければならない:

get-job | ?{$_.state -eq "Completed"} | %{write-host "Removed: $($_.Name)"; $_} | 
    Remove-Job 

$_に注意してください。ジョブはパイプラインに戻されます。

+0

多くのRemove-コマンドレットには、Lifeを簡単にするための-PassThruがあり、この種のコードを避けることができます。残念ながら、Remove-Jobはその1つではありません。 –

+0

@ Start-Automating - Removeコマンドレットがパススルーを持つ理由は何ですか? – manojlds

+0

@manojlds ...このような理由から。コレクションからアイテムを削除しても、そのアイテムが返されるようにすることもできます。ボックスの外に私は2つを見る: Get-Command -Verb Remove | Where-Object {$ _。Parameters.PassThru} 私は1つの意味があります(Remove-Computer - コンピュータ名のリストを渡す)。他のものは私にはあまり意味がありません(スナップインを削除する)。 オブジェクトの参照が破棄される可能性があるため、または削除されたオブジェクトが「HeisenBug」である可能性があるため、Removeがメモリの観点から危険な場合があります。 –

関連する問題