รายการไฟล์วนซ้ำแสดงเฉพาะพา ธ เต็มและขนาดไฟล์จากพรอมต์คำสั่งของ Windows


50

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

คำสั่งต่อไปนี้ทำ แต่ไม่มีขนาดไฟล์:

dir /b /s /a:-D > results.txt

ตัวอย่างผลลัพธ์จะมีลักษณะดังนี้:

C:\Users\Martin\Pictures\Table\original\PC120013.JPG  227298
C:\Users\Martin\Pictures\Table\original\PC120014.JPG  123234
C:\Users\Martin\Pictures\Table\original\PC120015.JPG  932344

ฉันไม่คิดว่ามันเป็นไปได้ที่จะใช้dirคนเดียวแม้ว่าฉันจะชอบที่จะพิสูจน์ว่าผิด มีวิธีการอื่นในการทำเช่นนี้โดยใช้เฉพาะคำสั่งที่มีให้จาก Command Prompt หรือไม่

คำตอบ:


28

สิ่งนี้ควรทำ:

@echo off & for /f %a in ('dir /s /b') do echo %~fa %~za

มันไม่ได้มีประสิทธิภาพมาก ... การเรียกใช้มันสำหรับโฟลเดอร์ที่มีไฟล์จำนวนมากอาจไม่สมบูรณ์ดังนั้นลองใช้กับโฟลเดอร์ขนาดเล็กก่อน

จาก "สำหรับ /?" ข้อความช่วยเหลือ (ฉันใช้ 'a' แทน 'I')

In addition, substitution of FOR variable references has been enhanced.
You can now use the following optional syntax:

%~I         - expands %I removing any surrounding quotes (")
%~fI        - expands %I to a fully qualified path name
%~dI        - expands %I to a drive letter only
%~pI        - expands %I to a path only
%~nI        - expands %I to a file name only
%~xI        - expands %I to a file extension only
%~sI        - expanded path contains short names only
%~aI        - expands %I to file attributes of file
%~tI        - expands %I to date/time of file
%~zI        - expands %I to size of file
%~$PATH:I   - searches the directories listed in the PATH
               environment variable and expands %I to the
               fully qualified name of the first one found.
               If the environment variable name is not
               defined or the file is not found by the
               search, then this modifier expands to the
               empty string

The modifiers can be combined to get compound results:

%~dpI       - expands %I to a drive letter and path only
%~nxI       - expands %I to a file name and extension only
%~fsI       - expands %I to a full path name with short names only
%~dp$PATH:I - searches the directories listed in the PATH
               environment variable for %I and expands to the
               drive letter and path of the first one found.
%~ftzaI     - expands %I to a DIR like output line

6
ฉันพบอุปสรรคเล็กน้อยโดยใช้สิ่งนี้: ไฟล์ที่มีช่องว่างในชื่อไฟล์ไม่ได้ลงทะเบียนอย่างถูกต้อง ในการแก้ไขปัญหานี้ฉันได้เพิ่มสิ่ง"tokens=*"ต่อไปนี้@echo off & for /f "tokens=*" %a in ('dir /s /b') do echo %~fa %~za
ดอนวินซ์

จะพิมพ์ไปยังtxtไฟล์ได้อย่างไร?
Saeed Neamati

3
มันควรจะเป็นfor /r %a in (*) do echo %~fa %~za
ZAB

1
@Saeed Neamati - นี่คือตัวอย่าง>> C:\Temp\VideoList.txt- ผลของกระบวนการสิ่งที่ได้มาก่อนที่จะเขียนออกมาเป็นไฟล์ข้อความชื่อVideoList การใช้หนึ่ง>จะเขียนทับไฟล์ ( หากมีอยู่แล้ว ) และการใช้>>จะผนวกผลลัพธ์ใหม่เข้าท้ายถ้าไฟล์ข้อความ ( ถ้ามีอยู่แล้ว ) หากไฟล์ข้อความยังไม่มีอยู่คำสั่งนี้จะเขียนไฟล์ใหม่ด้วยชื่อที่ระบุ
23715

นี้ให้ฉันรายชื่อของไฟล์ .dwg * ซองไฟล์ขนาดไฟล์ข้อความ:@echo off & for /f "tokens=*" %a in ('dir *.dwg /s /b') do echo %~fa >>dwgfiles.txt
CAD เจ้าหมอ

14

ทางเลือก # 1: FOR / R ใช้งานง่ายกว่า # 2 สำหรับฉัน
ทางเลือก # 2: FOR / F แก้ไขปัญหาด้วย "ช่องว่างในชื่อ" ในข้อเสนอแนะของ BrianAdkins
ทางเลือก # 3: FORFILES จะเป็นตัวเลือกของฉันยกเว้นว่าเส้นทางอยู่ในเครื่องหมายคำพูดคู่

ไบรอันหรือผู้เชี่ยวชาญด้านอื่น ๆ อาจมีวิธีแก้ปัญหาที่หรูหรากว่าหรืออาจจะแนะนำวิธีแก้ปัญหาอื่น ๆ อีกนับสิบ แต่งานทั้งสามนี้ ฉันลองใช้ FOR TOKENS แต่ต้องตัดส่วนหัวและส่วนท้ายดังนั้นฉันจึงเปลี่ยนกลับเป็น # 1 ฉันยังพิจารณาการสร้างไฟล์. bat ขนาดเล็กและเรียกมัน แต่นั่นเป็นการเพิ่มไฟล์อื่น (แม้ว่ามันจะให้ความยืดหยุ่นมากกว่าเช่นเดียวกับฟังก์ชั่น)

ฉันทดสอบทางเลือกทั้งหมดด้วยไดเรกทอรีและชื่อไฟล์ด้วยช่องว่างที่ฝังตัวชื่อไฟล์ที่มีตัวอักษรมากกว่า 200 ตัวชื่อไฟล์ที่ไม่มีส่วนขยายและบนรูทของไดรฟ์ขนาดเล็ก กำลังค้นหาใน Windows Explorer นั่นคือสาเหตุที่ฉันติดตั้งแอพค้นหาทุกอย่าง)

ทางเลือก # 1: FOR / R

ดีที่สุด (?)ในขณะที่พยายามหาสาเหตุว่าทำไมโซลูชันของ Brian ไม่ได้ผลสำหรับฉันฉันมองไปที่ HELP FOR และตัดสินใจลองใช้วิธี / R (การสร้างไฟล์จะเหมือนกับใน Alternative # 2)

@echo off & for /R "c:\deletelater\folder with spaces" %A in (*.*) do echo %~fA %~zA

ตัวอย่าง - การทำงาน (ไดเรกทอรีที่แตกต่างจากด้านบนเพื่อแสดงให้เห็นถึงการเรียกซ้ำ)

@echo off & for /R "c:\deletelater" %A in (*.*) do echo %~fA %~zA
c:\DeleteLater\Name with Spaces.txt 19800676
c:\DeleteLater\NoSpacesLongName.txt 21745440
c:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt 5805492
c:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt 3870322
c:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt 27874695
c:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032

ทางเลือก # 2: FOR / F

BrianAdkins แนะนำ: @echo off & for /f %a in ('dir /s /b') do echo %~fa %~za

คำตอบที่ได้รับการแก้ไขคือ

@echo off & for /f "delims=*" %A in ('dir /s /b') do echo %~fA %~zA 

สมบูรณ์มากขึ้นคำตอบกับไดเรกทอรีปราบปรามและเอาท์พุท (ต่อท้าย) ไปยังแฟ้มคือ:

@echo Results on %DATE% for %CD% >> YourDirFile.txt & echo off & for /f "delims=*" %A in ('dir /s /b /a:-d') do echo %~fA %~zA >> YourDirFile.txt

หมายเหตุ: "delims = *" ระบุอักขระที่ไม่อนุญาตในชื่อไฟล์
หมายเหตุ: คำสั่งที่สองยังไม่แสดงไดเร็กทอรีผ่าน / a: -d
หมายเหตุ: กำหนดชื่อตัวแปรให้เป็นตัวพิมพ์ใหญ่เพื่อจำแนกความแตกต่างระหว่างตัวแปรและพารามิเตอร์ตัวแปรหากมีคนเลือกชื่อตัวแปรที่แตกต่างกัน
หมายเหตุ: ผนวกเข้ากับไฟล์เพียงเพื่อยิ้มเมื่อ OP ขอให้ส่งออกไปยังไฟล์

ฉันคิดว่าฉันควรตรวจสอบสถานะของ ECHO และรีเซ็ตเช่นกัน

ปัญหา - ช่องว่างในชื่อ

โซลูชันที่เสนอโดย Brian ไม่ได้จัดการชื่อไฟล์และโฟลเดอร์ที่มีช่องว่าง (อย่างน้อยไม่ได้อยู่ในการกำหนดค่า Vista ของฉัน)

ตัวอย่าง - ผิด (ไม่มี delims; รวมไดเรกทอรีที่ระงับต่อ OP แต่มีขนาดทั้งก่อนและหลังชื่อไฟล์สำหรับการเน้น)

ชื่อและขนาดที่ถูกตัดทอน (4 จาก 6 ไฟล์ไม่ถูกต้อง):

@echo off & for /f %A in ('dir /s /b /a:-d') do echo %~zA %~fA %~zA
 C:\DeleteLater\Name
21745440 C:\DeleteLater\NoSpacesLongName.txt 21745440
 C:\DeleteLater\Folder
 C:\DeleteLater\Folder
 C:\DeleteLater\FolderNoSpaces\3rd
28726032 C:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032

ตัวอย่าง - ถูกต้อง (บันทึกผลลัพธ์ไปยังหน้าจอไม่ใช่ต่อท้ายไฟล์)

@echo off & for /f "delims=*" %A in ('dir /s /b /a:-d') do echo %~fA %~zA
C:\DeleteLater\Name with Spaces.txt 19800676
C:\DeleteLater\NoSpacesLongName.txt 21745440
C:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt 5805492
C:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt 3870322
C:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt 27874695
C:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032

ทางเลือก # 3: FORFILES (การเสนอราคา)

โซลูชันนี้มาจากตัวอย่างสองตัวอย่างสุดท้ายในเอกสาร FORFILES ( forfiles /?)

FORFILES /S /M *.doc /C "cmd /c echo @fsize"
FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"

การรวมตัวอย่างเหล่านี้และการเขียนไปยังไฟล์ทำให้ได้คำตอบ (เกือบ):

forfiles /s  /c "cmd /c if @isdir==FALSE echo @path @fsize" >>ForfilesOut.txt

โปรดทราบว่าเส้นทางอยู่ในเครื่องหมายคำพูดในผลลัพธ์
ไม่สำคัญว่าจะถูกเปิดใช้งานecho onหรือไม่echo offก็ตาม
การเพิ่มบรรทัดว่างที่แยกแต่ละไดเรกทอรีจะเป็นส่วนขยายเล็กน้อยของ IF

ข้อควรระวัง : การใช้มาสก์/m *.*จะไม่คืนไฟล์ที่ไม่มีนามสกุล (เช่นไฟล์สุดท้ายในตัวอย่าง)!

นอกเหนือ : สิ่งนี้เขียนไฟล์ในแต่ละไดเรกทอรีที่มีเนื้อหาของไดเรกทอรีนั้น:
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt"ไม่ใช่สิ่งที่ OP ต้องการ แต่บางครั้งก็มีประโยชน์

ตัวอย่าง - งาน (แต่มี fullpath ในเครื่องหมายคำพูด)

forfiles /s  /c "cmd /c if @isdir==FALSE echo @path @fsize"

"c:\DeleteLater\Name with Spaces.txt" 19800676
"c:\DeleteLater\NoSpacesLongName.txt" 21745440
"c:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt" 5805492
"c:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt" 3870322
"c:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt" 27874695
"c:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt" 28726032
"c:\DeleteLater\MoreFiles\A really really long file name that goes on and on 123456789 asdfghjkl zxcvnm qwertyuiop and still A really really long file name that goes on and on 123456789 qwertyuiop and still further roughly 225 characters by now.txt" 447
"c:\DeleteLater\MoreFiles\New Text Document no extension" 0

ตัวอย่างนี้รวมถึงไดเรกทอรีพิเศษที่มีชื่อไฟล์ยาวสุดและชื่อไฟล์ที่ไม่มีส่วนขยาย

ปัญหา: เส้นทางในเครื่องหมายคำพูด

ดังนั้นมีวิธีง่าย ๆ ในการลบเครื่องหมายอัญประกาศ (?) ที่ไม่ต้องการต่อตัวอย่าง OP และบันทึก Alternative # 3: FORFILES (คำถามเชิงโวหาร: ราคาเป็นคุณสมบัติหรือข้อบกพร่องหรือไม่)



1
powershell "dir | select name,length"

นี่อาจเป็นการโกงคำถามของ OPs อย่างไรก็ตามคำถามนี้ไม่เกี่ยวข้องกับระบบที่ใช้ Windows ที่ทันสมัยอีกต่อไป นามแฝง Dir ถูกใช้เพื่อช่วยดึงลิงก์โลจิคัล


2
ฉันลองสิ่งนี้ (Windows 7) ใช้เวลานานกว่า 30 วินาทีในการเรียกใช้ (ในไดเรกทอรีที่มี 20 รายการ) และไม่ได้ลงไปในไดเรกทอรีย่อย
สกอตต์

หากต้องการรับการสอบถามซ้ำโปรดเปลี่ยนเป็น: powershell "Get-ChildItem -Recurse| select name,length"
giorgiomugnaini

0

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

ฉันโพสต์คำตอบของฉันเองด้วยเหตุผลสามประการ หนึ่งฉันชอบคำตอบสั้น ๆ สองสคริปต์บรรทัดเดียวนี้ทำงานในการตั้งค่าหลายรายการสำหรับฉันรวมถึงทั่วทั้งเครือข่าย สามต่อความเห็นที่ไม่ชัดเจนของดอนวินซ์ภายใต้คำตอบของ BrianAdkins การใช้โทเค็นสามารถเลี่ยงปัญหาจากชื่อไฟล์ที่มีช่องว่าง

for /f "tokens=*" %%a in ('dir H:\*.mov H:\*.avi H:\*.wmv H:\*.mp4 /s /b') do echo %%~fa %%~za >> C:\Temp\VideoList.txt

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

หน้านี้ss64มีการนำเสนอที่ดีมากเกี่ยวกับการใช้คำสั่งdir การแสดงรายการสวิตช์ทั้งหมดการรวมสวิตช์จำนวนมากและการแสดงตัวอย่างที่เป็นประโยชน์มากมายของไวยากรณ์ที่เหมาะสม มันไม่ครอบคลุมเท่าชุมชน Stack Exchange ที่หลากหลาย แต่มีความชัดเจนที่ชัดเจนในการนำเสนอเมื่อคุณคุ้นเคยกับบรรทัดคำสั่ง / สคริปต์การแบทช์


0

ฉันมาถึงสิ่งนี้ด้วยคำสั่งต่อไปนี้:

(for /R "\path\to\directory\" %A in (*.*) do echo %~fA %~zA) | findstr /v "echo"

ผลลัพธ์:

D:\Users\Natasha>(for /R ".\" %A in (*.*) do echo %~fA %~zA) | findstr /v "echo"


D:\Users\Natasha\Flowers_ (12).jpg 118886

D:\Users\Natasha\SomeFolder\data.txt 1241

D:\Users\Natasha\SomeFolder\CS\Counter-Strike_1.6.exe 272645624

ปล. ขึ้นอยู่กับการตอบกลับโดย BillR (ทางเลือก # 1) @echo offอย่างไรก็ตามในกรณีของฉันมันแฮงค์ด้วย


0

ฉันพบว่าคำสั่ง "du" มีประโยชน์มากและใช้งานได้ทั้งบน Windows และ Unix (ใช้เพื่อตรวจสอบว่าไฟล์ทั้งหมดถูกคัดลอกเมื่อทำการถ่ายโอนข้อมูลจำนวนมากจากพีซี Windows ไปยัง Linux Web Server หรือไม่):

du -ah "C:\your_dir" > "C:\file_list.txt"

เอาท์พุท:

15  C:\your_dir/.htaccess
608 C:\your_dir/folder/hello.txt
1.0 C:\your_dir/folder/subfolder/test.txt
1.0 C:\your_dir/folder/subfolder
1.2M    C:\your_dir/folder/world.txt
1.2M    C:\your_dir/folder
9.0 C:\your_dir/no_file_ending
11  C:\your_dir/sample document 1.txt
684K    C:\your_dir/sample document 2 - äöüßÄÖÜáà.txt
1.9M    C:\your_dir

อย่างไรก็ตามฉันสามารถเห็นอักขระพิเศษใน Notepad อย่างถูกต้องไม่ใช่ใน Notepad ++ (ต้องเป็นสิ่งที่เข้ารหัส ANSI / UTF-8 ไม่ต้องวิเคราะห์เลยในตอนนี้) นอกจากนี้ฉันไม่พบวิธีแก้ปัญหาเพื่อแสดงขนาดหลังชื่อไฟล์ ใช้ตัวเลือก "b" หรือ "k" แทน "h" เพื่อแสดงขนาดเป็นไบต์หรือกิโลไบต์ ฉันมีปัญหาบางอย่างเมื่อเรียกใช้คำสั่งนอกโฟลเดอร์ที่ฉันต้องการวิเคราะห์ ดังนั้นทั้งคู่ควรป้อนคำสั่งในไดเรกทอรีด้านขวา ("C: \ your_dir" ในตัวอย่างนี้) และระบุคำสั่งในคำสั่ง


-1

งดเว้น b ใน dir / b / s / a: -D> results.txt และผลลัพธ์ควรมีลักษณะเช่น (เช่น dir / s / a: -D> results.txt):

ปริมาณในไดรฟ์ H คือไฟล์หมายเลขซีเรียลของโวลุ่มคือ C9EB-112E

ไดเรกทอรีของ H: \ Files

09/29/2014 11:36 PM 0 testing.txt 1 ไฟล์ 0 ไบต์

ไดเรกทอรีของ H: \ Video \ Action \ Comix

10/06/2012 09:51 AM 184,740 file1.txt 07/20/2012 06:21 AM
864,832 file2.txt 08/31/2009 08:47 PM 606,638 file3.txt 08/31/2009 09:07 160,320 file4 .txt


นี่ไม่ใช่คำตอบสำหรับคำถามเดิม มันไม่สร้างเอาต์พุตที่เขา OP ขอ
DavidPostill

-1
where * /t  

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


1
ลองพิจารณาการอัปเดตและการยืนยันคำตอบของคุณใช้งานได้ในขณะที่ฉันลองและได้รับข้อความแสดงข้อผิดพลาดERROR: Invalid syntax. Value expected for '/r'ดังนั้นลองกลับไปที่กระดานวาดรูปและเตรียมไวยากรณ์ที่ถูกต้องและแก้ไขคำตอบของคุณด้วยรายละเอียดที่ถูกต้อง
Pimp Juice IT

พิจารณาป้อนค่า ... / R เป็นสวิตช์ไดเรกทอรีเริ่มต้นไปที่ไดเรกทอรีปัจจุบันถ้าคุณปล่อยมันออก
someguy

“ มันจะให้มากกว่า OP ที่ขอสักหน่อย” คุณล้อเล่นใช่ไหม  where /?กล่าวว่า“โดยค่าเริ่มต้นค้นหาเสร็จพร้อมไดเรกทอรีปัจจุบันและในเส้นทางที่ระบุโดยตัวแปรสภาพแวดล้อมของเส้นทาง ” - ดังนั้นคุณรายการคำสั่งทุกไฟล์ในไดเรกทอรีย่อยของบางส่วนและทุกไดเรกทอรีอื่น ๆ สำหรับฉันนั่นคือมากกว่า 3000 บรรทัด โปรดพิจารณาแก้ไขคำตอบของคุณเพื่อให้สมเหตุสมผล ป.ล. โดยไม่  ได้มันไม่ซ้ำ where * /tC:\Windows\System32C:\Program FilesPATH/R
สกอตต์

WHERE / R *. * ทำงานให้ฉัน / อาร์ บอกว่าจะค้นหาซ้ำจากตำแหน่งที่ระบุ (ในกรณีนี้คือไดเรกทอรีปัจจุบัน) *. * เป็นรูปแบบที่จะจับคู่ ดังนั้น WHERE / R% USERPROFILE% * .docx จะแสดงไฟล์คำทั้งหมดในโฟลเดอร์ของผู้ใช้ (ต้องหลบหนี * ด้วย \ ในความคิดเห็นเหล่านี้)
DHW
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.