2012. 8. 30. 10:43ㆍ99. 정리전 - IT/29. IT 잡동지식
윈도우용 배치 파일을 하나 작성해야 하는데
파일을 전송 받을때 해당 파일 이름이 존재하면 현재 날짜 시간을 더해서
파일을 저장 해야 합니다.
그래서 ABC 파일에 날짜 시간을 붙여서 저장하게 작성 한 배치 파일입니다.
@ECHO OFF
SET FILE_IN="D:\PROG\ABC"
SET FileDate=%date:-=%
REM 시분초로 파일명 생성을 위한 분리작업 (':', '.' 제거)
SET H=%time:~0,2%
SET M=%time:~3,2%
SET S=%time:~6,2%
SET MS=%time:~9,2%
move %FILE_IN% %FILE_IN%_%FileDate%_%H%%M%%S%%MS%
하지만 문제는 초까지 같은 시간대에 파일이 들어온다면 결국
겹쳐 쓰여지게 된다는 겁니다.
그래서 if 문을 추가해서 해당 폴더에 ABC라는 파일 존재한다면
카운트로 1씩 증가 시켜서 현재 날짜 시간을 붙인 파일로 저장하고 싶다는 겁니다.
근데 윈도우용 배치파일에 if를 어떤 식으로 처리해야 할지 모르겠는데
좀 알려주세요.
유닉스 셀로 짠건 아래와 같습니다.
즉, 유닉스로 짠 아래 셀 소스를 윈도우용 배치 파일로 변경 하고 싶은겁니다.
SYS_DATE=`date +%Y%m%d%H%M%S`
if [[ `ls -al /file/back/ABC_${SYS_DATE}* | wc -l` -gt 0 ]]
then
K=`ls -al /file/back/ABC_${SYS_DATE}* | wc -l`
else
K=0
fi
((K+=1))
mv /file/back/ABC /file/back/ABC_${SYS_DATE}${K}
질문자 인사
답변 내용이 도움 많이 되었습니다~ 제가 너무 늦게 봤네요... 첫단추를 잘못 끼운게 맞고 다른식으로 해결 했었어요. 하튼 너무 감사하고 늦어서 죄송합니다.
1안 님이 만든 소스 개작
@ECHO OFF
set date1=SUN 12-13-2009
SET TIME1=10:11:12.13
SET FILE_IN=.\
rem 경로를 고칠것
SET FileDate=%date1:-=%
rem date1을 date로 바꿀것
REM 시분초로 파일명 생성을 위한 분리작업 (':', '.' 제거)
SET H=%time1:~0,2%
SET M=%time1:~3,2%
SET S=%time1:~6,2%
SET MS=%time1:~9,2%
rem time1을 time로 바꿀것
if not exist "%FILE_IN%%FileDate%_%H%%M%%S%%MS%.TXT" (
ECHO DDDDDDDDDDD>"%FILE_IN%%FileDate%_%H%%M%%S%%MS%.TXT"
rem move 명령어를 내릴곳, 또한 if 의 확장를 고칠것
rem 경로에 파일이 있으면 filenamex로 처가라..
) else (
call :filenamex
)
goto :end
:filenamex
for /l %%g in (1,1,1000) do (
set gg=%%g
if not exist "%FILE_IN%%FileDate%_%H%%M%%S%%MS%_%%g.TXT" (
echo ddddddddddd%%g >"%FILE_IN%%FileDate%_%H%%M%%S%%MS%_%%g.TXT"
rem move 명령어를 내릴곳, 또한 if 의 확장를 고칠것
rem 알고리즘 갔더니 숫자 붙은놈 있는지 확인해라.. 있어 없어? 있으면 뱁고
rem 없으면 만들고 만들고 종료해라..
goto :eof
)
)
pause
goto :eof
:end
pause
완료된 소스로써.. 완벽 작동합니다. 천개까지 카운터 번호 붙였습니다.
제가 테스트 한결과 일단 바로 바로 화일이 생기네여..
문제는 님 소스로는 _ 를 남발하여 님이 올리신 소스 자체로도 작동하지 않는 다라는것입니다.
기본적으로 폴더 중간과 파일명 사이에 _ 이걸 남발 하셔서.. 문제 생깁니다. 그렇게 하실경우..
뭐 부가적인 파일이름은 나중에 짓더라도 소스 짜실때는 없애야하죠..
이건 님 소스를 기준으로 작성한것이고요.. 두번쨰 소스는 저의 기준으로..
일단 서버작업하시는것 같으니.. 윈도우 2000급 서버급으로 코딩하였습니다.
2안 제가 처음부터 만든 소스 주석은 위에랑 별반 차이 없으므로 안달겠습니다.
성능은 똑같습니다. -_-)a 단지 100개까지만 카운터 번호 붙였습니다. 그것만 다른..
@ECHO OFF
set date1=SUN 12-13-2009
SET TIME1=10:11:12.13
SET FILE_IN=.\
SET FileDate=%date1:-=%
SET "S_=%DATE1%_%TIME1%"
CALL :L_ "/" ":" "."
pause
if not exist "%FILE_IN%/%S_%.txt" (
echo gggggggggggg>"%FILE_IN%/%S_%.txt"
) ELSE (
call :filenamex
)
GOTO :EOF
:filenamex
for /l %%g in (1,1,100) do (
set gg=%%g
if not exist "%FILE_IN%/%S_%_%%g.txt" (
echo ddddddddddd%%g >"%FILE_IN%/%S_%_%%g.txt"
goto :eof
)
)
goto :eof
:L_
IF "%~1" EQU "" GOTO :EOF
CALL SET "S_=%%S_:%~1=_%%"
SHIFT & GOTO L_
:end
pause
끝으로.. 도스 배치화일.. 관련 정보 사이트 http://blog.naver.com/mokomoji
출처 : 나 ㅋ_ㅋ)a
문제는..
동시에 화일이 들어오고 화일명이 같으면 계속 추가적으로 숫자가 증가하여 자동으로 붙습니다.
근데 소스는 완벽하나 님 이론이 약간 잘못 되어서..-_-)a
같은 화일명이 존재할수는 없죠..아무리 동시에 들어왔다고 해도..동시에 들어오면..
하나는 덮어 쒸우기가 될것이고 그리고 역시 시간은 배치화일이 현재 시간을 기준으로 잡는거라서..
애가 하나가 빨빨거리고 정리하는거라면 절대 동시 처리라는 것은 없습니다. 배치화일은 순차
처리죠..
즉 님 소스의 알고리즘으로 입력 단계에서 어떤 파일이 들어오나에 따라 배치화일이 시간을 기록하기 때문에..
절대 같은 날짜 같은 시간이 들어올수 없습니다. 왜? 파일 시간을 체크하는게 아니라..
배치화일 시스템 시간을 체크하여 배치를 만들었기 때문이죠..
만약 한시스템에서 배치화일을 두개 혹은 세개를 동시나 혹은 4개가 동시에 들어간다고 치면..
개념 부터 다시 짜야해요..-_-)a
즉 제가 생각하기에는 -_--------)a 님 구상하는 소스는 맞으나..
첫단추 자체를 잘못 끼우신듯..