DOS/Windows CMD batch file(.bat, .cmd)  programming tip


실행

배치 스크립트 실행 종료

EXIT 로 종료하면 batch 를 실행하는 CMD.exe 도 종료됨.

GOTO:EOF 를 실행하면 현재 배치 파일 실행만 종료.


프로그램 실행후 종료

여러 개의 JDK 가 설치되었을 경우 특정 프로그램(Ex: BlackBerry IDE)이 특정 JRE 를 요구할 경우 다음처럼 활용 가능.

@ECHO OFF

set path=c:\devel\java\jre6;%PATH%
start  eclipse.exe
exit
CODE

Change Directory 시 드라이브도 이동하기

cd 로 디렉터리를 이동할 경우 다른 드라이브에 있는 폴더면 d:\ 처럼 해당 드라이브로 가는 명령어를 한 번 더 실행해야 한다.

cd 명령어에 /D 옵션을 추가하면 드라이브도 이동해 준다.

[c:\] cd /D d:\mydir
CODE


긴 명령어에 대해 Multi ine 사용

Unix 와 다르게 Windows 에서 멀티 라인은 ^ 문자를 사용

xcopy.exe file1.txt^
 "C:\Program Files ^(x86^)\MyApp\"^
 file2.txt /F /Q /D
CODE

조건문 사용

IF ELSE 조건문

다음 구문처럼 IF 와 ELSE 사용 가능. 단 ELSE IF 구문은 지원하지 않음.

ELSE 는 IF의 닫는 괄호와 같은 라인에 있어야 함.

if condition (
    echo condition1
) else (
   echo else condition1
)
CODE
예제

배치 실행시 입력한 첫번 째 파라미터 따라 다른 분기

IF "%1"=="param1" (
    ECHO Your first param is "%1"
    goto param1
) ELSE (
    goto other
)
 
:param1
dosomething
GOTO:EOF
 
:other
doanything
GOTO:EOF
POWERSHELL


첫번째 파라미터는 %1, 두번째는 %2, n 번째는 %n

모든 파라미터는 %* 를 의미

Equal, Great than, less than 비교문

구문의미
EQU equal
NEQ not equal
LSS less than
LEQ less than or equal
GTR greater than
GEQ greater than or equal


Parameter

Parameter 전달 

첫번째 파라미터는 %1, 두번째는 %2, n 번째는 %n

모든 파라미터는 %* 를 의미

파라미터의 갯수 확인

파라미터의 갯수를  저장하는 변수인 argc 가 없으나 다음과 같이 하면 argc 사용 가능. %* 는 모든 파라미터를 저장하는 변수임.

set argc=0
for %%x in (%*) do Set /A argc+=1
echo argc=%argc%
CODE

파라미터에 따른 분기

@ECHO OFF
set argc=0
for %%x in (%*) do Set /A argc+=1
if %argc% == 0 (
        echo no param
)
if %argc% == 1 (
	echo param count = 1 "param=%1"
)
if %argc% == 2 (
	echo param count = 2, "param=%1 %2"
) else (
    echo param count = %argc%, "param=%*"
)


if "%1"=="apple" (
    echo "param1 is apple"
    goto end
) else {
   echo "param1 is not apple"
   goto end
}
CODE


FOR 구문

for 로 범위내 반복 실행

for /l %x in (1, 2, 100) do echo %x
CODE

첫번째 1은 시작 범위,100 은 종료, 2 는 증가값.


matching 파일 대상 for loop 

현재 폴더내 pdf 목록 출력

FOR %I in (*.pdf) DO echo %I
CODE

batch 스크립트에서는 %I 대신 %II 로 작성해야 함.


특정 경로에 있는 모든 pdf 파일을 PDFtoPrinter 를 사용해서 프린터로 출력

print-pdf.bat

@ECHO OFF

FOR %%I in ("D:\Documents\mydoc"\*.pdf)^
DO PDFtoPrinter.exe "%%I"
POWERSHELL


for loop 로 현재 디렉토리 순회하기

디렉토리를 순회하며 작업을 할 일이 있을 경우 유용

for /d /r %var in (*) do dir we found "%var"
CODE
  • /d : sub 디렉토리
  • /r : recursive
  • %var : 현재 디렉터리 이름이 담기는 변수
  • in (*) : 검색된 모든 디렉터리
  • do : 검색된 디렉터리에 실행할 명령. 위 경우 we found 메시지 뒤에 디렉터리 명 출력


예제: 현재 폴더 밑에 있는 모든 .png 파일을 상위 디렉터리의 images 로 이동

$stringEscapeUtils.escapeHtml($body)
CODE


기타

echo 로 new line 출력

echo hello\nworld 로는 개행 문자가 출력 안 되고 다음처럼 echo. 으로 출력해야 함

echo hello
echo.
echo world
POWERSHELL


shell 의 if  -f 처럼 batch 에서 file 의 존재 여부 확인

if exist {insert file name here} (
    rem file exists
) else (
    rem file doesn't exist
)
CODE

Ref