배치 파일을 실행하다 보면 그 배치 파일의 실행 모습(명령 프롬프트 창의 모습)을 숨기고 싶을 때가 있습니다. 예를 들어 배치 파일을 시작 프로그램이나 작업 스케줄러에 등록하면 매번 윈도우 부팅 때마다 해당 배치 파일이 실행되는 모습을 지켜봐야 하죠. 잠깐이지만 은근히 이런 게 신경이 거슬릴 때가 있습니다.
그럴 땐 VBScript 를 통해 배치 파일의 실행 모습을 숨겨줄 수 있습니다. 바로 아래의 간단한 VBScript 를 통해서 말이죠.
Example.vbs
Set WinScriptHost = CreateObject( "WScript.shell" )
WinScriptHost.Run Chr(34) & "C:\Batch.cmd" & Chr(34), 0
Set WinScriptHost = Nothing
WinScriptHost.Run Chr(34) & "C:\Batch.cmd" & Chr(34), 0
Set WinScriptHost = Nothing
위의 스크립트는 간단하게 VBScript 를 통해 원하는 배치 파일을 실행하는 구조입니다. 즉, 먼저 원하는 배치 파일을 준비한 후, 빨간색으로 표시한 부분에 실행할 배치 파일의 경로를 넣으셔서 VBS 파일을 만들고, 이렇게 만든 VBS 파일을 실행하면 최종적으로 배치 파일이 화면 출력 없이 숨겨진 채로 실행이 되는 겁니다. 간단하죠? 이 때 위의 VBS 파일에 넣게 될 배치 파일의 경로는 절대 경로는 물론 상대 경로, 시스템 변수 경로도 사용할 수 있습니다.
굉장히 간단하죠? 이거 제가 배치 파일로 제작하는 도구들을 만들 때 꽤나 자주 사용하는 스크립트인데요. 요새 어디에 정리해놨는지 자꾸 까먹어서 나중에 필요할 때마다 간편하게 사용할 겸 해서 으슥한 밤을 틈타 포스팅으로 남겨 둡니다. 이상입니다. ^^;;
참고로 이 때 스크립트에서 Chr(34) 는 "(큰 따옴표)를 의미합니다. 이게 왜 필요하냐면, VBScript 에서 "" 는 비주얼 베이직에서와 마찬가지로 그 안의 내용이 문자열임을 의미합니다. 즉, "C:\Batch.cmd" 는 C:\Batch.cmd 로 인식이 되는 것이죠. 그런데 이게 경로에 띄어쓰기가 존재하는 경우에는 결과적으로 Run 함수에 전체 경로가 정확하게 전달되지 못하는 문제가 있습니다.
배치 파일이든 뭐든 경로에 띄어쓰기가 존재하면 경로 전체를 "경로" 와 같이 큰 따옴표로 묶어줘야 합니다. 하지만 큰 따옴표는 VBScript 에서 예약되어 사용되는 특수 문자이기 때문에 별개로 큰 따옴표라는 특수 문자 자체를 전달하고자 할 때는 Chr(34) 를 사용하는 것이죠. 이러한 Chr(34) 큰 따옴표를 문자열 연결을 의미하는 & 연산자를 통해 전체 경로와 결합시키는 겁니다. 그래서 Chr(34) & "배치 파일 경로" & Chr(34) 는 최종적으로 "배치 파일 경로" 로 전달되는 겁니다.
그리고 그 뒤의 0 은 부울값으로 이 스크립트의 핵심이 되는 부분입니다. 이는 배치 파일의 실행 결과를 백그라운드로 실행하여 출력시키지 않는다는 의미이죠.(vbHide) 이게 1 이면 배치 파일의 실행 모습이 화면에 출력됩니다.(vbNormalFocus)
제가 아는 건 딱 여기까지입니다. 이에 대해 자세하게 질문을 하시면 저는 먼 산을 바라볼 밖에 없습니다. 프로그래밍에 관련된 제 지식은 상당히 난잡합니다. ㅎㅎㅎ
배치 파일이든 뭐든 경로에 띄어쓰기가 존재하면 경로 전체를 "경로" 와 같이 큰 따옴표로 묶어줘야 합니다. 하지만 큰 따옴표는 VBScript 에서 예약되어 사용되는 특수 문자이기 때문에 별개로 큰 따옴표라는 특수 문자 자체를 전달하고자 할 때는 Chr(34) 를 사용하는 것이죠. 이러한 Chr(34) 큰 따옴표를 문자열 연결을 의미하는 & 연산자를 통해 전체 경로와 결합시키는 겁니다. 그래서 Chr(34) & "배치 파일 경로" & Chr(34) 는 최종적으로 "배치 파일 경로" 로 전달되는 겁니다.
그리고 그 뒤의 0 은 부울값으로 이 스크립트의 핵심이 되는 부분입니다. 이는 배치 파일의 실행 결과를 백그라운드로 실행하여 출력시키지 않는다는 의미이죠.(vbHide) 이게 1 이면 배치 파일의 실행 모습이 화면에 출력됩니다.(vbNormalFocus)
제가 아는 건 딱 여기까지입니다. 이에 대해 자세하게 질문을 하시면 저는 먼 산을 바라볼 밖에 없습니다. 프로그래밍에 관련된 제 지식은 상당히 난잡합니다. ㅎㅎㅎ