Saya mencoba untuk menghasilkan file teks yang berisi nama file (termasuk path lengkap) dan ukuran file untuk semua file dalam direktori tertentu dan salah satu sub-direktori (yaitu secara rekursif). Idealnya, saya tidak ingin koma dalam ukuran file (tapi saya akan puas dengan mereka!)
Perintah berikut melakukannya tetapi tanpa ukuran file:
dir /b /s /a:-D > results.txt
Contoh output akan terlihat seperti:
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
Saya tidak berpikir ini mungkin menggunakan dir
sendirian, meskipun saya ingin terbukti salah. Apakah ada cara lain untuk melakukan ini, hanya menggunakan perintah yang tersedia dari Command Prompt?
sumber
"tokens=*"
sebagai berikut@echo off & for /f "tokens=*" %a in ('dir /s /b') do echo %~fa %~za
txt
file?for /r %a in (*) do echo %~fa %~za
>> C:\Temp\VideoList.txt
- Hasil dari proses apa pun yang datang sebelumnya dituliskan ke file teks bernama VideoList . Menggunakan satu > akan menimpa file ( jika sudah ada ) dan menggunakan >> akan menambahkan hasil baru pada akhirnya jika file teks ( jika sudah ada ). Jika file teks belum ada, perintah ini menulis file baru dengan nama yang ditentukan.@echo off & for /f "tokens=*" %a in ('dir *.dwg /s /b') do echo %~fa >>dwgfiles.txt
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.)
Contoh - Bekerja (direktori berbeda dari yang di atas untuk menunjukkan rekursi)
Alternatif # 2: UNTUK / F
BrianAdkins menyarankan:
@echo off & for /f %a in ('dir /s /b') do echo %~fa %~za
Sebuah jawaban yang dikoreksi adalah:
Jawaban yang lebih lengkap dengan direktori yang ditekan dan keluaran (ditambahkan) ke sebuah file adalah:
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):
Contoh - Benar (Catatan keluaran ke layar, tidak ditambahkan ke file)
Alternatif # 3: FORFILES (Masalah Kutipan)
Solusi ini langsung dari dua contoh terakhir dalam dokumentasi FORFILES (
forfiles /?
).Menggabungkan contoh-contoh ini dan menulis ke file menghasilkan jawaban (hampir):
Perhatikan bahwa path dalam tanda kutip di output.
Tidak masalah apakah
echo on
atauecho 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)
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?)
sumber
Saya menyadari ini membutuhkan utlity ekstra , tetapi Anda dapat mencapai ini dengan cukup ringkas menggunakan utilitas sfk :
(Saya mendapat pendekatan menggunakan chaining perintah sfk di sini )
sumber
Ini mungkin curang pada pertanyaan OP. Namun, pertanyaannya tidak lagi relevan pada sistem berbasis Windows modern. Dir alias digunakan untuk membantu menggambar tautan logis.
sumber
powershell "Get-ChildItem -Recurse| select name,length"
Di bawah ini adalah apa yang saya gunakan untuk mencari file video misc yang mengambil terlalu banyak ruang pada drive jaringan dan menulis hasilnya ke file teks pada PC lokal.
Saya memposting jawaban saya yang agak terlambat karena tiga alasan. Satu, saya suka jawaban singkat. Dua, satu baris skrip ini berfungsi dalam banyak pengaturan untuk saya, termasuk lintas jaringan. Tiga, per komentar Don Vince yang berpotensi mengaburkan di bawah jawaban BrianAdkins, menggunakan token dapat mem-bypass masalah dari nama file dengan spasi di dalamnya.
for /f "tokens=*" %%a in ('dir H:\*.mov H:\*.avi H:\*.wmv H:\*.mp4 /s /b') do echo %%~fa %%~za >> C:\Temp\VideoList.txt
Saya perhatikan bahwa path file / nama file yang sangat panjang (ratusan karakter) juga dapat menyebabkan kesalahan tetapi pencarian tidak akan bergantung pada itu. Namun jalur tetap belum sepenuhnya dieksplorasi untuk target Anda. Setelah dicatat, Anda dapat mengkompensasi dengan mulai lebih dalam ke dalam struktur folder untuk menghilangkan kesalahan ini.
Halaman ss64 ini memiliki presentasi yang sangat baik tentang penggunaan perintah dir , daftar semua sakelar, banyak kombinasi sakelar, dan menunjukkan beberapa contoh sintaks yang tepat. Ini tidak komprehensif seperti berbagai komunitas Stack Exchange tetapi ada kejelasan yang pasti dalam presentasi setelah Anda terbiasa dengan skrip baris perintah / batch.
sumber
Saya telah mencapai ini dengan perintah berikut:
Hasil:
PS Ini didasarkan pada balasan oleh BillR (Alternatif # 1). Namun dalam kasus saya hang dengan
@echo off
.sumber
Saya menemukan perintah "du" cukup membantu dan bekerja pada Windows dan Unix (menggunakannya untuk memeriksa apakah semua file disalin ketika mentransfer banyak data dari PC Windows ke Linux Web Server):
output:
Namun, saya hanya dapat dengan benar melihat karakter khusus di Notepad, bukan di Notepad ++ (harus ada beberapa hal Encoding ANSI / UTF-8, tidak ada waktu untuk menganalisis dengan tepat sekarang). Juga saya tidak menemukan solusi untuk menampilkan ukuran setelah nama file. Gunakan opsi "b" atau "k" alih-alih "h" untuk menampilkan ukuran dalam byte atau kilobyte. Saya mengalami beberapa masalah ketika menjalankan perintah di luar folder yang ingin saya analisis. Jadi, sebaiknya masukkan perintah di direktori yang benar ("C: \ your_dir" dalam contoh ini) dan tentukan dalam perintah.
sumber
Hapus b dalam dir / b / s / a: -D> results.txt dan hasilnya akan terlihat seperti, (yaitu dir / s / a: -D> results.txt):
sumber
Tanpa terlalu rumit, ini akan menghasilkan output yang diinginkan. Ini akan memberikan sedikit lebih banyak daripada yang diminta OP, tapi saya pikir itu layak disebut. Tambahkan / R switch untuk menentukan direktori selain saat ini.
sumber
ERROR: Invalid syntax. Value expected for '/r'
sehingga pertimbangkan kembali ke papan gambar dan berikan sintaks yang benar dan edit jawaban Anda dengan detail yang benar.where /?
mengatakan, "Secara default, pencarian dilakukan di sepanjang direktori saat ini dan di jalur yang ditentukan oleh variabel lingkungan PATH . "- jadiwhere * /t
perintah Anda mencantumkan setiap file diC:\Windows\System32
, beberapa subdirektoriC:\Program Files
, dan setiap direktori lainnya diPATH
. Bagi saya, itu lebih dari 3000 baris. Harap pertimbangkan untuk mengedit jawaban Anda agar masuk akal. PS Tanpa/R
, itu tidak rekursif.