Windows 배치 파일을 통해 긴 명령을 여러 줄로 분할


735

배치 파일에서 긴 명령을 여러 줄로 나누려면 어떻게해야합니까?

답변:


918

^캐럿과 그 다음 줄 바꿈이 완전히 제거되었다는 것을 기억하는 한 캐럿과 긴 줄을 나눌 수 있습니다 . 따라서 줄 바꿈하는 공간이 있으면 공간을 포함하십시오. ( 아래에 더 자세히 설명되어 있습니다. )

예:

copy file1.txt file2.txt

다음과 같이 작성됩니다 :

copy file1.txt^
 file2.txt

95
^명령 텍스트 바로 앞 과 뒤에 공백을 추가하면 공백없이 다음 줄을 시작할 수 있습니다 .
Joseph Daigle

4
@SebaIllingworth-아니요. 언제든지 [SPACE] + [^]와 두 개의 빈 줄을 추가하여 총 2 개의 줄 바꿈을 만들 수 있습니다 echo.
James K

12
안전을 위해 항상 빈 라인으로 종료 캐럿을 사용하는 경우, 참조 배치 파일에서 간단한 캐럿은 모든 메모리 소비
매트 윌키

4
@GavinMiller : "새 줄의 copy 및 file1.txt 후에 캐럿 ^이 작동하지 않습니다" 사실이 아닙니다. 같은 단어 중간을 포함하여 어디에서나 줄을 분할 할 수 있습니다 co^␍py ^␍file1 ^␍file2. 혼란을 피하기 위해 댓글을 삭제하는 것이 좋습니다. 특히이 질문은 매우 인기있는 질문입니다.
Borodin

3
여기서 한 가지 문제는 ^는 줄의 마지막 문자 여야한다는 것입니다. 즉 공백이 없어야합니다. 나는 이것에 문제가 있었고 캐럿 이후에 많은 공간이 있다는 것이 밝혀졌습니다. 사용중인 편집기에서 쉽게 볼 수 없습니다.
GregHNZ

266

캐럿의 규칙은 다음과 같습니다.

줄 끝의 캐럿은 다음 줄을 추가하고 추가 된 줄의 첫 문자는 이스케이프됩니다.

캐럿을 여러 번 사용할 수 있지만 전체 줄은 최대 줄 길이 ~ 8192자를 초과하지 않아야합니다 (Windows XP, Windows Vista 및 Windows 7).

echo Test1
echo one ^
two ^
three ^
four^
*
--- Output ---
Test1
one two three four*

echo Test2
echo one & echo two
--- Output ---
Test2
one
two

echo Test3
echo one & ^
echo two
--- Output ---
Test3
one
two

echo Test4
echo one ^
& echo two
--- Output ---
Test4
one & echo two

다음 문자의 이스케이프를 억제하기 위해 리디렉션을 사용할 수 있습니다.

리디렉션은 캐럿 바로 앞에 있어야합니다. 그러나 캐럿 이전에 리디렉션에 대한 호기심이 있습니다.

캐럿에 토큰을 배치하면 토큰이 제거됩니다.

echo Test5
echo one <nul ^
& echo two
--- Output ---
Test5
one
two


echo Test6
echo one <nul ThisTokenIsLost^
& echo two
--- Output ---
Test6
one
two

또한 줄 바꿈 을 문자열 에 포함시킬 수도 있습니다 .

setlocal EnableDelayedExpansion
set text=This creates ^

a line feed
echo Test7: %text%
echo Test8: !text!
--- Output ---
Test7: This creates
Test8: This creates
a line feed

빈 줄은 성공에 중요합니다. 이것은 확장 확장에서만 작동합니다. 그렇지 않으면 라인 피드 후에 나머지 라인이 무시됩니다.

다음 문자가 줄 바꿈 인 경우에도 줄 끝의 캐럿이 다음 줄 바꿈을 무시하고 다음 문자를 이스케이프하므로 작동합니다 (이 단계에서는 캐리지 리턴이 항상 무시 됨).


줄 바꿈 예제가 포함 된 최종 코드 블록에는 빈 줄이 있지만 표시되지 않습니다. (적어도 IE7에는 표시되지 않습니다) 대신 인용 부호를 사용하여 다시 포맷하십시오.
dbenham

5
문제는 규칙을 따르지 않는 나쁜 도구를 지원해야합니까 (누군가는 브라우저라고하지만 그렇지 않은 경우) 브라우저로 전환해야합니까?
jeb

1
var var = text here ^ "set과 같이 내 값을 큰 따옴표로 묶었지만 작동하지 않습니다. 큰 따옴표를 제거하면 좋습니다.
rjt

1
@jeb, 실패한 cmd 스크립트 예제를 작성했지만 다음 질문을 찾았습니다. stackoverflow.com/questions/4643376/…
rjt

다음 줄이 따옴표로 시작하면 copy ^[newline]"file1.txt" ^[newline]"file2.txt"작동하지 않습니다. 작동하지 않습니다! 공백을 추가해야했습니다 copy ^[newline] "file1.txt" ^[newline] "file2.txt".
Alexander Gelbukh

70

(이것은 기본적으로 Wayne의 답변을 다시 작성 했지만 캐럿 주위의 혼란이 해결되었습니다. 그래서 CW로 게시했습니다. 답변을 편집하는 것이 부끄럽지 않지만 완전히 다시 작성하는 것은 부적절합니다.)

캐럿 ( ^)으로 긴 줄을 나눌 수 있습니다 . 캐럿과 그 뒤의 개행 은 명령에서 완전히 제거 되므로 매개 변수 사이와 같이 공백이 필요한 곳에 두어야합니다. 공백도 포함 시키 ^려면 (다음 줄 앞 이나 다음 줄의 시작 부분에서 후자를 선택하면 계속 명확하게하는 데 도움이됩니다).

예 : (모두 Windows XP 및 Windows 7에서 테스트)

xcopy file1.txt file2.txt

다음과 같이 쓸 수 있습니다 :

xcopy^
 file1.txt^
 file2.txt

또는

xcopy ^
file1.txt ^
file2.txt

또는

xc^
opy ^
file1.txt ^
file2.txt

(마지막 작품이라는 타협 공백이 없기 때문에 xc그리고 ^다음 줄의 시작 부분에서, 그리고 공백이. 그래서 당신은 제거 할 때 ^와 줄 바꿈을, 당신이 얻을 ... xcopy.)

가독성과 안전을 위해 매개 변수 사이에서만 나누는 것이 가장 좋습니다 (공백 포함).

에 큰 문제가있는 것처럼 배치 파일에서 마지막 ^아닌지 확인하십시오 .


18

여러 명령을 괄호 안에 넣고 여러 줄로 펼칠 수 있습니다. 따라서 다음과 같은 echo hi && echo hello것을 넣을 수 있습니다.

( echo hi
  echo hello )

또한 변수가 도움이 될 수 있습니다.

set AFILEPATH="C:\SOME\LONG\PATH\TO\A\FILE"
if exist %AFILEPATH% (
  start "" /b %AFILEPATH% -option C:\PATH\TO\SETTING...
) else (
...

또한 공간이있는 경우에만 조건부에서 따르기를 좋아 ^한다는 캐럿 ( )을 보았습니다 if.

if exist ^

1
cmd1.bat && cmd2.bat은 parens 양식과 다릅니다. execute cmd2.batiff가 cmd1.bat성공적으로 실행됩니다 (설정없이 %errorcode%). 후자의 형식은 무조건 실행됩니다. 예상치 못한 (적어도 나를 위해), 분명히, 당신은 둘 다의 조합을 사용할 수 없다는 것 &&입니다.
Paul Michalik

( echo <line break here> hello )빈 줄이 생깁니다.
Karl Morrison

가장 깨끗한 답변! 캐럿은 정규 표현식에서 추악하고 문제가 있습니다.
신고하십시오.

9

그러나 for 루프 값의 중간에서 분할하면 캐럿이 필요하지 않습니다 (실제로 사용하려고하면 구문 오류로 간주됩니다). 예를 들어

for %n in (hello
bye) do echo %n

안녕하세요 이후 또는 안녕히도 공간이 필요하지 않습니다.


물론 이것은 for구문의 일부입니다. "세트 용"의 요소 구분 기호는 공백, 쉼표, 세미콜론, 등호, Tab 문자 및 줄 바꿈입니다.
Aacini

그러나 do부분에 여러 개의 / 중첩 된 if-else문장이 포함되어 있으면 어떻게 됩니까?
Vicky Dev

그런 다음 단순히 괄호를 사용하여 % n과 같은 문장을 (hello bye) do (echo % n echo % n)로
묶을 수 있습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.