일반 & 질답 - 윈도우
배치명령 한두가지만 더...
당장 필요하고 사용할 명령은 아니지만 평소 궁금했어고 도스명령어 질문 올린김에 이어 올려봅니다.
참고로 전 윈98 나올즈음 컴을 시작했고 도스는 한물 갔지만 기초부타하겠답시고 책사서 혼자 끙끙대봤지만 머리가 원체 나쁘고 해서 SET, IF 명령 반쯤보다가 접었는데요.
SET=C:\Temp
IF exist D:\Temp goto START
그래서 이 명령들도 위 수준까지 밖에 활용 못합니다. 그래도 아쉬운대로 배치파일을 많이 활용해서 사용하고 있습니다.
그런데 가끔 고수님들의 배치파일을 보면 간략하고 단촐하지만 실행해보면 나의 장황하고 어지러운 배치파일과 수행과정이 똑같다는 걸 보고 어쩔땐 황당하기까지한데요. 여러 많은 궁금증이 있습니다만 대표적으로 3가지만 꼽자면...
1,2 질문이 연관성이 있겠는데요.
<질문1>
간단 예를 들어볼께요. 윈도부팅디스켓 배치파일내용을 보면 이 시디가 A ~ Z 어느 드라이브에 삽입될지 모르는 상황인데 문제가 없이 시디롬내 파일을 엑세스해서 실행합니다. 어제께 알았는데요 %CD%가 이와 관련된 내부명령어 같습니다.
이제까지 전 ㅡ.ㅡ
IF exist C:\me.txt goto START
IF exist D:\me.txt goto START
goto ERROR
뭐 이런식으로 드라이브를 모두 나열해서 번잡하게 사용해왔습니다 ㅡ.ㅡ;
<질문2> 간단 예를 들자면
D:\Temp\all.bat
E:\Temp\backup.bat
E:\Temp\find.com
- all.bat 내용 === CALL E:\Temp\backup.bat
-backup.bat 내용 === START find.com
참고로 E:\Temp 는 PATH, SET=E:\Temp 명령이 걸려있지 않는 상태
backup.bat 과 START find.com이 동일 경로에 있기에 start.bat 만 실행한다면 굳이 START E:\temp 경로를 써주지 않아도 되겠죠. 그런데 All.bat 를 실행하면 실행경로가 달라지기에 find.com 이 실행되지 않습니다. 이 상황이 불변상황이라면 간단하게 E:\Temp\find.com 이라고 backup.bat 에 명시하면 되겠죠.
하지만 자주 경로명이 바뀐다면 ..
이를테면 E:\Temp 의 파일들이.. F:\ABC\Temp 로 옮겨진다면 배치파일은 매번 경로를 수정해야 할텐데요.
질문1과 마찬가지로 복잡장황하고 무식하게 배치파일은 만들면 되겠지만 SET 나 IF 를 활용해서 간단히 만들 수 있을 거 같아서 여쭤봅니다.
<질문3>
backup.bat 줄 맨끝에 del backup.bat 명령이 들어있던들.. backup.bat 은 수행중이기에 삭제가 되지 않습니다.
배치파일 수행 후 이파일을 삭제하고프면... backup.bat 안에서는 방법이 없는건지요?
<질문4>
IF %DATA% == 어쩌구
다른분들 배치파일보면 이런식의 구문이 많은데요
== <-- 이거의 의미는 뭔가요? 배우지 않은거라 긁적
|
03/11, 10:20
|
|
|
03/11, 12:34
find.com은 CD만 인식하는지.. 올려주신 배치파일을 변형해서 내 하드의 D드라이브를 찾아 PATH에 적용시키려했더니 안되네요. 아. 참고로 저의 주목적은 CD롬을 찾으려는 것 보단.. usb 메모리나 외장하드처럼 어느컴에 붙이더라도 또 그래서 드라이브나 경로가 바뀌더라도 기존에 사용하는 여러개의 배치파일들이 드라이브나 경로를 찾지 못해서 무용지물 되는 상황을 피해보고저 드린 질문였습니다.
임의의 파일 하나를 루트에 놔두고 goto END
:D-DRV
뭐 이런식으로 하면 가능할 것도 하지만 배치파일이 상당히 번잡해져서 제가 모르는 명령을 사용하여 깔끔하고 정확하게 적용될 수 있을까 하는 물음였습니다. |
|
|
03/11, 12:35
제가 원래? 눈치가 없어서.. 질문 내용의 요지를 파악하지 못했나 봅니다. 상기 파일은 FindCD입니다. ^^
바로 위에서 처럼.. 단순하게 각 루트 디렉터리를 검사해서.. ME.TXT 파일을 찾아 타겟을 정하는 것이라면.. 아래 처럼 간단히 해결이 될거라 생각합니다. @ECHO OFF
|
|
|
03/11, 13:07
<답변2> 배치파일을 이용하여,, 명령 파일의 위치를 추적하여 실행이 가능한가? : 사용자가 드라이브 뿐이 아니라 디렉터리까지 이동한 파일을 샅샅히 찾아서 수행하게 하는 것은 배치파일로 구현하기에는 조금 어려운 감이 있다고 생각합니다.
미리 약속 해 두거나 예측 가능한 범위라면.. 바로 위에서 처럼 FOR 문을 이용하여 가능하겠습니다만.. 이 또한 예측의 경우의 수가 많아 진다면.. 지저분 해 지는 것은 당연하다고 생각합니다.~
@ECHO OFF
* LIST.TXT D:
이런 식으로 예측 가능한 폴더를 미리 LIST.TXT에 넣어 주시는 형식으로 응용을 하시면 되지 않을까? 생각을 해봅니다.
|
|
|
03/11, 13:20
<답변3> 배치파일의 작업이 종료 되면 자기 파일의 삭제 가능 여부? : 매끄럽지는 않습니다만.. 일단 가능은 합니다.
가령.. TEST2.BAT
@ECHO OFF
이렇게 구성이 되어 있는 경우.. 리얼 DOS상에서 TEST2.BAT 본 파일이 삭제가 됩니다. 그러나.. 마지막까지 EXIT 되지 않았기 때문에.. 아래와 같이 됩니다.
윈도우상 CMD 모드에서는.. TEST3.CMD
@ECHO OFF
이렇게 만들어서 실행을 해보시면.. 그럭저럭 삭제는 가능합니다. (한줄 에러가 나긴 합니다만.. DOS와는 다르게 Pause되지 않습니다.)
보통 많이 사용하시는 방법이.. 배치 파일내에서 임시 공간(램드라이브나 Temp 폴더등에..)에 새로운 배치파일을 생성해서 자기 자신을 삭제 하도록 하는 방법을 사용합니다.
* TEST.BAT
@ECHO OFF PAUSE
이렇게 실행이 되면.. TEMP.BAT라는 파일로..
@ECHO OFF IF Exist TEST.BAT Del TEST.BAT
라는 명령을 수행하도록 생성이 되어.. 나중에.. TEST.BAT를 삭제하게 됩니다. (그러나.. TEMP.BAT은 남아 있겠지요.. 램드라이브라면.. 재부팅시 사라지겠습니다만..)
*참고: 마지막 TEMP.BAT를 불러오는 구문에서.. CALL문을 사용하면..TEST.BAT가 CALL문에서 요청한 파일의 종료시까지 대기 하기때문에 맨 위처럼 오류가 발생합니다.
참고만 하시길 바랍니다.~ |
|
|
03/11, 13:32
<답변4> 배치파일에서 IF문에서 사용하는 == 는 무엇일까요? : 짐작하시는 대로.. IF의 조건 처리시.. 양쪽 문자열이 일치 하는가? 여부를 비교하는 연산자입니다.
IF JK == JK ECHO OK > OK
IF "1234" == "1234" ECHO OK > OK
IF "555" == 555 ECHO OK >
IF NOT "123" == "1234" ECHO NOT > NOT
SET CDROM=Z SET DVDROM=Z IF %CDROM% == %DVDROM% ECHO OK > OK
IF "C:\Documents and Settings\Owner" EQU "%USERPROFILE%" ECHO EQUAL >EQUAL
이처럼 사용 됩니다.
" 따옴표는 구분하기 쉽게 하기 위해 사용하며.. 따옴표까지 비교를 하게 됩니다. 비교 문자열간 공백은 인정되지 않습니다. 단,, == 양쪽에는 공백이 있어도, 없어도, 공백의 간격이 달라도 상관없습니다.
윈도우상 CMD 모드에서는.. IF의 도음말을 보시면 아시겠습니다만.. EQU로 대체 사용이 가능하며,, NEQ(같지 않음), LSS(보다 작은), LEQ(작거나 같은), GTR(보다 큰), GEQ(크거나 같은)등의 확장 비교 연산자도 사용이 가능합니다.
이상입니다.. 몸상태가 좋지 않고(치통/두통..생리통?? ㅋㅋ) 업무가 서툴러.. 일거리가 많이 밀려 있어서.. 대충 생각나는 데로.. 휘리릭~ 적어 보았습니다. 상기 방법 외에도 더 멋지고 좋은 방법이 있을 수 있으니.. 참고만 하시길 바랍니다. 눈치가 없어 엉뚱한 답변을 달았거나.. 다소 부족한 점이 있더라도 양해 바랍니다. 이만,,슝~ |
|
|
03/11, 18:00
몸도 안좋으신데 괜히 불편을 드린 거 같아 죄송합니다. 그렇다고 여기에 또 추가 질문을 붙이면 지킬님이 몸도 안좋으신데 부담가지시고 피곤해지실 거 같아.. 한 개의 배치파일을 급히 마무리하고 싶은 게 있은데 제 욕심에 좀 고급스럽게 적용해보겠다고 한꺼번에 몰아 과한 질문을 하는 등... 욕심이 너무 컸나 봅니다. |
|
|
03/11, 18:02
어떤점이 이해가 안되시는지요? 막히신 부분을 말씀 해 주시면 답변을 드리겠습니다. 워낙.. 로보트 체질에 & 아직 마흔이 안된 청춘이라..ㅋㅋ 걱정 하실 만큼 몸이 않 좋진 않습니다. 윗쪽 어금니가 좋지 않아.. 상당한 치통과 뇌랑 가까와서 그런지.. 두통이 약간 있을 뿐입니다. ^^ |
|
|
03/11, 21:00
아그래요? ㅠㅠ 그럼 염치불구하고 오늘은 딱 2가지만 일단 여쩌볼께요
일단 위에것들이 다 윈도에서도 돌아가는배치지요? 전 윈도에서 배치를 쓸때가 훨씬 많아서요
또 FindCD.com 배치말입니다.
그리고 2번째 배치파일 @ECHO OFF
D 루트에다 me.txt 를 놓고 테스트 해봤습니다.
그런데 제가 이해안가는 것은.... 그렇다면 %TARGET% = D: 상태로 인식이 된 상태입니다.. 그래서 저 배치 맨 밑에다 내용을 더 붙여봤어요. start %TARGET%\Temp\notepad.exe
그랬더니 이 파일이 실행이 안됩니다. 전 이부분이 이해가 안가네요. 물론 D:\Temp\notepad.exe 는 존재하구요. |
|
|
03/11, 23:10
FindCD는 위에서도 말씀드린대로.. 에뮬레이트된 CDROM(DVD)만 찾아 주는.. CD-ROM find utility인 FindCD입니다. ^^ 결국.. 일반적인 HDD에서 그대로 응용 하는 것은 힘들지 않나? 생각됩니다. 그리고,, 아래 질문하신 내용은.. %TARGET%을 변수로 사용을 하시려면.. BATCH 내용중.. SET TARGET=%JJ ) 이 부분을 보시면 %%J 뒤에 공백이 있었기 때문에.. 실제 변수 할당은 D:(공백)까지 할당이 된 상태라.. D:(공백)\TEMP\NOTEPAD.EXE가 되니.. 오류가 발생한것입니다.
그 부분만 수정 해 주시면 별 문제가 없겠습니다. * TARGET.CMD
|
|
|
03/11, 23:45
아 잘되네요. 공백이 문제였군요. 원래 그 줄의 공백은 없는게 배치구문에서 정상인거죠? 문제없이 실행됩니다. 앞으로 이건 자주 이용해야겠네요. 이제까지 한페이지 가까이 장황했는데 딱 2,3줄로 간단해결되겠네요... %%J 에서 J도 임의의 알파뱃인가 봅니다? A나 E로 바꿔서 해도 실행에 전혀 문제가 없네요.
그런데 제가 A드라이브에 플로피가 있는데 혹시나해서 in (A: B: 까지 삽입했더니 오류가 나는군요. 중지/계속 버튼을 눌러야 배치가 실행되네요.. 아무튼 큰 궁금증이 해결되었네요.. 다른 배치는 다음에 문의드리겠습니다.
아 참고로.. list.txt의 내용을 배치파일이 읽어 받아들인다는 건 오는 첨 알았네요. 요놈도 나중에 연구해서 상당히 많이 응용할 거 같습니다. |
|
|
03/11, 23:49
네.. 수고 하셨습니다. 배치파일을 한눈에 보기 쉽게 하느라.. 예제 구현상에는 문제가 없다고 생각하여.. 보시기 편하게 괄호와 명령어 사이에 공백을 넣어두었었습니다. 원래는 불필요한 공백은 없는게 좋겠죠.. 또한.. 제가 DR.JK 이기때문에.. 보통 예제를 들때 변수명으로 J나 K를 자주 사용합니다. ^^ (임의의 문자를 사용 하셔도 당연히 됩니다.~) FDD의 경우 드라이브는 있는데.. MEDIA가 없는 경우.. READY 상태가 아니기 때문에.. 말씀하신 내용처럼 오류가 나겠습니다. |
|







호롱이




흠,, 질문의 난이도가 상당히 높습니다. ^^
예전에.. 아르바이트로 컴퓨터 학원에서 OA 강사를 잠시 한적이 있는데.. 당시 생각이 살짝 납니다 .^^
<답변1> DOS상에서 랜덤한 CDROM PATH를 어떻게 찾아내는가?
: 이것은 몇가지 방법이 있겠습니다.
1. PC에 대부분 CDROM(DVD)가 3개 이상 달려 있지 않다는 가정하에..
예를 들어,, MSCDEX.EXE에서 드라이브 할당을 L이나 R등 부터 시작을 하면..
L로 시작하는 경우.. L,M,N .. R로 시작하는 경우... R,S,T 등으로 한정 되기때문에..
IF EXIST 구문으로 찾아도 최대 3줄이면 찾아 낼수가 있겠습니다.
> 당연히 하나의 CDROM(DVD) 만 있다고 가정하면.. 그냥 MSCDEX에서 고정을 해주시면
되겠지요? MSCDEX.EXE /D:DSCD001 /L:R
2. 윈도우98이나 윈도우ME의 설치 CD에 포함된 부트이미지를 유심히 살펴 보시면..
FINDCD.EXE 이나 FINDRAMD.EXE 이라는 파일이 있습니다.
이 FINDRAMD.EXE는 드라이브 문자를 하나씩 변수로 대입해서.. RAMDrive를 찾으면 그 다음
드라이브 문자를 %CDROM% 변수로 지정하여.. PATH 명령과 MSCDEX 명령에게 변수로 넘겨
주게 됩니다.
(RAMDrive는 현재 마운트된 드라이브 제일 마지막에 잡히게 되기때문입니다.)
반면에,, FINDCD.EXE의 경우에는 일단 MSCDEX가 드라이브 명을 자동으로 할당하게끔 한다음..
윈도우98 설치 CD에 포함 되었던 FINDCD.EXE는 CDROM Drive에서 "Win98\Setup.exe" 라는
파일을 찾고 윈도우ME에 포함 되었던 FINDCD.EXE는 "Win9X\Setup.exe"를 찾아서..
OK가 되는 Drive를 %CDROM% 변수에 할당하게 됩니다.
이 변수를 이용하여 마찬가지로 PATH로 사용하시면 되겠습니다.
많은 분들이 FINDCD.EXE를 HEX 편집하여.. "Win98\Setup.exe" 또는 "Win9X\Setup.exe"
문자열을 자신만의 파일로 대체하여 사용하시기도 합니다.
3. 2번에서 말씀드린 내용 처럼 동작하는 외부 명령어 파일도 존재합니다.
BART에서 제공되는 파일로..FINDCD.com 입니다. (Freeware)
사용법은 findcd 옵션
옵션: -a 모든 CDROM 문자 반환
-r 미디어가 삽입된 CDRM 문자 반환
-f파일(경로) 해당 파일이 포함된 CDROM 문자 찾기
ex) findcd -f\i386\setupldr.bin
-e ErrorLevel을 반환
예제 Sample.bat 참조 하시면 이해가 쉬우시리라 생각합니다.
이와 같은 방법을 응용하시면 도움이 되시기라 생각합니다.
앗..일처리가 밀려.. 다음 답변은 점심시간 이후에..(^^)