Lô Windows: gọi nhiều hơn một lệnh trong vòng lặp FOR?


124

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

@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 vòng lặp FOR khác nhau: một để hiển thị tên và một để xóa tệp, nhưng chỉ có thể thực hiện trong một vòng lặp?

Câu trả lời:


117
FOR /r %%X IN (*) DO (ECHO %%X & DEL %%X)

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

Không nên như vậy &&chứ &?
jww

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

Nếu giải pháp này gây ra lỗi cú pháp cho bạn, hãy kiểm tra xem bạn có bị liệt không bị DOchặn giữa các -parens không. Bạn có thể thoát khỏi chúng bằng cách nối thêm ^chúng vào chúng.
Toàn cảnh

199

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, chuyển sang cú pháp nhiều dòng.

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

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

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


12
Giải pháp này có vẻ 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 rằng dấu ngoặc tròn sau DOKHÔNG phải được đặt dòng tiếp theo nếu không nó sẽ hãm tệp bó. 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.
Marco Demaio

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 (ví dụ: "echo Something gì đó (cái gì khác)" EDIT: ah, xem câu trả lời của bk1e :)
Tim Barrass

31

SilverSkin và Anders đều đúng. Bạn có thể sử dụng dấu ngoặc đơn để thực thi nhiều lệnh. Tuy nhiên, bạn phải đảm bảo rằng các lệnh (và các tham số của chúng) không chứa dấu ngoặc đơn. cmdtham lam tìm kiếm dấu ngoặc đơn đóng đầu tiên, thay vì xử lý các dấu ngoặc đơn lồng nhau 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 thể phân tích cú pháp hoặc nó có thể khiến một số dấu ngoặc đơn được truyền vào các lệnh (ví dụ DEL myfile.txt)).

Một cách giải quyết cho vấn đề 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" 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

3
Mặc dù chúng ta đang ở trong chủ đề,% X không bao giờ đúng khi xử lý tên tệp, luôn sử dụng "% ~ X" (Trong ví dụ của bạn ở đây, bạn có thể thoát khỏi việc sử dụng% * trong chức năng con có thể)
Anders

1
Đó là một điểm thực sự tốt. Một ví dụ điển hình về một con đường thể hiện cả hai vấn đề là C:\Program Files (x86).
bk1e
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.