Làm cách nào tôi có thể viết một tập lệnh để đếm các tập tin được sửa đổi trong một tháng cụ thể?


1

Tôi sử dụng lệnh PowerShell để đếm các tệp ZIP được sửa đổi trong vòng 30 ngày qua, tương tự như sau:

(gci "\\servername\sharename\foldername\subfoldername\*.zip" | where {$_.LastWriteTime -gt ((get-date)-(new-timespan -day 35))}).count

Tuy nhiên, ý định thực sự của tôi với tập lệnh này là lấy số lượng tệp được sửa đổi trong tháng trước. Rõ ràng, kịch bản này có một vài điểm yếu.

  • Bất cứ khi nào tôi chạy tập lệnh, tôi phải tính toán các ngày từ nay đến đầu tháng trước và sau đó chỉnh sửa tập lệnh cho phù hợp.
    • Tôi nhận ra rằng dù sao tôi cũng có thể phải chỉnh sửa tập lệnh, nhưng phải tính ngày thay vì chỉ xác định một tháng là hơi khó chịu.
  • Kịch bản cũng sẽ bắt bất kỳ tệp nào được sửa đổi trong tháng hiện tại.

Có cách nào để tôi có thể sửa đổi lệnh này để nó chỉ chọn các tệp được sửa đổi trong một tháng cụ thể không , hay đây chỉ là một giới hạn của PowerShell?

Nếu tập lệnh có thể được thực hiện để nhắm mục tiêu một tháng cụ thể, thì nó cũng có thể được viết để tự động nhắm mục tiêu vào tháng trước để tôi không phải sửa đổi nó mỗi lần?


EDIT: Rất cám ơn zdan vì sự giúp đỡ ở đây, và cũng nhờ Google giúp tôi vượt qua một số vấn đề khác. Tôi hình dung tôi sẽ đăng toàn bộ kịch bản cuối cùng của mình ở đây trong trường hợp có ai quan tâm.

Tập lệnh này đếm các tệp ZIP trong thư mục đích đã được sửa đổi trong tháng trước. Tuyên bố IF / ELSE sớm giúp tài khoản cho các trường hợp trong đó tháng hiện tại là tháng một. Tập lệnh này cũng phụ thuộc vào một tệp được gọi Targets.txt, trong thư mục làm việc hiện tại, trong đó một hoặc nhiều hệ thống đích có thể được liệt kê (một tên máy hoặc IP trên mỗi dòng). Tập lệnh xử lý một cách duyên dáng và ghi lại lỗi nếu hệ thống hoặc thư mục đích không thể truy cập được và tất cả các kết quả được xuất thành tệp văn bản (ghi ngày tháng / năm đích) trong thư mục làm việc hiện tại. Tôi cũng đã thực hiện các điều chỉnh để tương thích với các phiên bản PowerShell trước 3, trong đó (gci).countsẽ không trả lại gì khi giá trị bằng 0 hoặc một. (Giải quyết trong câu hỏi này .)

$ErrorActionPreference = 'Stop'
if ((get-date).Month -eq 1)
{
    $TargetMonth = 12
    $TargetYear = (get-date).Year-1
}
else
{
    $TargetMonth = (get-date).Month-1
    $TargetYear = (get-date).Year
}
echo "ZIP file counts for $TargetMonth/$TargetYear" | Out-File "$TargetMonth-$TargetYear ZIPs.txt"
echo "----------------------------------" | Out-File "$TargetMonth-$TargetYear ZIPs.txt" -Append
echo "`n" | Out-File "$TargetMonth-$TargetYear ZIPs.txt" -Append
foreach ($Target in gc 'Targets.txt')
{
    try
    {
        $ThisTarget = @(gci "\\$Target\c$\Folder\Subfolder\ZIPs\*.zip" | where {($_.LastWriteTime.Month -eq $TargetMonth) -and ($_.LastWriteTime.Year -eq $TargetYear)}).count
        $ZIPTotal += $ThisTarget
        echo "$Target has $ThisTarget ZIPs." | Out-File "$TargetMonth-$TargetYear ZIPs.txt" -Append
    }
    catch
    {
        echo "$Target could not be reached or ZIPs directory not found." | Out-File "$TargetMonth-$TargetYear ZIPs.txt" -Append
        $ZIPsErrors ++
    }
}
echo "----------------------------------" | Out-File "$TargetMonth-$TargetYear ZIPs.txt" -Append
echo "`n" | Out-File "$TargetMonth-$TargetYear ZIPs.txt" -Append
echo "The total number of ZIPs counted is $ZIPsTotal" | Out-File "$TargetMonth-$TargetYear ZIPs.txt" -Append
echo "Total number of errors encountered is $ZIPsErrors" | Out-File "$TargetMonth-$TargetYear ZIPs.txt" -Append
rv TargetMonth
rv TargetYear
rv Target
rv ThisTarget
rv ZIPsTotal
rv ZIPsErrors
$ErrorActionPreference = 'Continue'

Câu trả lời:


1

Vẻ đẹp của powershell là bạn có được các đối tượng .NET toàn diện mà bạn có thể kiểm tra. Trong trường hợp ngày, powershell sử dụng lớp DateTime hiển thị các thuộc tính Tháng và Năm mà bạn có thể tận dụng:

(gci "\\servername\sharename\foldername\subfoldername\*.zip" | 
    ?{ $lwt = $_.LastWriteTime; ($lwt.Month -eq ((get-date).Month-1)) -and (($lwt.Year -eq (Get-Date).Year))}).count

Quan trọng: Những điều trên sẽ không hoạt động nếu bạn chạy nó vào tháng Giêng. Bạn sẽ cần điều chỉnh năm và tháng phù hợp khi điều đó xảy ra.


?một bí danh cho wheređiều đó tôi đang quên?
Iszi

@Iszi Đúng vậy.
zdan

Xem lại điều này, tôi đang cố gắng đơn giản hóa nó một chút. Là $lwt = $_.LastWriteTime;thực sự cần thiết, hoặc tôi có thể loại bỏ điều đó và chỉ cần chèn $_.LastWriteTimevào vị trí của $lwtmọi nơi khác?
Iszi

@Iszi có bạn có thể, nó chỉ tùy thuộc vào sở thích cá nhân.
zdan

Điều này thật lạ. Đối với các trường hợp số đếm phải là 1, tôi nhận được một đầu ra trống. Các trường hợp khác dường như làm việc tốt. Suy nghĩ?
Iszi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.