[batch-file] Windows 배치 파일을 통해 긴 명령을 여러 줄로 분할

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



답변

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

예:

copy file1.txt file2.txt

다음과 같이 작성됩니다 :

copy file1.txt^
 file2.txt


답변

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

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

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

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

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


답변

(이것은 기본적으로 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.)

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

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


답변

여러 명령을 괄호 안에 넣고 여러 줄로 펼칠 수 있습니다. 따라서 다음과 같은 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 ^


답변

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

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

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


답변