Windows 배치 : FOR 루프에서 둘 이상의 명령을 호출합니까?


124

Windows 배치 파일에서 단일 FOR 루프 에서 둘 이상의 명령을 호출 할 수 있습니까? 예를 들어 파일 이름을 인쇄하고 삭제 한 후 다음과 같이하겠습니다.

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

이 경우 두 개의 별개의 FOR 루프를 수행하여 해결할 수 있다는 것을 알고 있습니다. 하나는 이름 표시 용이고 다른 하나는 파일 삭제 용이지만 하나의 루프에서만 수행 할 수 있습니까?

답변:


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

2
사실 괄호는 불필요하다고 생각합니다. for %i in (1 2 3) do echo %i & echo foo"1", "foo", "2", "foo", "3", "foo"(별도의 행에)와 같이 내가 예상 한대로 인쇄합니다.
bk1e

그게 &&아니라 야 &?
jww

9
@jww &&는 첫 번째 명령이 실패하면 실패 &하고 두 번째 명령은 상관없이 실행됩니다.
yyny

이 솔루션으로 인해 구문 오류가 발생하면 DO-parens 사이에 이스케이프 처리되지 않은 괄호가 있는지 확인하십시오 . a ^를 추가하여 이스케이프 할 수 있습니다 .
Константин Ван jul.

199

&짧은 명령에는 사용하는 것이 좋지만 한 줄은 매우 빨리 길어질 수 있습니다. 이 경우 여러 줄 구문으로 전환하십시오.

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

배치 ()문제. 뒤의 둥근 괄호 DO는 같은 줄에 있어야합니다. 그렇지 않으면 배치 파일이 올바르지 않습니다.

자세한 내용은 if /?|find /V ""을 참조하십시오.


12
이 솔루션은 깨끗하고 읽기 쉬워 보입니다. 나는 또한이 솔루션을 사용하는 모든 프로그래머에게 DO다음 줄 뒤에 둥근 대괄호를 배치해서는 안된다고 경고 합니다. 그렇지 않으면 배치 파일이 중단 됩니다. for 루프를 작성할 때 코드에서 일반적으로 중괄호를 {다음 줄에 배치합니다 .
Marco Demaio

2
또한-중첩 된 명령에 대괄호가있는 경우주의하십시오 (예 : "echo Something something (다른 것)"편집 : 아, bk1e의 답변 참조 :)
Tim Barrass

31

SilverSkin과 Anders는 모두 맞습니다. 괄호를 사용하여 여러 명령을 실행할 수 있습니다. 그러나 명령 자체 (및 해당 매개 변수)에 괄호가 포함되어 있지 않은지 확인해야합니다. cmd중첩 된 괄호 세트를 정상적으로 처리하는 대신 탐욕스럽게 첫 번째 닫는 괄호를 검색합니다. 이로 인해 나머지 명령 줄이 구문 분석에 실패하거나 일부 괄호가 명령에 전달 될 수 있습니다 (예 :) DEL myfile.txt).

이에 대한 해결 방법은 루프 본문을 별도의 함수로 분할하는 것입니다. 함수 본문에 "넘어가는"것을 방지하기 위해 함수 본문을 건너 뛰어야 할 수도 있습니다.

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
우리가 주제를 다루는 동안, 파일 이름을 다룰 때 % X는 절대 정확하지 않습니다. 항상 "% ~ X"를 사용하십시오 (여기에있는 예에서는 아마도 하위 함수에 % *를 사용하는 것을 피할 수 있습니다)
Anders

1
정말 좋은 지적입니다. 두 가지 문제를 모두 보여주는 경로의 좋은 예는 C:\Program Files (x86).
bk1e
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.