Alternatif # 1: FOR / R lebih intuitif daripada # 2 untuk saya.
Alternatif # 2: FOR / F memperbaiki masalah dengan "spasi dalam nama" dalam saran BrianAdkins.
Alternatif # 3: FORFILES akan menjadi pilihanku kecuali bahwa jalannya berada dalam tanda kutip ganda.
Brian atau guru lain mungkin memiliki solusi yang lebih elegan atau mungkin dapat menyarankan selusin solusi lain tetapi tiga ini berhasil. Saya mencoba menggunakan FOR TOKENS tetapi kemudian harus menghapus header dan footer jadi saya kembali ke # 1. Saya juga mempertimbangkan untuk membuat file .bat kecil dan memanggilnya tetapi itu menambahkan file lain (meskipun itu memberikan fleksibilitas yang lebih besar, seperti fungsi).
Saya menguji semua alternatif dengan direktori dan nama file dengan ruang yang disematkan, nama file 200+ karakter, nama file tanpa ekstensi, dan pada root drive kecil (hanya untuk waktu; agak lambat - seperti yang disarankan Brian - tapi kemudian jadi sedang mencari di Windows Explorer, itu sebabnya saya menginstal aplikasi pencarian Semuanya).
Alternatif # 1: UNTUK / R
Terbaik (?) Ketika mencoba mencari tahu mengapa solusi Brian tidak berhasil bagi saya, saya melihat BANTUAN UNTUK dan memutuskan untuk mencoba pendekatan / R. (Membuat file akan sama dengan di Alternatif # 2.)
@echo off & for /R "c:\deletelater\folder with spaces" %A in (*.*) do echo %~fA %~zA
Contoh - Bekerja (direktori berbeda dari yang di atas untuk menunjukkan rekursi)
@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
Alternatif # 2: UNTUK / F
BrianAdkins menyarankan: @echo off & for /f %a in ('dir /s /b') do echo %~fa %~za
Sebuah jawaban yang dikoreksi adalah:
@echo off & for /f "delims=*" %A in ('dir /s /b') do echo %~fA %~zA
Jawaban yang lebih lengkap dengan direktori yang ditekan dan keluaran (ditambahkan) ke sebuah file adalah:
@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
Catatan: "delims = *" menentukan karakter yang tidak diizinkan dalam nama file.
Catatan: Perintah ke-2 juga menekan direktori melalui / a: -d.
Catatan: Buat huruf besar nama variabel FOR untuk memperjelas perbedaan antara variabel dan parameter variabel jika seseorang memilih nama variabel yang berbeda.
Catatan: Tambahkan ke file hanya untuk senyum ketika OP meminta output ke file.
Saya kira saya harus benar-benar memeriksa status ECHO dan meresetnya juga.
Masalah - Spaces in Names
Solusi yang diajukan Brian tidak menangani nama file dan folder yang berisi spasi (setidaknya tidak pada konfigurasi Vista saya).
Contoh - Salah
(Tanpa batas; Termasuk direktori penekan per OP tetapi dengan ukuran sebelum dan sesudah nama file untuk penekanan)
Nama dan Ukuran Terpotong (4 dari 6 file salah):
@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
Contoh - Benar
(Catatan keluaran ke layar, tidak ditambahkan ke file)
@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
Alternatif # 3: FORFILES (Masalah Kutipan)
Solusi ini langsung dari dua contoh terakhir dalam dokumentasi FORFILES ( forfiles /?
).
FORFILES /S /M *.doc /C "cmd /c echo @fsize"
FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"
Menggabungkan contoh-contoh ini dan menulis ke file menghasilkan jawaban (hampir):
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize" >>ForfilesOut.txt
Perhatikan bahwa path dalam tanda kutip di output.
Tidak masalah apakah echo on
atau echo off
tidak diaktifkan.
Menambahkan baris kosong yang memisahkan setiap direktori akan menjadi ekstensi sepele dari IF.
Perhatian : Menggunakan topeng/m *.*
tidak akan mengembalikan file tanpa ekstensi (seperti file terakhir misalnya)!
Selain itu : Ini menulis file di setiap direktori dengan isi hanya direktori itu:
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt"
Bukan apa yang diinginkan OP tetapi kadang-kadang berguna.
Contoh - Bekerja (tetapi dengan kutipan penuh)
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
Contoh ini termasuk direktori tambahan dengan nama file super panjang dan nama file tanpa ekstensi.
Masalah: Path in Quotes
Jadi, adakah cara mudah untuk menghapus kutipan yang tidak diinginkan (?) Per contoh OP dan menyimpan Alternatif # 3: FORFILES. (Pertanyaan retoris: Apakah kutipan fitur atau cacat?)
"tokens=*"
sebagai berikut@echo off & for /f "tokens=*" %a in ('dir /s /b') do echo %~fa %~za