Prompt perintah Windows: bagaimana cara menghitung semua file di direktori saat ini?

24

Apa perintah yang Anda gunakan cmd.exeuntuk menemukan jumlah file di direktori saat ini?

Apakah ada opsi PowerShell di sini?

Pembaruan : Saya berharap untuk menghindari dir, karena saya tahu ada 10.000 file di direktori saat ini. Ingin menghindari keluaran enumerasi ke jendela cmd. Terima kasih!

p.campbell
sumber

Jawaban:

27

Jika Anda ingin melakukannya cmd, maka berikut ini adalah cara sepele untuk melakukannya:

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

Itu mengasumsikan baris perintah. Dalam file batch yang akan Anda lakukan

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

yang melakukan hal-hal yang sedikit lebih baik. Anda bisa menjatuhkan >nulbatch, karena set /atidak akan menampilkan hasilnya jika dijalankan dari file batch — itu langsung dari baris perintah. Selanjutnya %tanda dalam forloop harus digandakan.

Saya telah melihat beberapa contoh di mana orang mencoba trik yang bagus find /c. Berhati - hatilah dengan itu, karena berbagai hal dapat merusak ini.

Kesalahan Umum:

  1. Menggunakan find /c /vdan mencoba menemukan sesuatu yang tidak pernah dimasukkan dalam nama file, seperti ::. Biasa. Kerja. Andal. Ketika jendela konsol diatur ke font raster maka Anda bisa mendapatkan kombinasi karakter tersebut. Saya dapat mencakup karakter dalam nama file seperti :, ?, dll dalam varian full-width mereka misalnya, yang akan kemudian diubah ke rekan-rekan ASCII normal yang akan istirahat ini. Jika Anda membutuhkan hitungan yang akurat, maka jangan coba ini.

  2. Menggunakan find /cdan mencoba menemukan sesuatu yang selalu termasuk dalam nama file. Jelas titik ( .) adalah pilihan yang buruk. Jawaban lain menyarankan

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

    yang mengasumsikan beberapa hal tentang lokal pengguna, tidak semuanya dijamin benar (saya telah meninggalkan komentar yang merinci masalah di sana) dan mengembalikan satu hasil terlalu banyak.

Umumnya, Anda ingin menggunakan finddi dir /bmana pemotongan segala hal non-nama file dan menghindari fencepost kesalahan seperti itu.

Jadi varian elegannya adalah:

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

yang pertama akan menampilkan semua nama file, masing-masing satu baris. Dan kemudian hitung semua baris output yang tidak kosong. Karena nama file tidak boleh kosong (kecuali saya kehilangan sesuatu, tetapi Unicode tidak akan trip ini menurut tes saya).

Joey
sumber
1
+1 Itulah tepatnya yang saya cari. JR terima kasih!
p.campbell
Tweak kecil untuk membuat versi pertama semuanya menjadi satu baris: (set hitung = 0 & untuk% x in (*) do @ (atur / hitung + = 1> nul)) && gema% hitung%
Jason Massey
+1 untukdir /b /a-d | find /c /v ""
Arvo Bowen
Solusi ini tidak berfungsi dengan baik ketika ada jutaan file. Ini berjalan "selamanya" - solusi yang lebih baik diposting di bawah ini yang berjalan "dalam detik" menggunakan PS dan [System.IO.Directory] :: GetFiles ($ path)
.Count
@ alasan, itu mungkin akan gagal karena %count%diperluas pada waktu parse.
Joey
17

Tanyakan dan kamu akan menerima: http://technet.microsoft.com/en-us/library/ee692796.aspx

Menghitung Jumlah Item dalam Folder

Nah, apa yang Anda tahu: sepertinya matahari akhirnya keluar, yang berarti sudah hampir waktunya bagi kita untuk pergi. Sebelum kita melakukannya, mari kita tunjukkan satu trik kecil terakhir dengan cmdlet Get-ChildItem. Terkadang Anda tidak benar-benar perlu tahu banyak tentang file dalam folder; yang perlu Anda ketahui hanyalah berapa banyak file (jika ada) yang dapat ditemukan di folder tertentu. Inilah cara Anda dapat dengan cepat menghitung jumlah file dalam folder:

(Get-ChildItem C:\Scripts).Count

Apa yang kita lakukan disini Kami cukup menggunakan Get-ChildItem untuk mengembalikan koleksi semua item yang ditemukan di folder C: \ Scripts; karena ini adalah koleksi, yang harus kita lakukan adalah mengulang kembali nilai properti Count, yang memberi tahu kita jumlah item dalam koleksi. Perhatikan penggunaan tanda kurung: kita lampirkan perintah Get-ChildItem dalam tanda kurung untuk memastikan bahwa Windows PowerShell pertama-tama mengambil koleksi dan hanya kemudian mengulangi nilai properti Count untuk koleksi itu.

Dan tentu saja, Anda dapat menyertakan filter saat memanggil Get-ChildItem. Perlu tahu berapa banyak file .PS1 yang ada di folder C: \ Script? Oke-doke:

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

FYI .. Saya mencari "file count powershell" di Google.

Trevoke
sumber
1
Anda perlu menambahkan filespec untuk membuat hitungan benar-benar menghitung file, seperti contoh kedua
Jim B
3
Untuk lebih jelasnya (Get-ChildItem C: \ Scripts) .Count TIDAK akan mengembalikan jumlah file dalam folder, itu akan mengembalikan jumlah OBJECTS dalam folder. Anda harus menambahkan filter atau spesifikasi file agar dapat menghitung file. coba (gci). hitung dan dir dari akar drive C: Anda dan lihat perbedaan jumlahnya
Jim B
4
Dari tautan yang sama, jika Anda ingin menghitung file dalam subfolder juga gunakan:(Get-ChildItem -recurse -filter "*.ps1").Count
jrsconfitto
1
Tidak berfungsi jika hanya ada satu file, harus melakukan sesuatu seperti ini: $ filecount = @ (get-childitem $ directory -filter " . ") .Count. Dari apa yang saya baca di tempat lain, itu bukan sebuah array jika ada satu file.
NealWalters
@NealWalters: Ini benar sampai PowerShell v3. Sejak itu tidak masalah.
Joey
8
dir /a-d | find "File(s)"

Sebuah kata peringatan tentang penggunaan PowerShell untuk operasi file sederhana seperti ini - ini sangat lambat dibandingkan dengan cmd.exe, terutama melalui koneksi jaringan atau ketika ada ribuan file di direktori. Lihat posting forum ini untuk info lebih lanjut.

Rossnz
sumber
Jika sistem Anda menggunakan bahasa yang berbeda dari bahasa Inggris, Anda akan mengalami masalah dengan ini.
WalyKu
7

dir memberi Anda jumlah total file di bagian bawah.

lorenzog
sumber
1
1 Sobat, kamu mengalahkan saya untuk yang satu ini :)
dyasny
2
dan untuk menghindari biaya menonton semua baris gulir melalui jendela cmd ... menguranginya, itu akan bekerja BANYAK lebih cepat.
gbjbaanb
1
atau hanya dir > file.. ahh aku rindu POSIX
lorenzog
1
@lorenz: Ada alasan mengapa dir > filetidak bekerja di Windows? Pengarahan output tidak benar-benar ajaib, Anda tahu.
Joey
1
@johannes: itu berhasil, sebenarnya! Saya kehilangan POSIX karena Anda bisa "hanya" melakukan dir | grep (something)untuk menghindari penulisan lambat di layar yang memperlambat segalanya (dan meminimalkan semuanya).
lorenzog
7

Metode tercepat yang saya temukan adalah menjalankan yang berikut di konsol PS.

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

di mana $ path adalah jalur lokal atau saham UNC.

John Brooks
sumber
2
Lihat itu. Jawaban mengagumkan yang valid muncul hampir 7,5 tahun setelah pertanyaan diajukan!
p.campbell
Bekerja pada Server Virtual dalam direktori dengan lebih dari 2,1 juta file untuk mengembalikan hitungan dalam waktu sekitar 10 detik untuk saya. Ini pasti jawaban yang benar.
DarrenMB
Ini benar-benar jawaban terbaik. Saya memiliki folder dengan 4,5 juta file di dalamnya dan metode ini menghitungnya dalam beberapa detik. Metode-metode dalam jawaban yang diajukan lain berjalan beberapa menit sebelum saya menyerah.
ripvlan
3

cukup hitung baris dari keluaran dir / B (termasuk direktori):
dir /B | find /c /v "~~~"

untuk hanya menghitung file (tanpa dir):
dir /A-D /B | find /c /v "~~~"

Garcia
sumber
Ini mengembalikan jumlah file dan direktori sebagai total
TheCleaner
2

Menemukan ini di internet:

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

Saya diuji dan tampaknya berhasil.

Kelsey
sumber
"Seems to" adalah kata yang tepat di sini. (1) Ini tidak aktif oleh satu dalam hal apapun, karena dirperintah termasuk baris dengan titik dua di dalamnya yang bukan file. (2) Ini bergantung pada format waktu untuk menyertakan titik dua, yang tidak harus seperti itu. (3) Itu bergantung pada format angka tidak termasuk titik dua, yang juga tidak harus begitu. Selain itu, membaca file di sini tidak perlu dan tidak akan berfungsi jika Anda tidak memiliki akses tulis — ide yang buruk.
Joey
Bagaimana membuatnya tanpa membuat file "NUMfiles. ###"?
NickUnuchek
2

Hanya peringatan bagi mereka yang mungkin menggunakan jawaban PowerShell Trevoke di atas ( prompt perintah Windows: cara mendapatkan jumlah semua file di direktori saat ini? ): Dengan desain, menggemakan properti Hitung koleksi yang dikembalikan oleh Get-ChildItem dapat memberikan hasil yang menyesatkan jika nilainya 1 atau 0. Ini karena properti Count hanya tersedia pada array. Jika kurang dari 2 item dikembalikan oleh Get-ChildItem, hasilnya adalah skalar, dan .Count tidak mengembalikan apa pun. Untuk menyiasati ini, secara eksplisit melemparkannya ke dalam array, misalnya, @ (Get-ChildItem C: \ Scripts) .Count.

Untuk info lebih lanjut, lihat http://connect.microsoft.com/PowerShell/feedback/details/354672/get-childitem-count-problem-with-one-file atau http://www.vistax64.com/powershell/266379 -get-childitem-count-not-working-one-file.html .

Heather M.
sumber
0

dir mengembalikan jumlah file dan direktori di bagian bawah

dyasny
sumber
0

Tentu saja akan berhasil

Tanpa menginstal sesuatu di server tetapi memiliki PowerShell di workstation Anda, Anda bisa melakukannya:

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

perintah itu akan memberi Anda semua file (termasuk sistem dan tersembunyi) dan seperti yang disebutkan sebelumnya jika PowerShell ada di mesin, Anda dapat dengan mudah

(GCI c:\*.*).count

Perhatikan bahwa jika Anda tidak menyertakan . Anda akan mendapatkan hitungan semua file dan semua direktori. Anda tidak akan menyertakan file tersembunyi dan sistem yang perlu Anda tambahkan-paksa untuk menghitung semuanya

Jim B
sumber
0

Jika saya hanya perlu ini sekali saya hanya akan menggunakan dir, kalau tidak saya akan mempertimbangkan untuk menggulir sendiri, mungkin sebagai aplikasi C # karena itulah yang saya paling akrab dengan (meskipun VBScript atau PowerShell juga akan layak).

(Omong-omong - ini bukan DOS jika Anda menggunakan cmd.exe)

Maximus Minimus
sumber
0

Saya yakin Anda bisa menggunakan attrib untuk mendapatkan jumlah file:

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

Ini akan membuat file bernama filecount.txt di direktori saat ini dengan jumlah file dan folder di direktori saat ini (termasuk file yang baru dibuat). Anda dapat mengubah

*.*

untuk

<full_path>\*.*

untuk mendapatkan jumlah file dari direktori tertentu. Hapus opsi "/ D" jika Anda tidak ingin menghitung folder. Opsi "/ s" memproses file di semua direktori di jalur yang ditentukan. Jadi hapus jika Anda hanya ingin file di jalur yang ditentukan dan tidak ingin memasukkan file dalam sub folder.

Jadi misalnya jika Anda ingin mengetahui berapa banyak file di drive C: \ Anda dan bukan subfolder, Anda akan menggunakan perintah:

attrib.exe C:\*.* | find /c /v "" >> filecount.txt
smoak
sumber
Menggunakan file untuk hasil bukanlah ide yang paling cerdas. Apa yang Anda lakukan jika direktori saat ini tidak dapat ditulis oleh Anda?
Joey
@Johannes Gunakan direktori tempat Anda memiliki akses tulis? mis. pipa output ke C: \ MyWritableDir \ filecount.txt
smoak
Masih tidak perlu.
Joey
-2

Saya melakukan sesuatu yang serupa dan ini berfungsi dengan sejumlah file secara instan.

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.
Aaron Lowe
sumber
Mengapa memposting jawaban yang tidak berguna (dan cacat) untuk pertanyaan 6 tahun dengan sudah banyak jawaban (bagus)?
Massimo
@ Massimo karena saya tidak puas dengan jawaban di atas dan menginginkan solusi yang lebih elegan. Mengapa menghalangi upaya mengejar pengetahuan yang tidak dibatasi oleh waktu?
Aaron Lowe
Urgh! Balasannya terlihat mengerikan. Solusi yang diedit menjadi jawaban. Tidak perlu berterima kasih kepada saya, saya suka perwakilan negatif karena membantu orang lain :-P
Aaron Lowe
Sebenarnya tidak ada alasan untuk menggunakan file temp untuk menahan beberapa output; juga, menggunakan findbukanlah ide yang baik. Lihat jawaban yang diterima untuk detailnya.
Massimo
@ Massimo Saya menjawab pertanyaan Anda. Anda berutang jawaban kepada saya. Jika Anda bisa menunjukkan kepada saya bagaimana menghindari menggunakan file temp saya akan menghargai itu. Saya sudah membaca semua jawaban yang mengapa saya memposting jawaban saya sendiri. Anda mengasumsikan bahwa karena jawaban diterima maka jawaban baru tidak dapat ditemukan. Ini bukan hanya untuk OP tetapi untuk semua orang yang mencari solusi yang sama.
Aaron Lowe