2012-01-09 38 views
3

我有以下腳本。Powershell打印管道的內容?

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

我想在一個鏈式管道中顯示移除的作業。以下腳本不起作用。

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

並且以下出錯。

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

刪除-工作:輸入對象不能綁定到任何參數 命令或者是因爲T他命令不採取管道輸入 或輸入和它的屬性不匹配的任何參數需要管道輸入的 。在線:2 char: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- cmdlet都有一個-PassThru來讓生活更輕鬆,並讓您避免這種類型的代碼。不幸的是,Remove-Job不是其中之一。 – 2012-01-09 20:52:21

+0

@開始 - 自動化 - 我在想爲什麼一個Remove cmdlet會有passthru? – manojlds 2012-01-09 21:43:37

+0

@manojlds ...因爲這樣的原因。你可能會說,從一個集合中刪除一個項目,但是要返回這個項目。開箱,我看到兩個: Get-Command -Verb刪除| Where-Object {$ _.Parameters.PassThru} 對我來說有意義(Remove-Computer--傳遞計算機名稱列表)。還有其他一些對我沒有意義(刪除單元)。 在很多情況下,從內存的角度來看,Remove是危險的,因爲可以放棄對象引用,或者因爲看到被刪除的對象可能是「HeisenBug」。 – 2012-01-09 23:58:49