ทางเลือก # 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 (คำถามเชิงโวหาร: ราคาเป็นคุณสมบัติหรือข้อบกพร่องหรือไม่)
"tokens=*"
ต่อไปนี้@echo off & for /f "tokens=*" %a in ('dir /s /b') do echo %~fa %~za