2011-12-29 24 views
5

Tôi có lệnh sau:Định dạng đầu ra dài dòng của một Remove-mục lệnh

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

để xóa một số tập tin từ thư mục build của một giải pháp VS. Tôi sử dụng công tắc Verbose để tôi có thể xem tệp nào đang bị xóa. Nó hoạt động tốt nhưng sản lượng là quá dài dòng:

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". 

Tôi chỉ cần nhìn thấy một cái gì đó như thế:

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

Tôi biết tôi có thể làm điều này với một tuyên bố foreach và một lệnh Write-Host, nhưng tôi tin rằng nó có thể được thực hiện với một số pipelining hoặc một cái gì đó. Bất kỳ ý tưởng?

Trả lời

6

Sử dụng ForEach-Object khá đơn giản:

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

Như @ user978511 chỉ ra, bằng cách sử dụng đầu ra dài dòng là phức tạp hơn:

$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

Tôi không biết tôi có thể sử dụng foreach trong một đường ống. Cảm ơn. – lalibi

1

Để có thể sửa đổi thông điệp bạn cần trước tiên để thực hiện đầu ra không dễ dàng như vậy. Bạn có thể tham khảo câu trả lời trên trang này: Powershell Invoke-Sqlcmd capture verbose output để bắt đầu ra. Từ đó về bạn có thể sửa đổi thông điệp và hiển thị nó trong định dạng của bạn, nhưng tùy chọn foreach trông dễ dàng hơn với tôi

3

Trong PowerShell 3.0 bạn có thể viết những dòng Verbose cho luồng dữ liệu đầu ra (ví dụ 4> & 1) và sau đó thay thế các thông điệp:

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

Đây là một vài năm quá muộn nhưng nó có thể giúp người khác tình cờ gặp phải điều này như tôi đã làm như vậy, tôi sẽ cung cấp nó anyway.

Tôi sẽ thử xóa tệp và sau đó báo cáo về thành công hay thất bại. Xem dưới đây:

$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)" 
    } 
} 

Nếu bạn muốn cả hai đầu ra để an ủi và đăng nhập vào một tập tin, bạn có thể sử dụng Tee-Object vào cuối mỗi dòng bắt đầu với Write-Output trên.

| Tee-Object -FilePath $your_log_file -Append 
Các vấn đề liên quan