พรอมต์คำสั่ง Windows: วิธีรับจำนวนไฟล์ทั้งหมดในไดเรกทอรีปัจจุบัน


24

คุณใช้คำสั่งอะไรในcmd.exeการค้นหาจำนวนไฟล์ในไดเรกทอรีปัจจุบัน

มีตัวเลือก powershell ที่นี่หรือไม่

อัปเดต : ฉันหวังว่าจะหลีกเลี่ยงdirเพราะฉันรู้ว่ามีไฟล์มากกว่า 10,000 ไฟล์ในไดเรกทอรีปัจจุบัน ต้องการหลีกเลี่ยงการส่งออกการแจงนับไปที่หน้าต่าง cmd ขอขอบคุณ!

คำตอบ:


27

หากคุณต้องการที่จะทำกับมันcmdแล้วต่อไปนี้เป็นวิธีที่ไม่สำคัญที่จะทำมัน:

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

นั่นคือสมมติว่าบรรทัดคำสั่ง ในแบทช์ไฟล์ที่คุณจะทำ

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

ซึ่งทำสิ่งต่าง ๆ ดีกว่าเล็กน้อย คุณสามารถวาง>nulในแบตช์เนื่องจากset /aจะไม่แสดงผลลัพธ์หากเรียกใช้จากไฟล์แบตช์ซึ่งจะทำโดยตรงจากบรรทัดคำสั่ง ยิ่งไปกว่านั้นการ%เซ็นชื่อในforวงจะต้องเป็นสองเท่า

find /cผมเคยเห็นค่อนข้างไม่กี่กรณีที่คนพยายามเทคนิคที่ดีด้วย จะมากระมัดระวังกับเหล่านั้นเป็นสิ่งต่างๆสามารถทำลายนี้

ข้อผิดพลาดทั่วไป:

  1. การใช้และลองหาบางสิ่งบางอย่างที่ไม่เคยรวมอยู่ในชื่อไฟล์เช่นfind /c /v ::เคยชิน. งาน. อย่างน่าเชื่อถือ เมื่อหน้าต่างคอนโซลถูกตั้งค่าเป็นฟอนต์แรสเตอร์คุณจะสามารถใช้ชุดอักขระเหล่านั้นได้ ที่ฉันสามารถรวมตัวอักษรในชื่อไฟล์เช่น:, ?ฯลฯ ในเต็มความกว้างของพวกเขาเช่นสายพันธุ์ซึ่งจะได้รับการแปลงแล้วกับคู่ ASCII ปกติของพวกเขาซึ่งจะทำลายนี้ หากคุณต้องการการนับที่แม่นยำอย่าพยายามทำเช่นนี้

  2. การใช้find /cและลองหาบางสิ่งบางอย่างที่มักจะรวมอยู่ในชื่อไฟล์ เห็นได้ชัดว่าจุด ( .) เป็นตัวเลือกที่แย่ คำตอบอีกข้อเสนอแนะ

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

    ซึ่งถือว่าหลายสิ่งเกี่ยวกับสถานที่ของผู้ใช้ไม่ใช่ทั้งหมดที่รับประกันว่าเป็นจริง (ฉันได้แสดงความคิดเห็นโดยละเอียดถึงปัญหาที่เกิดขึ้น) และส่งคืนผลลัพธ์มากเกินไป

โดยทั่วไปแล้วคุณต้องการที่จะใช้findในdir /bที่ตัดออกไปทุกสิ่งที่ไม่ใช่ชื่อไฟล์และหลีกเลี่ยงข้อผิดพลาด fencepost วิธีการที่

ดังนั้นตัวแปรที่สง่างามจะเป็น:

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

ซึ่งก่อนจะออกชื่อไฟล์ทั้งหมดหนึ่งบรรทัดในแต่ละบรรทัด จากนั้นนับบรรทัดทั้งหมดของเอาต์พุตที่ไม่ว่างเปล่า เนื่องจากชื่อไฟล์ต้องไม่ว่างเปล่า (เว้นแต่ฉันจะทำบางอย่างขาดหายไป แต่ Unicode จะไม่เดินทางตามการทดสอบของฉัน)


1
+1 นั่นคือสิ่งที่ฉันกำลังมองหา ขอบคุณ JR!
p.campbell

ปรับแต่งเล็กน้อยเพื่อให้รุ่นที่ 1 มีหนึ่งบรรทัด: (set count = 0 & สำหรับ% x in (*) do @ (set / a count + = 1> nul)) && echo% count%
Jason Massey

+1 สำหรับdir /b /a-d | find /c /v ""
Arvo Bowen

โซลูชันนี้ใช้งานไม่ได้เมื่อมีไฟล์หลายล้านไฟล์ มันทำงาน "ตลอดไป" - ทางออกที่ดีกว่าถูกโพสต์ด้านล่างที่ทำงาน "ในไม่กี่วินาที" โดยใช้ PS และ [System.IO.Directory] :: GetFiles ($ path) .Count
ripvlan

@ Jason ที่อาจจะล้มเหลวเนื่องจาก%count%มีการขยายเวลาการแยกวิเคราะห์
Joey

17

ถามและคุณจะได้รับ: http://technet.microsoft.com/en-us/library/ee692796.aspx

การนับจำนวนรายการในโฟลเดอร์

คุณรู้อะไร: ดูเหมือนว่าพระอาทิตย์กำลังจะออกมาในที่สุดซึ่งหมายความว่ามันเกือบจะเป็นเวลาที่เราจะไปแล้ว อย่างไรก็ตามก่อนที่เราจะทำอย่างไรให้เราแสดงเคล็ดลับเล็กน้อยสุดท้ายกับ Get-ChildItem cmdlet บางครั้งคุณไม่จำเป็นต้องรู้มากเกี่ยวกับไฟล์ในโฟลเดอร์ สิ่งที่คุณต้องรู้จริงๆคือมีกี่ไฟล์ (ถ้ามี) ในโฟลเดอร์ใดโฟลเดอร์หนึ่ง นี่คือวิธีที่คุณสามารถนับจำนวนไฟล์ในโฟลเดอร์ได้อย่างรวดเร็ว:

(Get-ChildItem C:\Scripts).Count

เรากำลังทำอะไรที่นี่ เราเพียงแค่ใช้ Get-ChildItem เพื่อส่งคืนคอลเลกชันของรายการทั้งหมดที่พบในโฟลเดอร์ C: \ Scripts; เพราะนี่คือคอลเล็กชันสิ่งที่เราต้องทำคือสะท้อนกลับค่าของคุณสมบัติ Count ซึ่งจะบอกจำนวนรายการในคอลเลกชัน สังเกตการใช้วงเล็บ: เราใส่คำสั่ง Get-ChildItem ไว้ในวงเล็บเพื่อให้แน่ใจว่า Windows PowerShell คว้าคอลเลกชันก่อนจากนั้นจึงสะท้อนกลับค่าของคุณสมบัติ Count สำหรับคอลเลกชันนั้น

และแน่นอนว่าคุณสามารถรวมตัวกรองเมื่อเรียกใช้ Get-ChildItem ต้องการทราบว่ามีไฟล์. SP1 กี่ไฟล์ในโฟลเดอร์ C: \ Scripts? Okey-Doke:

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

FYI .. ฉัน googled "powershell count files"


1
คุณต้องเพิ่ม filespec เพื่อให้นับจำนวนจริงนับจำนวนไฟล์ตามตัวอย่างที่สอง
Jim B

3
เพียงเพื่อให้ชัดเจน (Get-ChildItem C: \ Scripts) จำนวนจะไม่ส่งคืนจำนวนไฟล์ในโฟลเดอร์มันจะส่งกลับจำนวน OBJECTS ในโฟลเดอร์ คุณต้องเพิ่มตัวกรองหรือข้อมูลจำเพาะของไฟล์เพื่อให้สามารถนับจำนวนไฟล์ได้ ลอง (gci) .count และ dir จากรากของ C: ขับรถและดูความแตกต่างของตัวเลข
Jim B

4
จากลิงก์เดียวกันนั้นหากคุณต้องการนับไฟล์ในโฟลเดอร์ย่อยก็ใช้เช่นกัน:(Get-ChildItem -recurse -filter "*.ps1").Count
jrsconfitto

1
ใช้งานไม่ได้หากมีไฟล์เดียวให้ทำดังนี้: $ filecount = @ (get-childitem $ directory -filter " . ") .Count จากสิ่งที่ฉันอ่านที่อื่นมันไม่ใช่อาร์เรย์ถ้ามีไฟล์เดียว
NealWalters

@NealWalters: สิ่งนี้ถูกต้องจนกว่า PowerShell v3 ตั้งแต่นั้นมามันก็ไม่สำคัญ
Joey

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

คำเตือนเกี่ยวกับการใช้ PowerShell สำหรับการทำงานของไฟล์อย่างง่าย - ช้ามากเมื่อเทียบกับ cmd.exe โดยเฉพาะอย่างยิ่งผ่านการเชื่อมต่อเครือข่ายหรือเมื่อมีไฟล์นับพันในไดเรกทอรี ดูโพสต์ฟอรั่มนี้สำหรับข้อมูลเพิ่มเติม


หากระบบของคุณใช้ภาษาอื่นที่ไม่ใช่ภาษาอังกฤษคุณจะมีปัญหากับสิ่งนี้
WalyKu

7

dir ให้จำนวนไฟล์ทั้งหมดที่ด้านล่าง


1
1 คู่, คุณชนะฉันไปนี้ :)
dyasny

2
และเพื่อหลีกเลี่ยงค่าใช้จ่ายในการดูบรรทัดทั้งหมดเลื่อนผ่านหน้าต่าง cmd ... ย่อให้เล็กสุดมันจะทำงานได้เร็วขึ้นมาก
gbjbaanb

1
หรือเพียงdir > file.. อ่าฉันพลาด POSIX
lorenzog

1
@lorenz: เหตุผลใดทำไมdir > fileไม่ควรทำงานใน Windows? การเปลี่ยนเส้นทางออกไม่ใช่เรื่องมหัศจรรย์อย่างที่คุณรู้
Joey

1
@ โจฮัน: มันใช้งานได้จริง! ฉันพลาด POSIX เพราะคุณสามารถ "แค่" ทำdir | grep (something)เพื่อหลีกเลี่ยงการเขียนบนหน้าจอที่ช้าซึ่งทำให้ทุกอย่างช้าลง (และย่อให้เล็กสุด)
lorenzog

7

วิธีที่เร็วที่สุดที่ฉันพบคือการเรียกใช้สิ่งต่อไปนี้ในคอนโซล PS

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

โดยที่ $ path เป็นเส้นทางท้องถิ่นหรือ UNC ที่ใช้ร่วมกัน


2
ดูนั่นสิ คำตอบที่ยอดเยี่ยมที่ถูกต้องปรากฏขึ้นเกือบ 7.5 ปีหลังจากถามคำถาม!
p.campbell

ทำงานบนเซิร์ฟเวอร์เสมือนในไดเรกทอรีที่มีไฟล์มากกว่า 2.1 ล้านไฟล์เพื่อส่งกลับจำนวนในเวลาประมาณ 10 วินาทีสำหรับฉัน นี่ควรเป็นคำตอบที่ถูกต้องแน่นอน
DarrenMB

นี่เป็นคำตอบที่ดีที่สุด ฉันมีโฟลเดอร์ที่มีไฟล์อยู่ 4.5 ล้านไฟล์และวิธีนี้นับได้ในไม่กี่วินาที วิธีการในคำตอบที่เสนออื่น ๆ วิ่งไปหลายนาทีก่อนที่ฉันจะยอมแพ้
ripvlan

3

เพียงนับบรรทัดจากเอาต์พุต dir / B (รวมไดเรกทอรี):
dir /B | find /c /v "~~~"

เพียงแค่นับไฟล์ (โดยไม่มี dirs):
dir /A-D /B | find /c /v "~~~"


สิ่งนี้จะคืนค่าไฟล์และไดเร็กตอรี่นับเป็นยอดรวม
TheCleaner

2

พบสิ่งนี้ในเน็ต:

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

ฉันทดสอบและดูเหมือนว่าจะทำงาน


“ ดูเหมือนจะ” เป็นคำที่ถูกต้องที่นี่ (1) สิ่งนี้ถูกปิดโดยหนึ่งในกรณีใด ๆ เนื่องจากdirคำสั่งรวมถึงบรรทัดที่มีเครื่องหมายจุดคู่อยู่ในนั้นซึ่งไม่ใช่ไฟล์ (2) วิธีนี้ขึ้นอยู่กับรูปแบบเวลาในการรวมเครื่องหมายโคลอนซึ่งไม่จำเป็นต้องเป็นเช่นนั้น (3) ขึ้นอยู่กับรูปแบบตัวเลขที่ไม่รวมถึงเครื่องหมายโคลอนซึ่งไม่จำเป็นต้องเป็นเช่นนั้น นอกจากนี้การผ่านไฟล์ที่นี่ไม่จำเป็นและจะไม่ทำงานหากคุณไม่มีสิทธิ์ในการเขียน - ความคิดที่ไม่ดี
Joey

วิธีสร้างโดยไม่สร้างไฟล์ "NUMfiles. ###"
NickUnuchek

2

เพียงข้อแม้สำหรับผู้ที่อาจใช้คำตอบ PowerShell ของ Trevoke ด้านบน ( พรอมต์คำสั่ง Windows: วิธีการนับจำนวนไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันได้อย่างไร ): โดยการออกแบบการสะท้อนคุณสมบัติ Count ของคอลเลกชันที่ส่งคืนโดย Get-ChildItem ถ้าค่าเป็น 1 หรือ 0 นี่เป็นเพราะคุณสมบัติ Count มีเฉพาะในอาร์เรย์เท่านั้น ถ้า Get-ChildItem ส่งคืนน้อยกว่า 2 รายการผลลัพธ์จะเป็นแบบสเกลาร์และ. Count จะไม่ส่งคืนอะไรเลย หากต้องการหลีกเลี่ยงสิ่งนี้ให้โยนลงในอาร์เรย์อย่างชัดเจนเช่น @ (Get-ChildItem C: \ Scripts) .Count

สำหรับข้อมูลเพิ่มเติมดูhttp://connect.microsoft.com/PowerShell/feedback/details/354672/get-childitem-count-problem-with-one-fileหรือhttp://www.vistax64.com/powershell/266379 รับคำ-childitem



0

แน่นอนว่า DIR จะได้ผล

โดยไม่ต้องติดตั้งบางอย่างบนเซิร์ฟเวอร์ แต่มี PowerShell บนเวิร์กสเตชันของคุณคุณสามารถทำได้:

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

คำสั่งนั้นจะให้ไฟล์ทั้งหมดแก่คุณ (ระบบและรวมอยู่ในที่ซ่อนอยู่) และตามที่กล่าวไว้ก่อนหน้านี้ถ้า powershell อยู่บนเครื่องคุณสามารถทำได้ง่ายๆ

(GCI c:\*.*).count

โปรดทราบว่าถ้าคุณไม่ได้รวมถึง คุณจะได้รับจำนวนไฟล์ทั้งหมดและไดเรกทอรีทั้งหมด คุณจะไม่รวมไฟล์ที่ซ่อนอยู่และไฟล์ระบบที่คุณต้องการเพิ่ม - บังคับเพื่อนับทั้งหมด


0

ถ้าฉันต้องการสิ่งนี้เพียงครั้งเดียวฉันก็จะใช้ dir มิฉะนั้นฉันจะลองคิดเองว่าเป็นแอป C # เพราะนั่นคือสิ่งที่ฉันจะคุ้นเคยมากที่สุด (แม้ว่า VBScript หรือ PowerShell ก็จะทำงานได้)

(โดยวิธีการ - ไม่ใช่ DOS หากคุณใช้ cmd.exe)


0

ฉันเชื่อว่าคุณสามารถใช้ attrib เพื่อรับจำนวนไฟล์:

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

สิ่งนี้จะสร้างไฟล์ชื่อ filecount.txt ในไดเรกทอรีปัจจุบันด้วยจำนวนไฟล์และโฟลเดอร์ในไดเรกทอรีปัจจุบัน (รวมถึงไฟล์ที่สร้างขึ้นใหม่) คุณสามารถเปลี่ยน

*.*

ไปยัง

<full_path>\*.*

เพื่อให้ได้จำนวนไฟล์ของไดเรกทอรีหนึ่ง ๆ ลบตัวเลือก "/ D" หากคุณไม่ต้องการนับโฟลเดอร์ ตัวเลือก "/ s" ประมวลผลไฟล์ในไดเรกทอรีทั้งหมดในเส้นทางที่ระบุ ดังนั้นลบหากคุณต้องการไฟล์ในเส้นทางที่ระบุและไม่ต้องการรวมไฟล์ในโฟลเดอร์ย่อย

ตัวอย่างเช่นหากคุณต้องการทราบจำนวนไฟล์ที่อยู่ในไดรฟ์ C: \ และไม่ใช่โฟลเดอร์ย่อยใด ๆ คุณจะใช้คำสั่ง:

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

การใช้ไฟล์เพื่อผลลัพธ์ไม่ใช่แนวคิดที่ฉลาดที่สุด คุณจะทำอย่างไรถ้าไดเรกทอรีปัจจุบันไม่สามารถเขียนได้โดยคุณ?
Joey

@Johannes ใช้ไดเรกทอรีที่คุณมีสิทธิ์เขียนเพื่อ? เช่นไพพ์เอาต์พุตไปยัง C: \ MyWritableDir \ filecount.txt
smoak

ยังไม่จำเป็น
Joey

-2

ฉันกำลังทำสิ่งที่คล้ายกันและทำงานกับไฟล์จำนวนเท่าใดก็ได้ในทันที

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.

ทำไมโพสต์คำถามไร้ประโยชน์ (และมีข้อบกพร่อง) ตอบคำถามอายุ 6 ปีที่มีคำตอบมากมายอยู่แล้ว
Massimo

@ Massimo เพราะฉันไม่พอใจกับคำตอบข้างต้นและต้องการโซลูชันที่หรูหรากว่านี้ ทำไมต้องอยู่ในแนวทางของการแสวงหาความรู้ซึ่งไม่ จำกัด เวลา?
Aaron Lowe

Urgh! คำตอบดูน่ากลัว แก้ไขทางออกเป็นคำตอบ ไม่จำเป็นต้องขอบคุณฉันรักตัวแทนเชิงลบที่ช่วยผู้อื่น :-P
Aaron Lowe

ไม่มีเหตุผลจริงๆที่จะใช้ไฟล์ชั่วคราวเพื่อเก็บเอาท์พุทบางอย่าง; ยังใช้findไม่ได้เป็นความคิดที่ดี ดูคำตอบที่ยอมรับได้สำหรับรายละเอียด
Massimo

@ Massimo ฉันตอบคำถามของคุณ คุณเป็นหนี้คำตอบสำหรับฉัน หากคุณสามารถแสดงวิธีการหลีกเลี่ยงการใช้ไฟล์ชั่วคราวฉันขอขอบคุณ ฉันได้อ่านคำตอบทั้งหมดแล้วซึ่งเป็นสาเหตุที่ฉันโพสต์ของตัวเอง คุณกำลังสันนิษฐานว่าเพราะคำตอบได้รับการยอมรับว่าไม่สามารถหาคำตอบใหม่ได้ มันไม่ใช่แค่สำหรับ OP แต่สำหรับทุกคนที่กำลังมองหาวิธีการแก้ปัญหาเดียวกัน
Aaron Lowe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.