Visual Studio의 프로젝트를 빌드하고 나서 원하는 cmd 명령 또는 batch 파일을 실행이 필요한 경우에는 Project의 Post Build Event 를 사용할 수 있습니다.
하지만 필자도 batch command에 익숙하지 않아서 간단한 파일 복사정보다 써왔습니다.
batch command 를 작성하는데 유용할 수 있는 내용과 실수가 될 수 있는 부분들을 정리합니다.
기본적으로 cmd 명령어에 대한 참고 사이트가 있습니다.
여기에 기술되지 않은 명령어나 더 자세히 알고 싶은 내용이 있다면 참고하거나 cmd 창에서 help [명령어] 를 해서 확인할 수 있습니다.
참고 : An A-Z Index of Windows CMD commands - SS64.com
1.변수 사용하기
cmd 명령을 수행할 때 중가에 필요한 변수를 설정할 수 있습니다.
SET MYVAR=mystring #문자열
SET /A MYNUM=3 # 숫자
2. 파일 복사
library 프로젝트를 빌드하고 output으로 header 파일을 특정 경로로 복사할 수 있습니다.
"$(변수명)" 는 visual studio 에 정의된 변수 값입니다. Command line에서 macro 버튼을 눌러서 확인할 수 있습니다.
/Y 옵션은 강제복사 설정입니다.
xcopy "$(ProjectDir)*.h" "$(SolutionDir)Include" /Y
3. 조건부 복사
특정 빌드 조건에서만 파일을 복사하고 싶을 때는 if 문으로 조건을 넣을 수 있습니다
*주의점 : 만약에 if 조건문에서 여러 명령들을 수행하고자 할때는 꼭 "()" 중괄호를 사용해야 합니다
그렇지 않을 경우에는 한줄로 작성하여 명령을 수행 할 수 있습니다.
if $(ConfigurationName) == Release (
xcopy "$(ProjectDir)*.h" "$(SolutionDir)Include" /Y)
4. 반복문 사용
특정경로에 있는 파일들에 대해 반복 작업을 수행할 수 있습니다.
%%f 는 변수명입니다.
for %%f in ("$(ProjectDir)*.h") do (
echo "%%f"
)
5. Subroutine 사용
반복문 안에서 외부 함수를 call 하여 작업을 수행하고 다시 복귀하여 계속 진행 할 수 있습니다.
반복문을 수행 할 때에는 goto 명령이 아닌 call 명령을 써야 합니다.
함수의 끝에는 "EXIT /B" 명령을 넣습니다.
for %%f in ("$(ProjectDir)*.h") do (
CALL :do_sub "%%f"
)
:do_sub
ECHO filename is %1
EXIT /B
6. 파일경로에서 파일명 추출 하기
파일의 fullpath 정보가 있을 때 path, name, extension 정보를 추출 할 수 있습니다.
set file="C:\Users\path\to\myfile.h"
FOR %%i IN ("%file%") DO (
ECHO filedrive=%%~di
ECHO dirpath=%%~pi
ECHO filename=%%~ni
ECHO fileextension=%%~xi
)
7. Substring 얻기
문자열에서 특정 문자열만 얻을 수 있습니다. %variable:~startindex,endindex%
위치 값에 - 를 넣으면 뒤에서 시작하는 index값이 됩니다.
for %%f in ("$(ProjectDir)*.h") do (
CALL :do_sub "%%f"
)
:do_sub
SET _fname=%~n1
SET _subname=%_fname:~3%
ECHO %_subname%
EXIT /B
8. 에러처리 및 종료하기
특정조건이나 에러가 발생하였을 때 중간에 cmd를 종료할 수 있습니다.
SET ERRORLEVEL=1
IF %ERRORLEVEL% NEQ 0 GOTO :eof
#주의점#
for 구문 안에서 set variable을 한뒤에 이를 echo를 하면 아래와 같이 "ECHO가 설정되어 있습니다" 라는 문구가 나옵니다. 이것은 variable 설정이 안되었다는 것을 의미합니다.
echo 명령을 넣었지만 출력할 변수나 문자열이 입력되어 있지 않다고 판단하기 때문입니다.
for %%f in ("$(ProjectDir)*.h") do (
set newvar=string
echo %newvar%
)