2011-12-29 28 views
5

的詳細輸出,我有以下命令:格式化刪除-Item命令

Get-ChildItem $build_path ` 
    -Include *.bak, *.orig, *.txt, *.chirp.config ` 
    -Recurse | Remove-Item -Verbose 

從與解決方案的生成文件夾清除一些文件。我使用Verbose開關,以便我可以查看哪些文件正在被刪除。它工作正常,但輸出是太冗長:

VERBOSE: Performing operation "Remove File" on Target "R:\Visual Studio 2010\Projects\SomeProject\SomeProject.Web.build\App_Readme\glimpse.mvc3.readme.txt". 
VERBOSE: Performing operation "Remove File" on Target "R:\Visual Studio 2010\Projects\SomeProject\SomeProject.Web.build\App_Readme\glimpse.readme.txt". 

我只需要看到類似的東西:

Removing file \App_Readme\glimpse.mvc3.readme.txt". 
Removing file \App_Readme\glimpse.readme.txt". 
... 

我知道我可以用一個foreach語句和Write-host命令做到這一點,但我相信這可以通過一些流水線或其他東西來完成。有任何想法嗎?

回答

6

使用ForEach-Object是非常簡單的:

Get-ChildItem $build_path ` 
    -Include *.bak, *.orig, *.txt, *.chirp.config ` 
    -Recurse | foreach{ "Removing file $($_.FullName)"; Remove-Item $_} 

正如@ user978511指出,使用冗長輸出更復雜的:

$ps = [PowerShell]::Create() 

$null = $ps.AddScript(@' 
    Get-ChildItem $build_path ` 
     -Include *.bak, *.orig, *.txt, *.chirp.config ` 
     -Recurse | Remove-Item -Verbose 
'@) 

$ps.Invoke() 
$ps.Streams.Verbose -replace '(.*)Target "(.*)"(.*)','Removing File $2' 
+0

我不知道我可以在管道中使用foreach。謝謝。 – lalibi 2011-12-29 14:31:53

1

爲了能夠修改消息,首先需要輸出並不那麼容易。您可以參考本頁上的答案: Powershell Invoke-Sqlcmd capture verbose output 捕捉輸出。從那裏,你可以修改的消息,並顯示在您的格式,但的foreach選擇看起來更容易我

3

在PowerShell的3.0可以編寫冗長流輸出流(例如,4> & 1),然後替換消息:

Get-ChildItem $build_path ` 
    -Include *.bak, *.orig, *.txt, *.chirp.config ` 
    -Recurse | Remove-Item -Verbose 4>&1 | Foreach-Object{ ` 
     Write-Host ($_.Message -replace'(.*)Target "(.*)"(.*)','Removing File $2') -ForegroundColor Yellow 
} 
1

這幾年太晚了,但它可能會幫助別人,像我這樣絆倒了這一點,所以我會提供它。

我會嘗試刪除文件,然後報告成功或失敗。請看下圖:

$FileList = $build_path ` 
    -Include *.bak, *.orig, *.txt, *.chirp.config ` 
    -Recurse 

foreach ($File in $FileList) 
{ 
    Try 
    { 
     Remove-Item $File.FullName -Force -ErrorAction Stop 
     Write-Output "Deleted: $($File.Parent)\$($File.Name)" 
    } 
    Catch 
    { 
     Write-Output "Error deleting: $($File.Parent)\$($File.Name); Error Message: $($_.Exception.Message)" 
    } 
} 

如果你想都輸出到控制檯並記錄到一個文件,你可以使用三通對象在每行的末尾開始上面寫輸出

| Tee-Object -FilePath $your_log_file -Append