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).count
sẽ 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'
?
một bí danh chowhere
điều đó tôi đang quên?