Làm thế nào để làm một cái gì đó cho mỗi tệp trong một thư mục với một tập lệnh bó


265

Làm thế nào để bạn lặp lại qua từng tệp trong một thư mục với tệp .bat hoặc .cmd?

Để đơn giản, vui lòng cung cấp một câu trả lời chỉ lặp lại tên tệp hoặc đường dẫn tệp.

Câu trả lời:


348

Sử dụng dòng lệnh:

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

Sử dụng tập tin hàng loạt:

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

Cập nhật : nếu thư mục chứa các tệp có khoảng trắng trong tên, bạn cần thay đổi dấu phân cách mà for /flệnh đang sử dụng. ví dụ, bạn có thể sử dụng ống char.

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

Cập nhật 2 : (nhanh chóng một năm rưỡi sau câu trả lời ban đầu :-)) Nếu tên thư mục có khoảng trắng trong tên, bạn có thể sử dụng usebackqtùy chọn trên for:

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

Và nếu bạn cần sử dụng chuyển hướng đầu ra hoặc đường ống lệnh, hãy sử dụng esc char ( ^):

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

3
Ít nhất là đối với một số lệnh, biến tệp phải được đặt trong dấu ngoặc kép.
Jirka

1
Tại sao /fcần thiết sau for? Theo các tài liệu trợ giúp, /fcờ mở và đọc từng tệp. Có cần thiết để lặp lại hoặc đổi tên tập tin?
Snekse

17
Sau /fkhi FORgiới hạn nó vào tập tin. Tương tự, /dgiới hạn các thư mục (thư mục) và /rhướng dẫn nó được đệ quy.

3
+1 Đây là một câu trả lời sống động, liên tục tham dự; cảm ơn nhiều.
Sabuncu

4
Chỉ cần nhận ra rằng bạn phải sử dụng các trích dẫn trở lại ... Thay vì 'dir /b "c:\program files"'nó nên được`dir /b "c:\program files"`
endavid

101

Ngoài ra, sử dụng:

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

Lệnh forfiles có sẵn trong Windows Vista trở lên.


1
thật khó khăn khi sử dụng các đường dẫn có khoảng trắng trong vỏ cmd thứ 2. Cuối cùng, tôi đã điều chỉnh% PATH% env var để hoàn thành công việc. Nhưng cảm ơn. hữu ích
Twobob

70

Phương pháp dễ nhất:

Từ dòng lệnh, sử dụng:

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

Từ tệp Batch (tăng gấp đôi dấu% phần trăm):

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

Từ một tệp Batch với thư mục được chỉ định là tham số 1:

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

8
không chỉ dễ nhất, mà còn thanh lịch hơn đáng kể so với việc đánh giá dir /Bđầu ra với for.
syirecton-dj

5
Thêm a / r trước% f để lặp lại các thư mục con
PRMan

35

Sử dụng

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

với:

  • con đường là con đường bắt đầu.
  • %% var là một số định danh.
  • *. * là một filemask HOẶC nội dung của một biến.
  • some_command là lệnh thực thi với đường dẫn và var được nối làm tham số.

2
Tôi nhận được lỗi: %%var was unexpected at this time.Bạn có thể đưa ra một ví dụ chính xác? Tôi đã thử một loạt các biến thể củafor /r . %%var in (*.*) do echo %%var
hà mã

3
Vì một số lý do lạ, tên biến được giới hạn trong một ký tự.
ollb

2
Chúng ta có thể sử dụng các mặt cười khác nhau cho các kết quả khác nhau?
Quettier bạc


-1

Tôi đã có một số phần mềm độc hại đánh dấu tất cả các tệp trong một thư mục là ẩn / system / readonly. Nếu bất cứ ai khác thấy mình trong tình huống này, hãy cd vào thư mục và chạy for /f "delims=|" %f in ('forfiles') do attrib -s -h -r %f.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.