2012-01-10 24 views
16

Tôi đang cố viết một tập lệnh sẽ xem qua một tập hợp các thư mục và chỉ giữ lại 10 tệp cuối cùng. Các tệp trong mỗi thư mục có thể được tạo hàng ngày, hàng tuần hoặc hàng tháng. Tôi cần tập lệnh để giữ 10 bản sao gần đây nhất bất kể ngày tạo hoặc ngày sửa đổi.Giữ x số lượng tệp và xóa tất cả các tệp khác - Powershell

Sử dụng một bài đăng khác mà tôi đã tạo tập lệnh bên dưới hoạt động nhưng không giữ được 10 bản sao nó giữ bất kỳ tệp nào không quá 10 ngày.

$ftppath = "C:\Reports" 
Get-ChildItem $ftppath -recurse *_Report_*.zip -force|where {$_.lastwritetime -lt (get-date).adddays(-10)} |Remove-Item -force 

Bất kỳ ý tưởng nào về cách tôi có thể tinh chỉnh tính năng này để hoạt động? Nếu tôi sử dụng kịch bản dưới đây nó hoạt động nhưng chỉ khi tôi không thiết lập -Recurse. Nếu bạn sử dụng chuyển đổi -Recurse bạn nhận được một lỗi mà tôi đã liệt kê bên dưới kịch bản.

# Keeps latest 10 files from a directory based on Creation Time 

#Declaration variables 
$path = "C:\Reports"        # For example $path= C:\log\*.tmp 
$total= (ls $path).count - 10 # Change number 5 to whatever number of objects you want to keep 
# Script 
ls $path |sort-object -Property {$_.CreationTime} | Select-Object -first $total | Remove-Item -force 

Error: Select-Object : Cannot validate argument on parameter 'First'. The -7 argument is less than the minimum allowed range of 0. Supply an argument that is greater than 0 and then try the command again.

Trả lời

32

Bạn có thể sắp xếp theo số CreationTime giảm dần và bỏ qua bước đầu tiên 10. Nếu có ít hơn 10 tệp, nó sẽ không xóa bất kỳ tệp nào.

gci C:\temp\ -Recurse| where{-not $_.PsIsContainer}| sort CreationTime -desc| 
    select -Skip 10| Remove-Item -Force 
+1

Ah '-Skip'. Tốt đẹp và súc tích :-) +1 –

+0

Đã thử nghiệm này và có một số kết quả kỳ lạ, không chắc chắn những gì đang xảy ra ở đó ... Tái kiểm tra và nó làm việc như tôi mong đợi. Nice 1 lót. –

+0

@Andy - vâng, tôi đã thử mã của bạn để tạo tệp và lần thứ hai tôi chạy tệp đó, CreationTime không được cập nhật cho tất cả các tệp. Tôi không biết chính xác lý do tại sao mặc dù: -/ – Rynant

8

Cập nhật

$path = "C:\TestDir" 

# Create 12 test files, 1 second after each other 
1..12 | % { 
    Remove-Item -Path "$path\$_.txt" -ea SilentlyContinue 
    $_ | Out-File "$path\$_.txt" 
    Start-Sleep -Seconds 1 
} 

$files = Get-ChildItem -Path $path -Recurse | Where-Object {-not $_.PsIsContainer} 
$keep = 10 
if ($files.Count -gt $keep) { 
    $files | Sort-Object CreationTime | Select-Object -First ($files.Count - $keep) | Remove-Item -Force -WhatIf 
} 

Hủy bỏ tham số -WhatIf-Remove-Item khi đã sẵn sàng của bạn để xóa thật.

+0

Điều này không xóa tất cả các tệp? – Rynant

+0

Ah cảm ơn yep phiên bản cũ sẽ. Giúp kiểm tra nhiều hơn ;-) Tôi cập nhật với một phiên bản làm việc thử nghiệm. –

+0

Cảm ơn sự giúp đỡ. Điều này hiện đang chạy như mong đợi. Cảm ơn một lần nữa. – mpowmap

1

@Andy: Đại diện của tôi quá thấp để nhận xét để đăng câu trả lời. Nếu bạn đang nhận được kết quả lạ, nó có thể là do bạn đang tìm kiếm trong Windows Explorer theo mặc định cho thấy ngày sửa đổi cuối thay vì ngày tạo. Để có được kết quả phù hợp với điều đó được hiển thị trong Windows Explorer, hãy đổi LastWriteTime cho CreationTime như sau: gci C: \ temp \ -Recurse | nơi {-not $ _. PsIsContainer} | sắp xếp LastWriteTime -desc | chọn -Skip 10 | Remove-Item -Force

Các vấn đề liên quan