예전에 한번 klein님께서 질문하셨는데, 오늘 자바 공부하다가 생각이 나서 올려둡니다.

배치파일 작성시 & 기호를 사용하면 명령어를 연결해서 쓸 수 있는데요
예를 들어 지난번 포스팅했던 Differencing VHD에서 항상 깨끗한 VHD로 부팅하기 글을 보면

@echo off
pushd d:\vhd
bcdedit /default {78f20410-b0eb-11df-aa6f-e3d504a75150} & copy clean.vhd child1.vhd
if errorlevel 1 bcdedit /default {78f20411-b0eb-11df-aa6f-e3d504a75150} & copy clean.vhd child2.vhd
exit

저런 예제가 있는데, 원래는 제가 아래 예제처럼 썼다가

@echo off
pushd d:\vhd
bcdedit /default {78f20410-b0eb-11df-aa6f-e3d504a75150}
copy clean.vhd child1.vhd
if errorlevel 1 bcdedit /default {78f20411-b0eb-11df-aa6f-e3d504a75150}
copy clean.vhd child2.vhd
exit

& 기호를 사용하여 3,4번 줄과 5,6번 줄을 묶어둔 것입니다.
그러니까 저 & 기호는 여러개의 명령어를 연속해서 수행할 수 있도록 해줍니다.

그런데 && 기호도 있습니다. && 기호는 & 기호와 어떤 점에서 다를까요?

& 기호는 앞의 명령어가 실행된 다음 결과에 상관없이 뒤의 명령어가 바로 실행됩니다. 하지만 && 기호는 앞의 명령어에서 오류가 없을 경우에만 뒤의 명령어가 실행됩니다. 만약 앞의 명령어에서 오류가 발생하면 뒤의 명령어는 쳐다보지도 않고 다음 줄로 넘어갑니다. 단순히 명령어의 나열을 &로 묶은 경우라면 그냥 &를 사용해도 되겠지만, 위 경우처럼 bcdedit 작업과 copy 작업이 한 셋트로 움직였을 때만 의미있는 경우라면 &&를 사용하는 편이 더 효율적이라 볼 수 있습니다. 실질적으로 뒤의 명령어 한 줄을 더 실행한다고 해서 작업 시간이 0.1초라도 더 느려지는 것은 아니겠지만, 원칙적으로 효율성을 따지자면 그렇다는 말입니다.

따라서 원래의 스크립트 3번 줄의 경우 & 대신에 &&를 적용하고, bcdedit과 copy 작업의 순서를 바꿔주는 쪽이 논리적으로 더 효율적이라 볼 수 있습니다.

@echo off
pushd d:\vhd
copy clean.vhd child1.vhd && bcdedit /default {78f20410-b0eb-11df-aa6f-e3d504a75150}
if errorlevel 1 copy clean.vhd child2.vhd && bcdedit /default {78f20411-b0eb-11df-aa6f-e3d504a75150}
exit

왜냐하면 copy clean.vhd child1.vhd 명령어에서 오류가 발생하면 뒤에 있는 bcdedit 작업은 쳐다보지도 않고 바로 아래 줄로 넘어가기 때문입니다. 아래 줄의 경우 어차피 3번 줄에서 오류가 발생한 경우에만 실행되는 구문이기 때문에 굳이 bcdedit과 copy의 순서를 바꾸거나 &를 &&로 바꿔줄 필요는 없습니다만, 형식을 통일해주면 가독성이 좋아지기 때문에 역시 동일하게 바꿔줬습니다.



사실 위 예제는 저처럼 Diff VHD 자식 2개를 매번 교차로 부팅하는 분들이 아니라면 생소하실 테니, 이해를 쉽게 할 수 있도록 아주 간단한 예제를 들어보겠습니다.

배치파일에서는 변수에 숫자를 대입할 때 C나 자바처럼 해서는 안 됩니다. int a=1; 이런거 없습니다. 굳이 하자면 set /a 구문을 사용할 수 있는데, 아무튼 그냥 명령줄에 a=1 이렇게 입력하면 바로 오류가 발생합니다.

이때

a=1 & b=2

이거랑

a=1 && b=2

이게 어떤 점에서 다를까요?

a=1 & b=2 는 둘다 잘못된 구문이지만 그래도 일단 둘다 실행이 됩니다. 물론 둘다 오류 메시지를 보냅니다.
하지만 a=1 && b=2 의 경우는 앞에서 이미 a=1 이 잘못 되었기 때문에 뒤에 있는 b=2 는 쳐다보지도 않고 그냥 넘어갑니다. 그게 바로 차이점입니다.


위 스샷을 보니 이해가 되시죠?

&&의 경우 앞 명령어에서 오류가 발생하지 않은 경우에만 뒤 명령어도 실행이 된다.

위 한 줄을 설명하기 위해 글을 매우 장황하게 썼습니다.

사족을 붙이자면 이렇습니다. 예를 들어

정수기에 컵을 댄다.
물을 따른다.
마신다.

정수기에 컵을 댄다. & 물을 따른다. & 마신다.
정수기에 컵을 댄다. && 물을 따른다. && 마신다.

위 2가지 명령어 중에는 아래쪽이 더 효율적이라 할 수 있습니다. 예를 들어 컵이 없는 경우 위 문장에선 컵이 없는데도 불구하고 쓸데없이 물도 바닥에 버리고 빈 손으로 마시는 시늉도 해야 하지만, 아래 문장에선 컵이 없으면 뒤에 있는 행동은 하지 않아도 되기 때문입니다.

한마디로 &&의 기능은 if not errorlevel 1 구문의 역할과 동일하다 볼 수 있겠습니다.

별거 아닌 내용 가지고 괜히 길게 써서 죄송합니다. 글은 간단 명료해야 좋은데 말이죠.