Dấu nhắc lệnh của Windows: làm thế nào để lấy số lượng của tất cả các tệp trong thư mục hiện tại?


24

Lệnh nào bạn sẽ sử dụng cmd.exeđể tìm số lượng tệp trong thư mục hiện tại?

Có một tùy chọn powershell ở đây?

Cập nhật : Tôi đã hy vọng tránh dir, vì tôi biết có hơn 10.000 tệp trong thư mục hiện tại. Muốn tránh đầu ra liệt kê cho cửa sổ cmd. Cảm ơn bạn!

Câu trả lời:


27

Nếu bạn muốn làm điều đó với cmd, thì sau đây là cách tầm thường để làm điều đó:

set count=0 & for %x in (*) do @(set /a count+=1 >nul)
echo %count%

Đó là giả sử dòng lệnh. Trong một tập tin hàng loạt, bạn sẽ làm

@echo off
setlocal enableextensions
set count=0
for %%x in (*) do set /a count+=1
echo %count%
endlocal

mà làm mọi thứ tốt hơn một chút. Bạn có thể thả >nulmột lô, vì set /asẽ không hiển thị kết quả nếu chạy từ tệp bó mà nó thực hiện trực tiếp từ dòng lệnh. Hơn nữa, %dấu hiệu trong forvòng lặp phải được nhân đôi.

Tôi đã thấy khá nhiều trường hợp mọi người thử các thủ thuật tiện lợi find /c. Hãy rất cẩn thận với những thứ đó, vì những thứ khác nhau có thể phá vỡ điều này.

Lỗi thường gặp:

  1. Sử dụng find /c /vvà thử tìm thứ gì đó không bao giờ có trong tên tệp, chẳng hạn như ::. Sẽ không. Công việc. Đáng tin cậy Khi cửa sổ giao diện điều khiển được đặt thành phông chữ raster thì bạn có thể nhận được các kết hợp ký tự đó. Tôi có thể bao gồm các nhân vật trong một tên tập tin như :, ?vv trong các biến thể đầy đủ chiều rộng của họ ví dụ, sau đó sẽ được chuyển đổi với các đối tác ASCII bình thường của họ mà sẽ phá vỡ này. Nếu bạn cần một số đếm chính xác, thì đừng thử điều này.

  2. Sử dụng find /cvà thử tìm thứ gì đó luôn có trong tên tệp. Rõ ràng dấu chấm ( .) là một lựa chọn kém. Một câu trả lời khác cho thấy

    dir /a-d | find /c ":"

    trong đó giả định một số điều về ngôn ngữ của người dùng, không phải tất cả những điều được đảm bảo là đúng (tôi đã để lại một bình luận nêu chi tiết các vấn đề ở đó) và trả về một kết quả quá nhiều.

Nói chung, bạn muốn sử dụng findtrên dir /bđó cắt đi tất cả những thứ không tên tập tin và tránh fencepost lỗi như vậy.

Vì vậy, biến thể thanh lịch sẽ là:

dir /b /a-d | find /c /v ""

đầu tiên sẽ xuất ra tất cả các tên tệp, mỗi dòng một. Và sau đó đếm tất cả các dòng của đầu ra không trống. Vì tên tệp không thể để trống (trừ khi tôi thiếu một cái gì đó, nhưng Unicode sẽ không vượt qua điều này theo các thử nghiệm của tôi).


1
+1 Đó chính xác là những gì tôi đang tìm kiếm. Cảm ơn bạn!
p.campbell

Tinh chỉnh nhỏ để tạo phiên bản đầu tiên tất cả một dòng: (set Count = 0 & for% x in (*) do @ (set / a Count + = 1> nul)) && echo% Count%
Jason Massey

+1 chodir /b /a-d | find /c /v ""
Arvo Bowen

Giải pháp này không hoạt động tốt khi có hàng triệu tệp. Nó chạy "mãi mãi" - một giải pháp tốt hơn được đăng bên dưới chạy "trong vài giây" bằng cách sử dụng PS và [System.IO.Directory] :: GetFiles ($ path) .Count
ripvlan

@jason, điều đó có thể sẽ thất bại vì %count%được mở rộng tại thời điểm phân tích cú pháp.
Joey

17

Hỏi và các bạn sẽ nhận được: http://technet.microsoft.com/en-us/l Library / ee692796.aspx

Đếm số lượng vật phẩm trong một thư mục

Chà, bạn biết gì không: có vẻ như mặt trời cuối cùng cũng xuất hiện, điều đó có nghĩa là đã đến lúc chúng ta phải đi. Tuy nhiên, trước khi chúng tôi thực hiện, hãy cho bạn thấy một mẹo nhỏ cuối cùng với lệnh ghép ngắn Get-ChildItem. Đôi khi bạn không thực sự cần biết nhiều về các tệp trong một thư mục; tất cả những gì bạn thực sự cần biết là có thể tìm thấy bao nhiêu tệp (nếu có) trong một thư mục cụ thể. Đây là cách bạn có thể nhanh chóng đếm số lượng tệp trong một thư mục:

(Get-ChildItem C:\Scripts).Count

Chúng tôi đang làm gì ở đây? Chúng tôi chỉ đơn giản là sử dụng Get-ChildItem để trả về một bộ sưu tập tất cả các mục được tìm thấy trong thư mục C: \ ScScript; bởi vì đây là một bộ sưu tập, tất cả những gì chúng ta phải làm là lặp lại giá trị của thuộc tính Count, cho chúng ta biết số lượng vật phẩm trong bộ sưu tập. Lưu ý việc sử dụng dấu ngoặc đơn: chúng tôi gửi lệnh Get-ChildItem trong ngoặc đơn để đảm bảo rằng Windows PowerShell trước tiên lấy bộ sưu tập và chỉ sau đó trả lại giá trị của thuộc tính Count cho bộ sưu tập đó.

Và chắc chắn, bạn có thể bao gồm một bộ lọc khi gọi Get-ChildItem. Bạn cần biết có bao nhiêu tệp .PS1 trong thư mục C: \ ScScript? Được thôi anh bạn:

(Get-ChildItem C:\Scripts -filter "*.ps1").Count

FYI .. Tôi đã googled "tập tin số lượng powershell".


1
Bạn cần thêm một tập tin để làm cho số đếm thực sự đếm các tập tin, theo ví dụ thứ hai
Jim B

3
Chỉ cần rõ ràng (Get-ChildItem C: \ ScScript) .Count sẽ KHÔNG trả về số lượng tệp trong một thư mục, nó sẽ trả về số lượng ĐỐI TƯỢNG trong một thư mục. Bạn phải thêm một bộ lọc hoặc đặc tả tệp để có được nó để đếm tệp. thử (gci) .count và dir từ thư mục gốc trong ổ C: của bạn và xem sự khác biệt về số lượng
Jim B

4
Từ cùng một liên kết đó, nếu bạn muốn đếm các tập tin trong các thư mục con cũng sử dụng:(Get-ChildItem -recurse -filter "*.ps1").Count
jrsconfitto

1
Không hoạt động nếu có chính xác một tệp, phải làm một cái gì đó như thế này: $ filecount = @ (get-childitem $ thư mục -filter " . ") .Count. Từ những gì tôi đọc ở nơi khác, nó không phải là một mảng nếu có một tệp.
NealWalters

@NealWalters: Điều này đúng cho đến khi PowerShell v3. Kể từ đó nó không thành vấn đề.
Joey

8
dir /a-d | find "File(s)"

Một lời cảnh báo về việc sử dụng PowerShell cho các thao tác tệp đơn giản như thế này - nó cực kỳ chậm so với cmd.exe, đặc biệt là qua các kết nối mạng hoặc khi có hàng ngàn tệp trong thư mục. Xem bài đăng diễn đàn này để biết thêm.


Nếu hệ thống của bạn sử dụng ngôn ngữ khác với tiếng Anh, bạn sẽ gặp vấn đề với điều này.
WalyKu

7

dir cung cấp cho bạn tổng số tập tin ở phía dưới.


1
1 người bạn đời, bạn đánh bại tôi với điều này :)
dyasny

2
và để tránh chi phí xem tất cả các dòng cuộn qua cửa sổ cmd ... giảm thiểu nó, nó sẽ hoạt động nhanh hơn rất nhiều.
gbjbaanb

1
hoặc chỉ dir > file.. ahh tôi nhớ POSIX
lorenzog

1
@lorenz: Bất kỳ lý do tại sao dir > filekhông nên làm việc trong Windows? Chuyển hướng đầu ra không chính xác là ma thuật, bạn biết đấy.
Joey

1
@johannes: thực tế nó hoạt động! Tôi nhớ POSIX vì bạn có thể "chỉ" làm dir | grep (something)để tránh việc viết chậm trên màn hình làm chậm mọi thứ (và giảm thiểu hoàn toàn).
lorenzog

7

Phương pháp nhanh nhất tôi đã tìm thấy là chạy như sau trong bảng điều khiển PS.

[System.IO.Directory]::GetFiles($path).Count

trong đó $ path là đường dẫn cục bộ hoặc chia sẻ UNC.


2
Nhìn kìa. Một câu trả lời tuyệt vời hợp lệ xuất hiện gần 7,5 năm sau khi câu hỏi được hỏi!
p.campbell

Đã làm việc trên Máy chủ ảo trong một thư mục có hơn 2,1 triệu tệp để trả về số lượng trong khoảng 10 giây cho tôi. Đây phải là câu trả lời chính xác cho chắc chắn.
DarrenMB

Đây thực sự là câu trả lời tốt nhất. Tôi đã có một thư mục chứa 4,5 triệu tệp trong đó và phương pháp này đếm chúng trong vài giây. Các phương pháp trong các câu trả lời được đề xuất khác đã chạy trong vài phút trước khi tôi từ bỏ chúng.
ripvlan

3

chỉ cần đếm dòng từ đầu ra dir / B (bao gồm các thư mục):
dir /B | find /c /v "~~~"

chỉ đếm tập tin (không có thư mục):
dir /A-D /B | find /c /v "~~~"


Điều này trả về tổng số tệp và thư mục
TheCleaner

2

Tìm thấy cái này trên mạng:

dir /a-d | find /c ":" > NUMfiles.###
set /p count=<NUMfiles.###
echo %count%

Tôi đã thử nghiệm và nó dường như làm việc.


Có vẻ như là một từ chính xác ở đây. (1) Điều này bị tắt bởi một trong mọi trường hợp, vì dirlệnh bao gồm một dòng có dấu hai chấm trong đó không phải là một tệp. (2) Điều này phụ thuộc vào định dạng thời gian để bao gồm dấu hai chấm, mà không nhất thiết phải như vậy. (3) Nó dựa vào định dạng số không bao gồm dấu hai chấm, điều này cũng không nhất thiết phải như vậy. Bên cạnh đó, việc duyệt qua một tập tin ở đây là không cần thiết và sẽ không hiệu quả nếu bạn không có quyền truy cập vào ý tưởng tồi.
Joey

Làm cách nào để tạo tệp mà không tạo tệp "NUMfiles. ###"?
NickUnuchek

2

Chỉ là một lời cảnh báo cho những người có thể sử dụng câu trả lời PowerShell của Trevoke ở trên ( dấu nhắc lệnh của Windows: làm thế nào để đếm số lượng tệp trong thư mục hiện tại? ): Theo thiết kế, lặp lại thuộc tính Count của bộ sưu tập được trả về bởi Get-ChildItem có thể cho kết quả sai lệch nếu giá trị là 1 hoặc 0. Điều này là do thuộc tính Count chỉ khả dụng trên các mảng. Nếu có ít hơn 2 mục được trả về bởi Get-ChildItem, kết quả là vô hướng và .Count không trả về gì. Để giải quyết vấn đề này, hãy phân tách rõ ràng thành một mảng, ví dụ: @ (Get-ChildItem C: \ Sc scripts) .Count.

Để biết thêm thông tin, hãy xem http://connect.microsoft.com/PowerShell/feedback/details3534672/get-childitem-count-pro Hiệu-with-one-file hoặc http://www.vistax64.com/powershell/266379 -get-childitem-Count-not-work-one-file.html .


0

dir trả về số lượng tệp và thư mục ở phía dưới


0

DIr tất nhiên sẽ làm việc

Không cần cài đặt một cái gì đó trên máy chủ nhưng có quyền hạn trên máy trạm của bạn, bạn có thể làm:

(gwmi -computer theserver -query "select *from cim_datafile where path = '\\'").count

lệnh đó sẽ cung cấp cho bạn tất cả các tệp (bao gồm hệ thống và ẩn) và như đã đề cập trước đây nếu powershell có trên máy, bạn có thể chỉ cần

(GCI c:\*.*).count

Lưu ý rằng nếu bạn không bao gồm . bạn sẽ nhận được một số lượng tất cả các tập tin và tất cả các thư mục. Bạn sẽ không bao gồm các tệp hệ thống và ẩn mà bạn cần thêm lực lượng để đếm tất cả


0

Nếu tôi chỉ cần điều này một lần tôi sẽ chỉ sử dụng thư mục, nếu không tôi sẽ xem xét việc tự mình sử dụng, có thể là ứng dụng C # vì đó là điều tôi quen thuộc nhất (mặc dù VBScript hoặc PowerShell cũng sẽ khả thi).

(Nhân tiện - không phải DOS nếu bạn đang sử dụng cmd.exe)


0

Tôi tin rằng bạn có thể sử dụng attrib để lấy số tập tin:

attrib.exe /s /D *.*|find /c /v "" >> filecount.txt

Điều này sẽ tạo một tệp có tên filecount.txt trong thư mục hiện tại với số lượng tệp và thư mục trong thư mục hiện tại (bao gồm cả tệp mới được tạo). Bạn có thể thay đổi

*.*

đến

<full_path>\*.*

để có được số lượng tập tin của một thư mục cụ thể. Xóa tùy chọn "/ D" nếu bạn không muốn đếm các thư mục. Tùy chọn "/ s" xử lý các tệp trong tất cả các thư mục trong đường dẫn đã chỉ định. Vì vậy, hãy xóa nó nếu bạn chỉ muốn các tệp trong đường dẫn được chỉ định và không muốn bao gồm các tệp trong các thư mục phụ.

Vì vậy, ví dụ nếu bạn muốn tìm hiểu có bao nhiêu tệp trong ổ C: \ của bạn và không phải bất kỳ thư mục con nào bạn sẽ sử dụng lệnh:

attrib.exe C:\*.* | find /c /v "" >> filecount.txt

Sử dụng tập tin cho kết quả không phải là ý tưởng thông minh nhất. Bạn sẽ làm gì nếu thư mục hiện tại không thể ghi được?
Joey

@Johannes Sử dụng một thư mục bạn có quyền truy cập ghi vào? ví dụ: dẫn đầu ra tới C: \ MyWritableDir \ filecount.txt
smoak

Vẫn không cần thiết.
Joey

-2

Tôi đang làm một cái gì đó tương tự và điều này hoạt động với bất kỳ số lượng tệp ngay lập tức.

Setlocal enabledelayedexpansion

Dir /A | find "File(s)" >tmp

For /F "tokens=1" %%i in (tmp) do set n=%%i

Del tmp

If !n! GEQ 10 echo Too many files in directory.

Tại sao đăng một câu trả lời vô ích (và thiếu sót) cho một câu hỏi 6 tuổi với rất nhiều câu trả lời (tốt)?
Massimo

@Massimo vì tôi không hài lòng với câu trả lời ở trên và muốn một giải pháp thanh lịch hơn. Tại sao phải theo cách theo đuổi kiến ​​thức không bị giới hạn bởi thời gian?
Aaron Lowe

Ôi trời! Những câu trả lời trông thật kinh khủng. Chỉnh sửa giải pháp thành câu trả lời. Không cần phải cảm ơn tôi Tôi yêu người đại diện tiêu cực vì đã giúp đỡ người khác :-P
Aaron Lowe

Thực sự không có lý do để sử dụng tệp tạm thời để giữ một số đầu ra; Ngoài ra, sử dụng findkhông phải là một ý tưởng tốt. Xem câu trả lời được chấp nhận để biết chi tiết.
Massimo

@Massimo Tôi đã trả lời câu hỏi của bạn. Bạn nợ tôi một câu trả lời cho tôi. Nếu bạn có thể chỉ cho tôi cách tránh sử dụng tệp tạm thời tôi sẽ đánh giá cao điều đó. Tôi đã đọc tất cả các câu trả lời đó là lý do tại sao tôi đăng bài của riêng mình. Bạn đang cho rằng vì một câu trả lời được chấp nhận nên không thể tìm thấy câu trả lời mới. Nó không chỉ dành cho OP mà còn cho tất cả mọi người tìm kiếm cùng một giải pháp.
Aaron Lowe
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.