예전에 한번 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 구문의 역할과 동일하다 볼 수 있겠습니다.

별거 아닌 내용 가지고 괜히 길게 써서 죄송합니다. 글은 간단 명료해야 좋은데 말이죠.
신고
Share
  1. BlogIcon 아후라
    2010.12.24 01:47 신고

    길게 쓰셔도 상관이 없을 듯 합니다.
    이해가 되도록 충분히 설명해 주시는 것도 좋다고 생각됩니다.

    스누피님때문에 저도 배치파일에 필을 받아서.. 강좌를 준비하고 있습니다.
    아~ 강좌라기 보다는 활용팁에 가까운.. 실용 예제 정도를 생각하고 있습니다. (스케쥴 백업, 무인 설치 등.)

    강좌를 준비하다 아주 좋은 소식이..
    예전 부터 쓰던 bat to exe가 버전업이 되어서 이제 더이상 바이러스로 오진하질 않더라구요.
    프로그램 자체는 물론이고, 컴파일된 파일도 오진하지 않더군요.
    ( 얼마전에 여기서도 본 것 같은데..이미 아시고 계신가요? ^^)

    file "include" 기능과 함께 사용하니 무적이 되겠더라는.. ^^
    좋은 글 잘 읽었습니다.

    • BlogIcon snpbox
      2010.12.24 08:52 신고
      수정 및 삭제

      그거 백신도 업데이트 되면 또 오진하는거 아닐까요? ㅎㅎ 사실 배치파일 안에 무슨 내용이 들어있었던건지 백신 입장에선 모르니 바이러스라 오진하는게 당연해 보이기도 합니다. ㅡ,.ㅡ

  2. BlogIcon andu
    2010.12.24 02:56 신고

    다음에는 |와 ||의 차이점을 설명하셔야겠군요 ㅋㅋ

    아니, 예시에서 조금 난감함이 있다면 제가 넘겨받아 쓰는것도 괜찮겠군요 'ㅂ'

    • BlogIcon snpbox
      2010.12.24 08:55 신고
      수정 및 삭제

      아래 분 링크에 잘 설명되어 있네요.

      || 는 선행 명령어에서 오류가 발생한 경우에만 후행 명령어가 실행된다.

      적절한 예시는 andu님께서 ㅎㅎ

  3. BlogIcon sMiLo
    2010.12.24 08:43 신고

    저도 궁금해서 레퍼런스를 찾아보니 이런게 있네요. ^^
    http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/ntcmds_shelloverview.mspx?mfr=true

  4. BlogIcon pavlomanager
    2010.12.24 17:06 신고

    스누피박스님 안녕하세요 ^^

    즐거운 성탄절 보내시라고 인사왔습니다~

    행복한 크리스마스 되세요~

  5. BlogIcon hongyang
    2010.12.24 22:29 신고

    저도 VHD 해버릴까요? 최대 절전 모드는 필요 없고 난 디스크 이름은 원래 하드나 그거나 이름 뽀대 나지도 않고 체험 지수가 2.0이어서 충격 먹은 적 있으므로.. 그런데 Differencing VHD할까요? Differencing VHD의 단점은 없는 것 같은데.... 레지 같은 것 가끔 가다 만질 것인데.. 그냥 할까요? 말까요?

    • BlogIcon hongyang
      2010.12.24 22:32 신고
      수정 및 삭제

      그리고 업데이트 설치파일은 어디에 다운받아지고 어디에 깔리고 또 임시 폴더 같은 것 있으면 말해주세요.

  6. BlogIcon 용한
    2010.12.24 22:40 신고

    DOS 이거 유닉스를 배낀거니까요.
    리눅스에서도 && 하면 앞에 있는거 실패 하면 뒤로 안넘어가죠.

  7. 아이러브
    2010.12.25 01:22 신고

    좋은 정보 감사합니다. 크리스마스 선물이네요. ^^

    메리 크리스마스 ~~!

  8. BlogIcon starbros
    2010.12.25 10:46 신고

    원래 c언어에 기초한 문법입니다.^^ 물론 자바도 마찬가지구요.
    언어를 이해하고 계시면 처음 접하시는 배치화일이라도 금방 이해가 가실 껍니다.

    • sig
      2010.12.25 13:33 신고
      수정 및 삭제

      C나 JAVA에서 논리 연산자를 저런식으로 쓸수도 있겠군요....
      물론 가독성이 떨어지겠지만 코드를 줄일수는 있겠군요


  9. 2010.12.25 11:10

    비밀댓글입니다

  10. BlogIcon Castar.NET
    2010.12.25 19:48 신고

    computerblog.wo.tc/
    제 블로그 입니다.
    많이 놀러와 주세요.

    • BlogIcon hongyang
      2010.12.25 20:52 신고
      수정 및 삭제

      저와 같은 새내기 블로그네요.ㅎㅎㅎ 꾸준히 노력해야 합니다. 아주 가끔 아주 파격적인 글을 써야 합니다. 자주 놀러갈께요~.안 그러면 제 블로그처럼 됩니다. 흑흑


  11. 2010.12.25 20:22

    비밀댓글입니다