2011-07-28 9 views
24

Tôi đang bối rối ở đây về những gì có vẻ là một vấn đề đơn giản; xin lỗi vì bất cứ cái đầu xương nào ở đây.Làm thế nào để Get-ChildItem được kiểm tra không có kết quả (0 tệp)?

Tôi có tập lệnh xóa các tệp sao lưu không còn tồn tại. Sau khi xác định các tập tin tôi lặp lại và in ra những gì đang được bán phá giá. Vấn đề của tôi nảy sinh khi cố gắng cung cấp phản hồi/thử nghiệm khi không có tệp không tồn tại. Tập lệnh có dạng ...

$Files = Get-ChildItem $BackupPath_Root -include *.bak -recurse 
      | where {$_.CreationTime -le $DelDate_Backup } 

if ($Files -eq "" -or $Files.Count -eq 0) { 
    write-host " no files to delete." #<-- this doesn't print when no files 
} else { 
    foreach ($File in $Files) { 
     write-host “$File” 
     Remove-Item $File | out-null 
    } 
} 

Nếu việc kiểm tra không có tệp nào sẽ không bắt gặp điều kiện tệp. Cách thích hợp để kiểm tra $Files không có kết quả là gì?

Trả lời

43

Thử gói trong @(..). Nó luôn luôn tạo ra một mảng:

$Files = @(Get-ChildItem $BackupPath_Root -include *.bak -recurse 
      | where {$_.CreationTime -le $DelDate_Backup }) 
if ($Files.length -eq 0) { 
    write-host " no files to delete." 
} else { 
    .. 
} 
+1

Đây là một thủ thuật tuyệt vời cho xử lý mảng PowerShell kỳ quặc/phiên dịch. Cảm ơn! –

+0

Được tăng lên vì đây là ý kiến ​​của tôi về cách thức đúng (và dễ) để xử lý các mảng có thể là null hoặc nơi mà đường dẫn sau sẽ thất bại nếu nó là rỗng. – CosmosKey

4

Thử kiểm tra $ $ -eq $ null.

12

Khi không có tệp, $ tệp bằng $ null, vì vậy EBGreen đề nghị bạn nên thử nghiệm với $ null. Ngoài ra, $ Files.Count chỉ hữu ích khi kết quả là một tập hợp các tập tin. Nếu kết quả là một vô hướng (một đối tượng) nó sẽ không có thuộc tính đếm và so sánh thất bại.

Mẹo hiệu suất: khi bạn cần tìm kiếm chỉ một loại tiện ích mở rộng, hãy sử dụng tham số -Filter (thay vì -Include) vì nó lọc theo cấp nhà cung cấp.

+1

+1 cho mẹo lọc, nhưng tôi đơn giản hóa ví dụ và bộ lọc của tôi dường như không hoạt động cho nhiều tiện ích mở rộng (* .bak và * .tran) theo cách bao gồm :-( – EBarr

+0

Tôi phải nghi ngờ câu trả lời này là 'if ($ Files = $ null) 'không trả về true nhưng' if (! $ Files) 'hiện. – Marc

+0

Xin lỗi, dường như bạn có thể kiểm tra' if ($ Files -eq $ null) 'hoặc' if (! $ Files) ' nhưng không, vì lý do nào đó, 'if ($ Files = $ null)'. – Marc

7

Biến đánh giá thành biểu thức có giá trị bằng không khi thư mục được quét trống. Bạn có thể sử dụng:

if (!$Files) { 
# ... 
} 
+0

bạn có ý nghĩa nếu (! $ Files) {/ write no files here /}? – EBarr

+0

Oh yes, không đọc đoạn code sau :)). Cảm ơn –

+2

Tại sao đây không phải là câu trả lời được chấp nhận? –

0

Chỉ định loại [bool] ở phía trước lệnh get-childitem sẽ trả về Đúng nếu tìm thấy bất kỳ điều gì hoặc giả nếu không tìm thấy gì. Đây là câu trả lời của Emiliano, nhưng không có yêu cầu tiêu cực. Bạn có thể làm cho một trong hai công việc nhưng tôi thích [bool] với một số các câu lệnh điều kiện phức tạp hơn chỉ để làm cho nó dễ dàng hơn để làm theo.

[bool](Get-ChildItem C:\foo.txt) 

Được sử dụng trong một tuyên bố Nếu

if ([bool](Get-ChildItem C:\foo.txt)) {write-output "foo.txt exists"}