Giải pháp thay thế số 1: FOR / R trực quan hơn # 2 đối với tôi.
Giải pháp thay thế số 2: FOR / F khắc phục sự cố với "khoảng trắng trong tên" trong đề xuất của BrianAdkins.
Giải pháp thay thế số 3: FORFILES sẽ là lựa chọn của tôi ngoại trừ đường dẫn nằm trong dấu ngoặc kép.
Brian hoặc các bậc thầy khác có thể có một giải pháp thanh lịch hơn hoặc có thể đề xuất hàng tá giải pháp khác nhưng ba công việc này. Tôi đã thử sử dụng FOR TOKENS nhưng sau đó phải loại bỏ các tiêu đề và chân trang để tôi quay trở lại # 1. Tôi cũng đã xem xét việc tạo một tệp .bat nhỏ và gọi nó nhưng nó thêm một tệp khác (mặc dù nó cung cấp tính linh hoạt cao hơn, như là một chức năng).
Tôi đã thử nghiệm tất cả các lựa chọn thay thế với thư mục và tên tệp với các khoảng trắng được nhúng, tên tệp 200 ký tự, tên tệp không có phần mở rộng và trên thư mục gốc của một ổ đĩa nhỏ (chỉ trong thời gian; hơi chậm - như Brian đã đề xuất - nhưng sau đó thì như vậy đang tìm kiếm trong Windows Explorer, đó là lý do tại sao tôi cài đặt ứng dụng Tìm kiếm mọi thứ).
Phương án số 1: CHO / R
Tốt nhất (?) Trong khi cố gắng tìm ra lý do tại sao giải pháp của Brian không hiệu quả với tôi, tôi đã xem TRỢ GIÚP và quyết định thử phương pháp / R. (Tạo một tệp sẽ giống như trong Phương án số 2.)
@echo off & for /R "c:\deletelater\folder with spaces" %A in (*.*) do echo %~fA %~zA
Ví dụ - Công trình (thư mục khác với ở trên để thể hiện đệ quy)
@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
Phương án số 2: CHO / F
Đề xuất của BrianAdkins: @echo off & for /f %a in ('dir /s /b') do echo %~fa %~za
Một câu trả lời đúng là:
@echo off & for /f "delims=*" %A in ('dir /s /b') do echo %~fA %~zA
Một câu trả lời đầy đủ hơn với các thư mục bị chặn và xuất ra (nối thêm) vào một tệp là:
@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
Lưu ý: "delims = *" chỉ định một ký tự không được phép trong tên tệp.
Lưu ý: Lệnh 2 cũng chặn các thư mục thông qua / a: -d.
Lưu ý: Tạo chữ hoa tên biến FOR để làm rõ sự khác biệt giữa các tham số biến và biến nếu ai đó chọn các tên biến khác nhau.
Lưu ý: Được thêm vào tệp chỉ cho các nụ cười khi OP yêu cầu xuất ra tệp.
Tôi cho rằng tôi thực sự nên kiểm tra trạng thái của ECHO và thiết lập lại nó.
Vấn đề - Dấu cách trong tên
Giải pháp đề xuất của Brian không xử lý tên tệp và thư mục chứa khoảng trắng (ít nhất là không phải trên cấu hình Vista của tôi).
Ví dụ - Sai
(Không có độ trễ; Bao gồm thư mục chặn trên mỗi OP nhưng với kích thước cả trước và sau tên tệp để nhấn mạnh)
Tên và kích thước bị cắt bớt (4 trong số 6 tệp không chính xác):
@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
Ví dụ - Chính xác
(Lưu ý đầu ra ra màn hình, không được thêm vào tệp)
@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
Giải pháp thay thế số 3: FORFILES (Trích dẫn vấn đề)
Giải pháp này trực tiếp từ hai ví dụ cuối cùng trong tài liệu FORFILES ( forfiles /?
).
FORFILES /S /M *.doc /C "cmd /c echo @fsize"
FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"
Kết hợp các ví dụ này và viết vào một tệp mang lại câu trả lời (gần như):
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize" >>ForfilesOut.txt
Lưu ý rằng đường dẫn nằm trong dấu ngoặc kép ở đầu ra.
Không quan trọng là có echo on
hay không echo off
.
Thêm một dòng trống ngăn cách mỗi thư mục sẽ là một phần mở rộng tầm thường của IF.
Thận trọng : Sử dụng mặt nạ/m *.*
sẽ không trả lại các tệp mà không có phần mở rộng (ví dụ như tệp cuối cùng)!
Ngoài ra : Điều này ghi một tệp trong mỗi thư mục có nội dung của thư mục đó:
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt"
Không phải những gì OP muốn nhưng đôi khi tiện dụng.
Ví dụ - Hoạt động (nhưng với fullpath trong dấu ngoặc kép)
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
Ví dụ này bao gồm một thư mục bổ sung có tên tệp siêu dài và tên tệp không có phần mở rộng.
Vấn đề: Đường dẫn trong ngoặc kép
Vì vậy, có một cách dễ dàng để loại bỏ các trích dẫn không mong muốn (?) Trên ví dụ OP và lưu Phương án số 3: FORFILES. (Câu hỏi tu từ: Các trích dẫn là một tính năng hay một lỗ hổng?)
"tokens=*"
như sau@echo off & for /f "tokens=*" %a in ('dir /s /b') do echo %~fa %~za