2015-06-25 15 views
10

Đối với một thư mục cụ thể, tôi cần liệt kê tất cả các tệp có phần mở rộng .js ngay cả khi được lồng trong các thư mục con ở mọi cấp độ.Cách truy xuất đệ quy bất kỳ tệp nào có phần mở rộng cụ thể trong PowerShell?

Kết quả cho bảng điều khiển đầu ra phải là danh sách tên tệp không có dòng tiện ích mở rộng theo dòng để dễ dàng sao chép và dán trong ứng dụng khác.

Hiện tại tôi đang thử điều này, nhưng trong giao diện điều khiển đầu ra, tôi nhận được một số thông tin meta và không phải là một danh sách đơn giản.

Get-ChildItem -Path C:\xx\x-Recurse -File | sort length –Descending 

Bạn có thể vui lòng cung cấp cho tôi một số gợi ý không?

Trả lời

20

Nếu sắp xếp theo chiều dài không phải là một điều cần thiết, bạn có thể sử dụng tham số -NameGet-ChildItem trở lại chỉ là tên, sau đó sử dụng [System.IO.Path]::GetFileNameWithoutExtension() để loại bỏ các đường dẫn và mở rộng:

Get-ChildItem -Path .\ -Filter *.js -Recurse -File -Name| ForEach-Object { 
    [System.IO.Path]::GetFileNameWithoutExtension($_) 
} 

Nếu sắp xếp theo chiều dài là mong muốn, hãy thả tham số -Name và xuất thuộc tính BaseName của mỗi đối tượng FileInfo. Bạn có thể đường ống đầu ra (trong cả hai ví dụ) để clip, sao chép nó vào clipboard:

Get-ChildItem -Path .\ -Filter *.js -Recurse -File| Sort-Object Length -Descending | ForEach-Object { 
    $_.BaseName 
} | clip 

Nếu bạn muốn đường dẫn đầy đủ, nhưng không có phần mở rộng, thay thế $_.BaseName với:

$_.FullName.Remove($_.FullName.Length - $_.Extension.Length) 
+0

nhờ cho câu trả lời tuyệt vời của bạn, bạn có thể xin vui lòng giúp tôi với các kịch bản cuối cùng .. Tôi sẽ cần đường dẫn đầy đủ, nhưng với phần mở rộng [tương tự như ví dụ cuối cùng của bạn] ... làm thế nào tôi có thể làm cho nó? Rất cảm ơn vì sự giúp đỡ của bạn! – GibboK

+1

@GibboK Chỉ cần sử dụng '$ _.FullName', đó là đường dẫn đến tập tin –

+0

cảm ơn tuyệt vời, chỉ là điều cuối cùng nếu bạn có thời gian :) .. bây giờ chuỗi kết quả của tôi giống như 'C: \ Projects \ x \ trunk \ www \ c \ n \ b \ file. js 'Tôi vết thương cần phải cắt bớt phần đầu tiên cho đến khi \ n \ thư mục ..... với kết quả cuối cùng là' n \ b \ file.js 'bất kỳ ý tưởng nào có thể được sử dụng? Rất cám ơn trước. – GibboK

4

Tùy chọn đơn giản là sử dụng thuộc tính .Name của mục FileInfo trong đường ống và sau đó xóa tiện ích mở rộng:

Get-ChildItem -Path "C:\code\" -Filter *.js -r | % { $_.Name.Replace(".js","") } 
0

Có hai phương pháp để lọc tệp: globbing sử dụng Ký tự đại diện hoặc sử dụng Cụm từ thông dụng (Regex).

Cảnh báo: Phương pháp tổng hợp có nhược điểm là nó cũng khớp với các tệp không được khớp, như *.jsx.

# globbing with Wildcard filter 
# the error action prevents the output of errors 
# (ie. directory requires admin rights and is inaccessible) 
Get-ChildItem -Recurse -Filter '*.js' -ErrorAction 'SilentlyContinue' 

# filter by Regex 
Where-Object { $_.Name -Match '.*\.js$' } 

Sau đó bạn có thể sắp xếp theo tên hoặc filesize khi cần thiết:

# sort the output 
Sort-Object -PropertyName 'Length' 

Format cho nó một danh sách đơn giản của đường dẫn và tên tập tin:

# format output 
Format-List -Property ('Path','Name') 

Để loại bỏ phần mở rộng tập tin, bạn có thể sử dụng lựa chọn để lập bản đồ kết quả:

Select-Item { $_.Name.Replace(".js", "") 

Đưa nó tất cả cùng nhau, đó cũng là một phiên bản rất ngắn, mà bạn không nên sử dụng trong kịch bản, vì nó hầu như không thể đọc được:

ls -r | ? { $_.Name -m '.*\.js' } | sort Length | % { $_.Name.Replace(".js", "") | fl 
Các vấn đề liên quan