Saturday, January 17, 2009
BAT파일에서, 다른 BAT파일을 불러 반복 실행하기
아래 예제는 example.bat 이라는 배치파일 안에서, foo.bat 이라는 별도의 다른 배치파일을 호출하여 3번 반복 실행시키는 예제입니다. foo.bat 이라는 임의의 배치파일이 같은 디렉토리(폴더)에 있어야만 실행이 됩니다.
중요한 것은, 호출할 다른 배치파일 이름 앞에 반드시 call 을 붙여 주는 것입니다. 그렇지 않으면 반복이 안됩니다. 호출된 foo.bat 파일 속에서 그냥 종료되어 버리고, example.bat 파일로 다시 돌아오지 않게 됩니다.
예제 파일명: example.bat
@echo off
call foo.bat
call foo.bat
call foo.bat
배치파일 속에서 특정 부분 반복 예제 참고:
▶▶ BAT 파일 반복 시키기 배치파일 문법
중요한 것은, 호출할 다른 배치파일 이름 앞에 반드시 call 을 붙여 주는 것입니다. 그렇지 않으면 반복이 안됩니다. 호출된 foo.bat 파일 속에서 그냥 종료되어 버리고, example.bat 파일로 다시 돌아오지 않게 됩니다.
예제 파일명: example.bat
@echo off
call foo.bat
call foo.bat
call foo.bat
배치파일 속에서 특정 부분 반복 예제 참고:
▶▶ BAT 파일 반복 시키기 배치파일 문법
tag: batch
배치파일 | DOS CMD BATCH .BAT | VBScript .VBS
제가 구글이나 블로거닷컴에 로그인하지 않고 댓글을 남기고 싶은데 다른 방법은 없는건가요?
블로거닷컴의 특성상 외국 스패머들이 많아서 로그인하도록 설정을 해 놓았습니다..
익명 댓글을 허용하니까 성인 광고가 자꾸 붙더군요ㅠㅠ
위의 포스트 예제처럼 블로그에 포스트 할때 소스 코드 넣는 박스를 따로 만들려면 어떻게 해야하나요? ^^
아래 주소에 있는 포스트를 보시면 코드박스 만들기 설명이 있습니다^_^
▶▶ [HTML/CSS] 포스트 본문에 코드/문자열 창 붙이기
@echo off
for %%i in (2 3 4) do (
set /a NUM=%%i+1
echo NUM=%%i+1
echo NUM=%NUM%
echo.
)
--------------------
위와같은 스크립트를 만들었는데 %i+1 의 결과값이 num 변수에 대입이 안되네요..
이것땜에 며칠째 폐인모드입니다 ㅡㅡ
살려주세열......................
for문으로 이런 것을 구현하는 것은 안되는 것 같습니다. 이 경우 for가 한꺼번에 실행되어 버립니다.
이 부분을
set /a NUM=%%i+1
이렇게 띄어쓰기를 하면
set /a NUM=%%i + 1
숫자는 출력이 되는데요,
제가 아는 한, for문 뒤의 명령어는 1개여야 합니다. 이 소스의 경우 명령어가 네 개 있는데, 숫자 2 3 4 중에서 맨 마지막 숫자인 "4"만 실행되는군요ㅠㅠ
배치의 for문은 제약이 많기 때문에 무리가 있는 듯합니다.ㅠㅠ
안녕하세요. 이렇게 빨리 답변을 달아주시다니..정말 감사합니다(__)
아 그런데 배치 for문의 한계인가요?내가 몰라서 그렇지..배치로도 다될거야..이렇게 생각했었는데ㅡㅡ VBS나 펄을 배워야하나? 근데 덧셈기호 앞뒤로 띄어쓰기를 하니까 결과가 나오긴하는데 아래처럼 꼭 2번째 실행부터 나오네요..제가 뭘또 잘못한건가요?소스는 그대로인데ㅡㅡ
여튼 다시한번 답변 감솨감솨..즐거운주말되세요~
---------------------------------
NUM=2 + 1
NUM=
NUM=3 + 1
NUM=
NUM=4 + 1
NUM=
---------------------------------
NUM=2 + 1
NUM=5
NUM=3 + 1
NUM=5
NUM=4 + 1
NUM=5
띄어쓰기의 문제가 아니었군요ㅠㅠ
그렇지만 정확한 연산 결과가 나오지 않는 것은 for문 자체의 한계로 보입니다.
그리고 set /a 도 불안정한 명령입니다.
배치는 주로 파일을 처리할 때 쓰는데 연산 같은 것에는 아주 취약하고, 그리고 for문도 복잡한 작업을 하려고 하면 안되는 것이 참 많습니다.
:: >>> 짮은코딩 <<< ::
:: main.cmd/
:: 지역변수 지정
setlocal
set MY_STR0=global
call sub.cmd
echo.====================================
echo MY_STR0=%MY_STR0%
echo.====================================
endlocal
:: /main.cmd
:: sub.cmd/
echo. ====================================
echo MY_STR0=%MY_STR0%
echo. ====================================
set MY_STR0=local
:: /sub.cmd
:: PRINT/
====================================
MY_STR0=global
====================================
====================================
MY_STR0=local
====================================
:: /PRINT
:: >>> 긴코딩 <<< ::
:: main.cmd/
:: 지역변수 지정
setlocal
set MY_STR0=global
call sub.cmd
echo.====================================
echo main.cmd : MY_STR0=%MY_STR0%
echo.====================================
endlocal
:: /main.cmd
:: sub.cmd/
echo. ====================================
echo sub.cmd : MY_STR0=%MY_STR0%
echo. ====================================
:: 지역변수 지정
setlocal
echo. ====================================
echo sub.cmd : MY_STR0=%MY_STR0%
echo. ====================================
set MY_STR0=local
echo. ====================================
echo sub.cmd : fix : MY_STR0=%MY_STR0%
echo. ====================================
:: Call
call subsub1.cmd
endlocal
echo. ====================================
echo sub.cmd : MY_STR0=%MY_STR0%
echo. ====================================
:: /sub.cmd
:: subsub1.cmd/
echo. ====================================
echo subsub1.cmd : MY_STR0=%MY_STR0%
echo. ====================================
:: 지역변수 지정
setlocal
echo. ====================================
echo subsub1.cmd : MY_STR0=%MY_STR0%
echo. ====================================
set MY_STR0=subsub1local
echo. ====================================
echo subsub1.cmd : fix : MY_STR0=%MY_STR0%
echo. ====================================
endlocal
echo. ====================================
echo subsub1.cmd : MY_STR0=%MY_STR0%
echo. ====================================
:: /subsub1.cmd
:: PRINT/
====================================
sub.cmd : MY_STR0=global
====================================
====================================
sub.cmd : MY_STR0=global
====================================
====================================
sub.cmd : fix : MY_STR0=local
====================================
====================================
subsub1.cmd : MY_STR0=local
====================================
====================================
subsub1.cmd : MY_STR0=local
====================================
====================================
subsub1.cmd : fix : MY_STR0=subsub1local
====================================
====================================
subsub1.cmd : MY_STR0=local
====================================
====================================
sub.cmd : MY_STR0=global
====================================
====================================
main.cmd : MY_STR0=global
====================================
:: /PRINT
:: /main1.bat
:: /main
@echo off
setlocal
set j=4
for %%i in (2 3 %j%) do (
call calculation.bat %%i
echo.
if %%i == %j% goto :EOF
)
endlocal
:: main/
:: main1.bat/
:: /calculation.bat
@echo off
setlocal
echo %1 _ %2 _ %3
set /a myNum=(%1 + 1)
echo i=%1
echo myNum=%myNum%
endlocal
:: calculation.bat/
:: /PRINT
2 _ _
i=2
myNum=3
3 _ _
i=3
myNum=4
4 _ _
i=4
myNum=5
:: PRINT/
:: /main0.bat
:: /main
@echo off
setlocal
set j=4
for %%i in (2 3 %j%) do (
call :CAL %%i
echo.
if %%i == %j% goto :EOF
)
endlocal
:: main/
:: /subCal
:CAL
setlocal
echo %1 _ %2 _ %3
set /a myNum=%1 + 1
echo i=%1
echo myNum=%myNum%
endlocal
:: subCal/
:: main0.bat/
:: /PRINT
2 _ _
i=2
myNum=3
3 _ _
i=3
myNum=4
4 _ _
i=4
myNum=5
:: PRINT/
한번 더 여쭤보고 싶습니다..
지금은 실행되고 있는 프로세스를 끄려고 하는데요 ㅎ
첨에 if문을 쓰려고 했습니다..
해당 프로세스가 존재한다면 종료시키려구요.. 근데 다시 생각해보니 이게 if 문만으로 가능할지 걱정되서 ㄷㄷ
#echo off
setlocal
tasklist | findstr notepad.exe > task.txt (예를 들어 메모장 프로그램)
set foo=task.txt
if exist %foo% ~
여기서부터 진도가 안나갑니다.. 일단 생각해본게 해당 프로세스 명이 존재한다면 파일의 크기는 1byte가 되고, 없다면 0byte니까 파일의 크기를 비교해서 1일 때
taskkill /f /im notepad.exe
요렇게 넣어보려고 하는데요.. 이걸 if문만으로 할 수 있을까요?? switch 같은 걸로 해야되는건지..
크기만 비교하겠다는 생각에 사로잡혀 있다가 지금 다른 방법을 써봤더니 됐네요 ㅎ
문자열1과 문자열2를 비교 연산하는 명령어를 보고 첨에 파일들끼리 비교하는건 안될꺼라 생각하고 넘어갔는데 혹시나 싶어 해봤더니 성공했습니다 ㅎ
내용이 비어있는 임의의 텍스트 문서를 만들고 해당 프로세스를 다른 텍스트 문서로 저장하고 NEQ 를 이용해 비교했더니 프로세스가 종료됐네요.. 크 드디어..
다행입니다^_^
<< Home