2010-02-12 3 views
90

Windows 배치 파일에서 FOR 루프에서 하나 이상의 명령을 호출 할 수 있습니까? 파일을 삭제하기위한 하나의 이름을 표시하기위한 하나 : 나는 루프에 대한 서로 다른 두 가지를 수행하여이를 해결할 수있는 나는,이 경우 알고Windows 배치 : FOR 루프에서 둘 이상의 명령을 호출합니까?

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

을 : 나는 그것을 삭제 후 파일 이름을 인쇄 할의 예를 들어 가정 해 봅시다 , 하나의 루프에서만 가능합니까?

답변

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

실제로 괄호가 필요하지 않습니다. ''% 1에 대해 % 1을 (를) echo'% echo i & echo foo'는 "1", "foo", "2", "foo", "3", "foo" 별도의 줄). – bk1e

+0

'&'보다는'&&'이 될까요? – jww

+6

첫 번째 명령이 실패하면 @jww'&&'가 실패하고,'&'는 두 번째 명령을 상관없이 실행합니다. – YoYoYonnY

156

&를 사용하면 짧은 명령에 대한 괜찮지 만, 그 한 줄이 매우 긴 매우 빠르게 얻을 수 있습니다. 그런 경우 여러 줄 구문으로 전환하십시오. () 문제의

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

배치. DO 뒤의 둥근 괄호는 같은 줄에 있어야합니다. 그렇지 않으면 배치 파일이 잘못됩니다.

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

+11

이 솔루션은 깨끗하고 읽기 쉽습니다. 나는 또한이 솔루션을 사용하는 프로그래머에게 경고 할 것이고,'DO '다음에 둥근 괄호를 두어서는 안되며, 그렇지 않으면 배치 파일을 제동해야한다. 코드에서 for 루프를 작성할 때 일반적으로 중괄호'{'다음 행을 배치합니다. –

+2

또한 중첩 된 명령 중 하나라도 괄호가있는 경우주의해야합니다 (예 : "뭔가 다른 것"). 편집 : 아, bk1e의 대답 참조 :) –

27

실버 스킨과 앤더스가 모두 정확합니다. 괄호를 사용하여 여러 명령을 실행할 수 있습니다. 그러나 명령 자체와 매개 변수에 괄호가 포함되어 있지 않은지 확인해야합니다. 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 
+1

% X는 "% ~ X"를 사용하십시오. (예를 들어 여기에서는 어쩌면 서브 함수에서 % *를 사용할 수 있습니다.) – Anders

+1

그건 정말 좋은 지적입니다. 두 가지 문제를 모두 보여주는 경로의 좋은 예는'C : \ Program Files (x86)'입니다. – bk1e

관련 문제