it-swarm-ko.com

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

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

634
Dan

캐럿과 그 뒤에 나오는 개행 문자가 완전히 제거되었다는 것을 기억하는 한 ^ 캐럿으로 긴 행을 분리 할 수 ​​있습니다. 따라서 줄을 끊을 공간이 있으면 공간을 넣으십시오. ( 아래 그 이상 )

예:

copy file1.txt file2.txt

다음과 같이 쓰여질 것입니다 :

copy file1.txt^
 file2.txt
795
Wayne

캐럿에 대한 규칙은 다음과 같습니다.

줄 끝의 캐럿이 다음 줄을 추가하면 추가 된 줄의 첫 번째 문자가 이스케이프됩니다.

캐럿은 여러 번 사용할 수 있지만 전체 줄은 최대 줄 길이 ~ 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

빈 줄은 성공을 위해 중요합니다. 이는 지연된 확장에서만 작동하며, 그렇지 않으면 줄 바꿈 후에 나머지 줄이 무시됩니다.

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

239
jeb

(이것은 기본적으로 웨인의 답변 을 재 작성한 것이지만 캐럿 주위의 혼란이 해결되었으므로 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^ 사이에 공백이없고 다음 줄의 시작 부분에 공백이 없기 때문입니다. 따라서 ^ 및 개행을 제거하면 get ...xcopy.)

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

의 주요 문제인 것처럼 보이기 때문에 ^가 배치 파일의 마지막 항목이 아닌 인지 확인하십시오. .

64
T.J. Crowder

괄호 안에 여러 명령을 넣을 수 있으며 여러 줄로 분산시킬 수 있습니다. 그래서 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 조건문이 공백이있는 경우에만 따라야한다는 carets (^)를 발견했습니다.

if exist ^
13
Todd Partridge

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

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

안녕하세요 또는 안녕히 가십시오 전에 공간이 필요하지 않습니다.

8
Mohammed Safwat