2009-04-26 25 views
11

Từ tài liệu:Confused với tham số -gồm của cmdlet Get-ChildItem

-gồm

Chỉ truy xuất các mặt hàng quy định. Giá trị của thông số này đủ điều kiện thông số Đường dẫn. Nhập một đường dẫn thành phần hoặc mẫu, chẳng hạn như "* .txt". Ký tự đại diện được phép.

Các Bao gồm thông số chỉ có hiệu lực khi lệnh bao gồm các tham số Đệ quy hoặc con đường dẫn đến nội dung của một thư mục , chẳng hạn như C: \ Windows *, nơi các ký tự đại diện xác định nội dung của C: \ Windows thư mục.

hiểu biết đầu tiên của tôi là:

c:\test\a.txt 
c:\test\b.txt 

Vì vậy, để có được 'a.txt' và 'b.txt' Tôi có thể viết:

gci -Path "c:\test\*" -Include "*.txt" 

Và công trình này. Nhưng bây giờ xem xét phân cấp như:

c:\test\a.txt 
c:\test\b.txt 
c:\test\c.txt\c.txt 

Lệnh cùng lợi nhuận: a.txt, b.txt, c.txt

Logic thực tế có vẻ là:

-gồm có cả đã qua sử dụng để khớp tất cả các thực thể được chỉ định bởi -Path. Nếu phần tử phù hợp là một tệp - trả lại nó. Nếu phần tử phù hợp là một thư mục, hãy xem bên trong và trả lại kết hợp phù hợp với trẻ em cấp một.

Ngoài ra, các tài liệu hướng dẫn nói:

Các Bao gồm thông số chỉ có hiệu lực khi lệnh bao gồm các tham số Đệ quy hoặc con đường dẫn đến nội dung của một thư mục ...

Điều này cũng không đúng. Ví dụ.

gci -Path "c:\test" -Include "*.txt" 

Nó không trả về gì, trong khi không có - Bao gồm tôi nhận được nội dung thư mục. Vì vậy, -Include chắc chắn là "hiệu quả". Điều gì thực sự xảy ra ở đây? -Path Chỉ định "c: \ test" và –Include cố gắng khớp với đường dẫn này. Vì "* .txt" không khớp với "test", nên không có gì trả về. Nhưng hãy xem xét điều này:

gci -Path "c:\test" -Include "*t" 

Trả về a.txt, b.txt và c.txt là "* t" khớp "kiểm tra" và khớp với tất cả các mục con.

Sau khi tất cả, thậm chí biết cách Bao gồm hoạt động ngay bây giờ, tôi không hiểu khi nào nên sử dụng nó. Tại sao tôi cần nó nhìn vào bên trong thư mục con? Tại sao nó quá phức tạp?

Trả lời

14

Bạn đang nhầm lẫn việc sử dụng -bao gồm.Cờ -include được áp dụng cho đường dẫn chứ không phải nội dung của đường dẫn. Nếu không sử dụng cờ đệ quy, đường dẫn duy nhất được đề cập là đường dẫn bạn chỉ định. Đây là lý do tại sao ví dụ cuối cùng bạn đã đưa ra các công trình, đường dẫn c:\test có một t trong đường dẫn và do đó phù hợp với "*t".

Bạn có thể xác minh điều này bằng cách thử

sau
gci -path "c:\test" -in *e* 

này vẫn sẽ sản xuất tất cả các trẻ em trong danh bạ nhưng nó không khớp tên của họ.

Lý do mà -bao gồm hiệu quả hơn với tham số recurse là bạn sẽ áp dụng ký tự đại diện cho mọi đường dẫn trong cấu trúc phân cấp.

+0

Tôi đang sử dụng PowerShell-v2.0-CTP3 và ví dụ của bạn tạo ra bộ trống. – alex2k8

+0

@ alex2k8, Không chắc chắn nên nói gì ở đây. Tôi đã thử ví dụ này trên 1.0 và phiên bản 2.0 sau, cả hai đều tạo ra kết quả tương tự. – JaredPar

+0

@ Jared, điều này thật lạ. Xin vui lòng, bạn có thể thử gci -path c: \ * -in *. Tôi thấy trẻ em của c: \ và tất cả các thư mục con của nó một cấp xuống. Đây là mô tả tương tự http://www.eggheadcafe.com/software/aspnet/32624832/getchilditem-include-qu.aspx – alex2k8

4

Gắn kết vào JaredPar's answer, để thực hiện khớp mẫu với Get-ChildItem, bạn có thể sử dụng các ký tự đại diện shell chung.

Ví dụ: "?"

get-childitem "c:\test\t?st.txt" 

nơi là ký tự đại diện khớp với bất kỳ một ký tự nào hoặc

get-childitem "c:\test\*.txt" 

sẽ khớp với bất kỳ tên tệp nào kết thúc bằng ".txt".

Điều này sẽ giúp bạn có được hành vi "đơn giản" hơn mà bạn đang tìm kiếm.

+0

Không phải vấn đề ở đây mà bạn chỉ có thể nhận được một phần mở rộng? -Không bao gồm chuỗi [] cho phép nhiều biến thể phù hợp. Cảm ơn, Ben –

9

Hãy thử tham số -filter (nó có hỗ trợ cho chỉ có một phần mở rộng):

dir -filter * .txt

+5

Bộ lọc hơi khác một chút vì đó là triển khai cụ thể của nhà cung cấp. Nó thường hiệu quả hơn vì nó xảy ra trước khi dữ liệu được trả về. Nhưng nó có một triển khai khác nhau cho mọi nhà cung cấp ổ đĩa trong PowerShell. Do đó có thể có sự khác biệt tinh tế trong thuật toán phù hợp. – JaredPar

+0

Tôi đồng ý, mặc dù trong trường hợp này, chúng tôi đang nói về nhà cung cấp hệ thống tệp. Thnaks cho nhận xét. –

2

Tôi chỉ hỏi một câu hỏi tương tự và có ba trả lời nhanh chóng liên quan đến Get-Help cho GET ChildItem.

Câu trả lời là trong mô tả đầy đủ của lệnh (Get-Help Get-ChildItem -full):

The Include parameter is effective only when the command includes the 

Đệ quy tham số hoặc các con đường dẫn đến nội dung của một thư mục, chẳng hạn như C: \ Windows *, trong đó ký tự đại diện chỉ định nội dung của thư mục C: \ Windows.

Vì vậy, những điều sau đây sẽ hoạt động mà không cần dùng lại .

PS C: \ -path foo> Get-childitem "c: \ foo *" -gồm * .txt

Từ Stack Overflow câu hỏi PowerShell Scripting - Get-ChildItem.

Tôi hy vọng điều này sẽ giúp :-)

+0

Ben, thực ra câu hỏi của tôi hơi khác một chút. Lưu ý rằng ví dụ của bạn sẽ trả về các tệp .txt từ thư mục foo, NHƯNG nó cũng có thể trả về bất ngờ các tệp và thậm chí cả các thư mục từ ví dụ "c: \ foo \ dir.txt". Hãy thử phân cấp như vậy: c: \ foo \ dir.txt \ file.txt và c: \ foo \ dir.txt \ dir2.txt \ file2.txt. Bạn sẽ nhận được: file.txt và dir2.txt! – alex2k8

0

Bao gồm \* ở phần cuối của con đường nên làm việc xung quanh vấn đề

PS C:\logfiles> Get-ChildItem .\* -include *.log 

này sẽ trả về.các tệp nhật ký từ thư mục làm việc hiện tại (C:\logfiles)

Ví dụ của Alex ở trên cho biết rằng thư mục có tên foo.log cũng sẽ được trả về. Khi tôi đã thử nó, nó đã không được nhưng đó là 6 năm sau đó và đó có thể là từ bản cập nhật PS.

Tuy nhiên, bạn có thể sử dụng mục con Mode để loại trừ các thư mục mà tôi nghĩ.

PS C:\logfiles> Get-Childitem .\* -include *.log | where-object {$_.mode -notmatch "d"} 

Điều này sẽ loại trừ mọi thứ bằng chế độ 'thư mục'.

+0

Bao gồm \ * ở cuối đường dẫn không phải lúc nào cũng hoạt động. Tôi không biết cách nào để chỉ định một giá trị -Include để khớp với các tệp không có đuôi tệp. Chỉ định * dưới dạng mẫu -Include sẽ khớp với các tệp như vậy, nhưng làm cho hành động của Get-ChildItem đệ quy. Nếu -Bao gồm hành vi giống như cách loại trừ, nó sẽ dễ dàng. – MikeOnline

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