Alternatif # 1: FOR / R benim için # 2'den daha sezgisel.
Alternatif # 2: FOR / F BrianAdkins'in önerisindeki sorunu "isimlerdeki boşluklar" ile düzeltir.
Alternatif # 3: FORFILES, yolun çift tırnak içinde olması dışında benim seçimim olur.
Brian veya diğer gurular daha zarif bir çözüme sahip olabilir veya bu üç iş dışında bir düzine başka çözüm önerebilirler. FOR TOENS kullanmaya çalıştım ancak daha sonra başlıkları ve altlıkları şeritlemek zorunda kaldım. Ayrıca küçük bir .bat dosyası oluşturmayı ve onu çağırmayı da düşündüm, ancak bu başka bir dosya ekliyor (bir işlevde olduğu gibi daha fazla esneklik sağlamasına rağmen).
Tüm alternatifleri gömülü boşluklara sahip dizin ve dosya isimleri, 200+ karakterli dosya adı, uzantısız dosya adı ve küçük bir sürücünün kökü üzerinde test ettim (sadece zaman için; biraz yavaş - tıpkı Brian'ın önerdiği gibi) - ama sonra Windows Gezgini'nde arama yapıyor, bu yüzden her şeyi arama uygulamasını yükledim).
Alternatif # 1: FOR / R
En iyisi (?) Brian'ın çözümünün neden benim için işe yaramadığını anlamaya çalışırken YARDIM FORMU'na baktım ve / R yaklaşımını denemeye karar verdim. (Bir dosya oluşturmak Alternatif # 2 ile aynı olacaktır.)
@echo off & for /R "c:\deletelater\folder with spaces" %A in (*.*) do echo %~fA %~zA
Örnek - İşler (yinelemeyi göstermek için yukarıdakinden farklı bir dizin)
@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: FOR / F
BrianAdkins'in önerdiği: @echo off & for /f %a in ('dir /s /b') do echo %~fa %~za
Bir düzeltilmiş cevap geçerli:
@echo off & for /f "delims=*" %A in ('dir /s /b') do echo %~fA %~zA
Bir daha eksiksiz dizinleri ile cevap bastırılmış ve bir dosyaya çıkışı (eklenen) 'dir:
@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
Not: "delims = *", dosya adlarında izin verilmeyen bir karakter belirtir.
Not: 2nd komutu ayrıca / a: -d ile dizinleri de gizler.
Not: Birisi farklı değişken isimleri seçerse, değişken ve değişken parametreleri arasındaki farkı açıklığa kavuşturmak için FOR değişken ismi büyük harfle yapılır.
Not: OP bir dosyanın çıktısını istediği için sırıtış için dosyaya eklenir.
Sanırım gerçekten ECHO'nun durumunu kontrol etmeli ve aynı zamanda sıfırlamalıyım.
Sayı - İsimlerdeki Uzaylar
Brian'ın önerdiği çözüm, boşluk içeren dosya ve klasör adlarını işlemez (en azından Vista yapılandırmamda değil).
Örnek - Yanlış
(Kesintisiz; OP başına dizinin bastırılmasını içerir ancak vurgu için hem dosya adından önce ve sonra hem de boyutta)
Kesilmiş Ad ve Boyut (6 dosyadan 4'ü yanlış):
@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
Örnek - Doğru
(Ekrana not çıkışı, dosyaya eklenmemiş)
@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: FORFİLLER (Alıntı Sayı)
Bu çözüm, FORFILES belgesindeki ( forfiles /?
) son iki örnekten doğrudan sonuç almaktadır .
FORFILES /S /M *.doc /C "cmd /c echo @fsize"
FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"
Bu örnekleri birleştirmek ve bir dosyaya yazmak cevap verir (neredeyse):
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize" >>ForfilesOut.txt
Yolun çıktıda tırnak içinde olduğunu unutmayın.
Farketmez echo on
ya echo off
konum değiştirir.
Her dizini ayıran boş bir satır eklemek, IF'nin önemsiz bir uzantısı olacaktır.
Dikkat : Maskeyi kullanmak,/m *.*
uzantı olmadan dosyaları döndürmez (örn. Son dosya gibi)!
Bir yana : Bu, her dizine sadece bu dizinin içeriğini içeren bir dosya yazar:
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt"
OP'nin istediği şeyi değil, bazen kullanışlı.
Örnek - Çalışır (ancak tırnak içinde tam yolla)
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
Bu örnek, çok uzun bir dosya adı olan bir dosya dizini ve uzantısız bir dosya adı içerir.
Sorun: Tırnaklardaki Yol
Öyleyse, OP örneği başına istenmeyen (?) Tırnak işaretlerini kaldırmanın ve Alternatif # 3: FORFILES'i kaydetmenin kolay bir yolu var mı? (Retorik soru: Alıntılar bir özellik mi, bir kusur mu?)
"tokens=*"
şöyle bir ekledim@echo off & for /f "tokens=*" %a in ('dir /s /b') do echo %~fa %~za