Cara melakukan sesuatu untuk setiap file dalam direktori dengan skrip batch

265

Bagaimana Anda mengulangi setiap file dalam direktori dengan file .bat atau .cmd?

Untuk mempermudah, berikan jawaban yang hanya menyuarakan nama file atau path file.

Brian R. Bondy
sumber

Jawaban:

348

Penggunaan baris perintah:

for /f %f in ('dir /b c:\') do echo %f

Penggunaan file batch:

for /f %%f in ('dir /b c:\') do echo %%f

Pembaruan : jika direktori berisi file dengan ruang dalam nama, Anda perlu mengubah pembatas yang digunakan for /fperintah. misalnya, Anda bisa menggunakan pipa char.

for /f "delims=|" %%f in ('dir /b c:\') do echo %%f

Pembaruan 2 : (cepat satu setengah tahun setelah jawaban asli :-)) Jika nama direktori itu sendiri memiliki ruang dalam nama, Anda dapat menggunakan usebackqopsi pada for:

for /f "usebackq delims=|" %%f in (`dir /b "c:\program files"`) do echo %%f

Dan jika Anda perlu menggunakan pengalihan output atau pemipaan perintah, gunakan karakter escape ( ^):

for /f "usebackq delims=|" %%f in (`dir /b "c:\program files" ^| findstr /i microsoft`) do echo %%f
Franci Penov
sumber
3
Setidaknya untuk beberapa perintah, variabel file harus dilampirkan dalam tanda kutip ganda.
Jirka
1
Mengapa yang /fdibutuhkan setelah itu for? Menurut dokumen bantuan, /fbendera terbuka dan membaca setiap file. Apakah itu perlu dilakukan gema atau ganti nama file?
Snekse
17
The /fsetelah FORmembatasi ke file. Demikian pula, /dmembatasi ke direktori (folder) dan /rmemerintahkannya untuk bersifat rekursif.
3
+1 Ini adalah jawaban yang hidup, terus diperhatikan; terimakasih banyak.
Sabuncu
4
Baru sadar Anda harus menggunakan kembali kutipan ... Alih-alih 'dir /b "c:\program files"'seharusnya`dir /b "c:\program files"`
endavid
101

Atau, gunakan:

forfiles /s /m *.png /c "cmd /c echo @path"

Perintah forfiles tersedia di Windows Vista dan yang lebih tinggi.

Paul Houx
sumber
1
sulit menggunakan jalur dengan spasi di shell cmd ke-2. Pada akhirnya saya menyesuaikan% PATH% env var untuk menyelesaikan pekerjaan. Tapi terima kasih. membantu
twobob
70

Metode termudah:

Dari Command Line, gunakan:

for %f in (*.*) do echo %f

Dari File Batch (gandakan tanda% persen):

for %%f in (*.*) do echo %%f

Dari File Batch dengan folder yang ditentukan sebagai parameter 1:

for %%f in (%1\*.*) do echo %%f
Gordon Bell
sumber
8
tidak hanya termudah, tetapi juga secara signifikan lebih elegan dibandingkan dengan mengevaluasi dir /Boutput dengan for.
syneticon-dj
5
Tambahkan a / r sebelum% f untuk
mengulangi
35

Menggunakan

for /r path %%var in (*.*) do some_command %%var

dengan:

  • jalur menjadi jalur awal.
  • %% var menjadi pengenal.
  • *. * menjadi filemask ATAU isi variabel.
  • some_command menjadi perintah untuk dieksekusi dengan path dan var digabung sebagai parameter.
mstrobl
sumber
2
Saya mendapatkan kesalahan: %%var was unexpected at this time.Bisakah Anda memberikan contoh yang tepat? Saya mencoba banyak variasifor /r . %%var in (*.*) do echo %%var
hippietrail
3
Untuk beberapa alasan aneh, nama variabel dibatasi untuk satu karakter.
ollb
2
Bisakah kita menggunakan smiley yang berbeda untuk hasil yang berbeda?
Silver Quettier
8

Cara lain:

for %f in (*.mp4) do call ffmpeg -i "%~f" -vcodec copy -acodec copy "%~nf.avi"
ini tidak
sumber
apa artinya "~ nf"?
pemain0
@ JudgeDredd "%~nf"adalah singkatan dari nama file tanpa ekstensi, di mana fnama variabel yang ditentukan di forbagian. Docs: docs.microsoft.com/en-us/previous-versions/windows/it-pro/…
Alph.Dev
-1

Saya memiliki beberapa malware yang menandai semua file dalam direktori sebagai hidden / system / readonly. Jika orang lain menemukan diri mereka dalam situasi ini, masuk ke direktori dan jalankan for /f "delims=|" %f in ('forfiles') do attrib -s -h -r %f.

Segera
sumber