2010-02-12 39 views
90

Có thể trong tập tin batch của Windows để gọi nhiều hơn một lệnh trong một đơnFOR vòng lặp? Hãy nói rằng ví dụ tôi muốn in tên tập tin và sau khi xóa nó:Lô Windows: gọi nhiều lệnh trong vòng lặp FOR?

@ECHO OFF 
FOR /r %%X IN (*.txt) DO (ECHO %%X DEL %%X) 
REM the line above is invalid syntax. 

Tôi biết trong trường hợp này tôi có thể giải quyết nó bằng cách thực hiện hai biệt CHO vòng: một cho thấy tên và một cho xóa các tập tin nhưng chỉ có thể thực hiện nó trong một vòng lặp?

Trả lời

85
FOR /r %%X IN (*) DO (ECHO %%X & DEL %%X) 
+1

Thực ra, tôi nghĩ các dấu ngoặc đơn là không cần thiết. 'cho% i in (1 2 3) làm echo% i & echo foo' in những gì tôi mong đợi:" 1 "," foo "," 2 "," foo "," 3 "," foo "(bật các dòng riêng biệt). – bk1e

+0

Không nên là '&&' thay vì '&'? – jww

+6

@jww '&&' sẽ thất bại nếu lệnh đầu tiên thất bại, '&' sẽ thực hiện lệnh thứ hai bất kể. – YoYoYonnY

156

Sử dụng & là tốt cho các lệnh ngắn, nhưng dòng đơn đó có thể rất dài rất nhanh. Khi điều đó xảy ra, hãy chuyển sang cú pháp nhiều dòng.

FOR /r %%X IN (*.txt) DO (
    ECHO %%X 
    DEL %%X 
) 

Vị trí của () vấn đề. Các dấu ngoặc tròn sau DO phải được đặt trên cùng một dòng, nếu không tệp lô sẽ không chính xác.

Xem if /?|find /V "" để biết chi tiết.

+11

Giải pháp này trông sạch sẽ và dễ đọc. Tôi cũng sẽ cảnh báo bất kỳ lập trình viên nào sử dụng giải pháp này mà khung tròn sau khi 'DO' KHÔNG được đặt ở dòng tiếp theo nếu không nó sẽ phanh tập tin thực thi. Trong mã khi tôi viết một vòng lặp for, tôi thường đặt dấu ngoặc nhọn '{' dòng tiếp theo. –

+2

Ngoài ra - hãy cảnh giác nếu bất kỳ lệnh lồng nhau nào của bạn có dấu ngoặc đơn (ví dụ: "echo Something something (something else)" EDIT: ah, xem câu trả lời của bk1e :) –

27

SilverSkin và Anders đều chính xác. Bạn có thể sử dụng dấu ngoặc đơn để thực hiện nhiều lệnh. Tuy nhiên, bạn phải đảm bảo rằng các lệnh của chính chúng (và các tham số của chúng) không chứa các dấu ngoặc đơn. cmd tham lam tìm kiếm dấu ngoặc đơn đóng đầu tiên, thay vì xử lý các tập hợp dấu ngoặc đơn một cách duyên dáng. Điều này có thể khiến phần còn lại của dòng lệnh không phân tích cú pháp hoặc có thể khiến một số dấu ngoặc đơn được chuyển đến các lệnh (ví dụ: DEL myfile.txt)).

Giải pháp cho việc này là chia phần thân của vòng lặp thành một hàm riêng biệt. Lưu ý rằng bạn có thể cần phải nhảy xung quanh cơ thể chức năng để tránh "rơi xuống" vào nó.

FOR /r %%X IN (*.txt) DO CALL :loopbody %%X 
REM Don't "fall through" to :loopbody. 
GOTO :EOF 

:loopbody 
ECHO %1 
DEL %1 
GOTO :EOF 
+1

Trong khi chúng ta có chủ đề,% X là không bao giờ đúng khi giao dịch với tên tập tin, luôn luôn sử dụng "% ~ X" (Trong ví dụ của bạn ở đây, bạn có thể lấy đi bằng cách sử dụng% * trong subfunction có lẽ) – Anders

+1

Đó là một điểm thực sự tốt. Một ví dụ điển hình về đường dẫn chứng minh cả hai vấn đề là 'C: \ Program Files (x86)'. – bk1e

Các vấn đề liên quan