컴퓨터2009.12.15 09:00

마이크로소프트 윈도우 라고 하면 네모모양의 GUI 메뉴를 기본적으로 생각을 하고 계신 분들이 많습니다. 그것들은 윈도우를 편리하게 사용하기 위해서 만들어 놓은 장치들입니다. 편리하게 만들어 놓은 장치도 있지만, 대다수가 편리하게 생각하는 방법도 어떻게 쓰려는지에 따라 불편하게 느껴지게 마련입니다. ( 저는 이래서 컴퓨터를 알아가면 갈수록 어렵다는 생각이 들게 됩니다.)

사용자가 원하는 작업을 위해서는 굳이 GUI 메뉴를 이용할 필요는 없습니다. 바로 커맨드라인때문입니다.

커맨드라인은 윈도우에는 기본적으로 설치가 되어 있는 명령행프로그램입니다. 명령행이라는 단어에서 느껴지듯이 하나의 행을 기준으로 명령어가 실행되는 프로그램입니다. 이를 조금더 확장시켜 하나의 행을 실행하면서 결과를 반환하는 것들이 모여서 결과를 표시하거나 조합 변경시키는 것이 가능하도록 할수 있는 것이 배치파일[각주:1]입니다.

배치파일에는 명령행으로 작업할수 있는 부분의 한계는 분명히 있습니다. 하지만 그것들을 감안하더라도 충분히 알아둘만합니다.

일예로 여러 PC 의 특정폴더를 USB 메모리로 복사하는 예를 들어보겠습니다.

USB 메모리는 아시다시피 기본 하드디스크 문자의 가장 나중 문자로 드라이브문자를 할당받습니다. 결국 사용하는 PC의 드라이브갯수에 따라서 특정폴더명이 아무리 동일하도라도 드라이브문자가 달라지기때문에 그때마다 탐색기로 복사를 따로 하거나, 배치파일의 내용을 수정해서 사용을 해야 합니다.

딱보기에도 번거로워 보이고, 잊어먹기 딱 좋아보입니다.

그렇다면 어떻게 하는게 좋은 방법일까요..

정답은 배치파일에서 드라이브명을 찾아내서 변수[각주:2]로 처리를 하는 것입니다.

예제를 보여드리도록 하겠습니다. 예제는 snoopy님의 어제글인 VHD 파일 자동교체 부팅메뉴 등록하기 를 참조했습니다.

예제1
@echo off
for %%A in (C: D: E:) do (
    if exist %%A\vhd\win7x86.vhd (
        for %%B in (C: D: E:) do (
            if exist %%B\backup\win7x86.vhd copy /y %%B\backup\win7x86.vhd %%A\vhd\win7x86.vhd
        )
    )
)
exit


어떤 드라이브의 backup폴더내에 있는 win7x86.vhd 를 어떤 드라이브의 vhd 라는 폴더의 win7x86.vhd 로 복사하는 배치파일입니다. 여기서 사용된 %%A, %%B 는 변수로서 실행시마다 변경이 될수 있는 값입니다. 이를 이용해서 backup 폴더와 vhd 폴더 위치만 맞는다면 어디서나 사용이 가능합니다.

조금더 바꾸어 볼까요?

만약 같은 드라이브에 backup 폴더와 vhd 폴더가 있는 구조라면 어떻게 바꿀수 있을까요?

예제2
@echo off
setLocal

for %%A in (C: D: E:) do (
	if exist %%A\vhd\win7x86.vhd (
		if exist %%A\backup\win7x86.vhd (
			SET _DIR_BACKUP=%%A
			SET _DIR_REAL=%%A
		)
	)
	
)
IF NOT [%_DIR_REAL%]==[] (
	copy /y %_DIR_BACKUP%\backup\win7x86.vhd %_DIR_REAL%\vhd\win7x86.vhd
)
EndLocal
exit


내부적인 변수를 선언해서 사용하는 예제로 변경을 한것입니다. 사용된 부분중 if exist 파일명 부분은 만약 파일이 있을경우 실행이 되도록 하는 것이고, IF NOT [%_DIR_REAL%]=[] 은 %_DIR_REAL% 라는 변수의 값이 없지 않을경우, 그러니까 있을경우에만 실행이 되도록 하는 것입니다.


제 경우에는 USB 메모리카드와 회사 PC, 집PC 의 데이터를 동기화시키는데 이용을 합니다.

참 많을 일을 할수 있을것 같지 않습니까?

  1. 배치스크립트 라고도 합니다. [본문으로]
  2. 프로그래밍에서 변수란 프로그램에 전달되는 정보나 그 밖의 상황에 따라 바뀔 수 있는 값을 의미한다&nbsp; - <A href="http://www.terms.co.kr/variable.htm">텀즈 변수</A> [본문으로]
Posted by Zasfe
컴퓨터2009.01.05 16:17

우연히 웹사이트를 돌아다니다가 배치파일에서 날짜를 이용해서 파일이나 폴더 이름을 만드는 것을 문의하는 글을 보았습니다. 배치파일에서 날짜를 뽑아내는(?) 부분은 어렵지 않습니다. 다만 사용하는 OS 의 버젼에 따라 날짜가 다르게 출력되기 때문에 모든 배치파일이 OS 버젼에 따라 조금은 다르게 만들어야 합니다.

저도 많이 아는것은 아니지만 배치파일에 대해서 많은 분들이 어렵게 생각하시는 부분에 대해서 참고하실 수 있도록 정리를 합니다.

날짜처리를 위한 배치파일의 예

Set %Today% = %date%
Mkdir C:\%Today%
Echo 파일 만들기 > C:\%Today%\%Today%.txt

위의 배치파일을 실행할 경우 C:\2009-01-05 라는 폴더가 생성되고, C:\2009-01-05\2009-01-05.txt 에는 "파일 만들기" 라는 문장이 저장이 됩니다.

다만, 사용하는 윈도우가 2000 이라면 결과는 약간 다르게 나옵니다.

윈도우 2000

윈도우 2000 실행결과

윈도우 2003

윈도우 2003 실행결과

vista

윈도우 vista 실행결과


이렇기 때문에 동일한 배치파일로 모든 버젼의 OS 에서 동일하게 작동하려면 버젼에 따라 다르게 동작을 해야 합니다.

윈도우 2000 에서의 날짜를 가져오면 다음과 같이 나옵니다.

숫자로된 부분만 원하는 값이기 때문에 요일에 해당하는 값을 빼야 하고, 추가적으로 숫자사이의 구분을 위해 사용된 "-" 도 빼도록 하겠습니다.

--- 11.cmd
REM 윈도우 2000 버젼을 확인합니다.
ver | find "5.0" > nul
if %ERRORLEVEL% == 0 goto ver_2000
goto after_ver_2000
REM 2000용
:ver_2000
REM 날짜에서 - 를 지움
set date2=%date:-=%
REM date2에서 - 를 지움
set date3=%date2:~2,8%%
set Today=%date3%.txt
goto run_main
REM 2003 이상 버젼용
:after_ver_2000
REM 날짜에서 - 를 지움
set Today=%date:-=%.txt
goto run_main
:run_main
REM 폴더 만들기
Mkdir C:\%Today%
REM 파일에 내용쓰기 만들기
Echo 파일 만들기 > C:\%Today%\%Today%.txt

11.cmd

11.cmd 파일 실행결과

Posted by Zasfe

티스토리 툴바