2012년 3월 8일 목요일

배치 파일 팁

명령 표시 안하기
@echo off

!) 보통 batch 파일 시작에 @echo off 설정을 함

위 설정이 없으면 아래 스크립트 수행시 prompt 에 명령이 출력되고 결과가 출력됨
script:
echo Hello

결과:
C:\batch>echo Hello
Hello


아래 스크립트는 명령은 출력하지 않고 결과만 출력됨
script:
@echo off
echo Hello

결과:
Hello

변수 지정:
set name=value

변수 사용:
echo %name%

날짜/시간:

 - 날짜 : %date:~2%
 - 시간(시분초) : %time:~0,2%_%time:~3,2%_%time:~6,2%

예)
set filename=%date:~2%_%time:~0,2%_%time:~3,2%_%time:~6,2%.txt

변수 검사:
!) 변수가 빈 문자열인지 검사
if "%1" == "" goto end 또는 if [%1] == [] goto end
!) 변수가 빈 문자열이 아닌지 검사
if not "%1" == "" goto end 또는 if not [%1] == [] goto end
!) 파일 존재 여부 검사
if exist %FILEPATH% (
    echo ok
) else (
    echo not ok!
)
!) 프로그램 exit code 검사 (참고: http://snoopybox.co.kr/1404)
if errorlevel 1 (
    echo error...
) else (
    echo success
)

지역 변수 사용:
setlocal

!) 기본적으로 batch 파일에서 set 으로 설정한 값들은 batch 파일 실행이 끝난 후에도 환경 변수에 설정 되어 있다
만약 batch 파일 수행시에만 변수를 유지하고 싶으면 setlocal 을 설정해 준다

모든 매개변수 넘기기:
http://stackoverflow.com/questions/980331/redirecting-passed-arguments-to-a-windows-batch-file

%*

예)
java -jar foo.jar %*

!) 만약 위 batch 파일을 path 에 등록하고 다른 위치에서도 사용하려고 한다면 위 foo.jar 파일의 경로는 절대 경로로 설정하는 편이 좋은 거 같다
 - 기본 batch 파일을 실행하는 위치에서 foo.jar 파일을 찾게 되기 때문

옵션 매개변수:
http://stackoverflow.com/questions/3973824/windows-bat-file-optional-argument-parsing
예)
:loop
if not [%1] == [] (
    if [%1] == [--username] (
        set username=%2
        shift
    ) else if [%1] == [--password] (
        set password=%2
        shift
    )
    shift
    goto loop
)

echo Username=%username%
echo Password=%password%

매개변수 경로 얻기:
%0 %1 식으로 % 에 숫자를 줌으로써 매개 변수를 얻을 수 있다.
%0 은 실행하고 있는 해당 batch 파일이고 1 이상 부터는 입력된 매개 변수 순서대로 이다.

매개 변수의 드라이브명 경로명 등을 얻을 수 있다.

드라이드명:
%~d0

% 와 0 사이에 ~d 옵션이 붙었다.

0 번째 매개변수는 batch 파일 자신이기 때문에 해당 batch 파일이 c: 에 있다면 c: 가 출력된다.

경로명:
%~p0

만약 해당 batch 파일이 c:\batch\test\ 경로에 있다면 \batch\test\ 가 출력된다.

드라이브 + 경로명:
%~dp0

만약 해당 batch 파일이 c:\batch\test\ 경로에 있다면 c:\batch\tet\ 가 출력된다.

사용 예)
batch 파일을 PATH 환경 변수에 등록해 두고 다른 위치에서 해당 batch 파일 수행시 batch 파일 경로 내 파일 참조 필요시

script:
@echo off
set BASE=%~dp0
echo program run > %BASE%\run.lock
pause
del %BASE%\run.lock

!) 위 batch 스크립트를 PATH 환경 변수에 두고 다른 위치에서 실행해도 batch 파일 위치에 run.lock 파일이 생성됨을 확인 할 수 있다


!) \n 공백 리턴
echo.