2013-07-24 4 views
0

그룹별로 압축하려는 폴더에 여러 개의 DOS 파일이 있습니다. 파일 이름은 다음과 같이 코딩 :DOS 배치 스크립트를 사용하여 파일 이름에 불확실한 하위 문자열 인 그룹별로 파일을 압축하는 방법

devXXXXdbt01.log 

qasXXXXwb01.log 

devYYYap01.log 

qasYYYdb02.log 

처음 3 개 글자 중 하나 dev에 또는 QAS 다음 3-5 문자 (XXXX 또는 YYY) 내가 zip 파일 이름으로 사용할 동적 그룹 이름입니다입니다 다음 2 글자 (db, wb, ap)는 3 : db, wb 또는 ap 중 하나입니다. 다음 선택적 문자 t는 임시 파일을 의미합니다. 일부 경우에 파일 이름은 마지막 2 개 자리가

그래서 난 zip 파일을 생성하고 싶습니다 일련 번호

있습니다 t 문자가없는 XXXX.zip, 처음 2와 같은 압축 파일 을 파일이 포함되어YYY.zip에 마지막 2 개의 파일이 포함되어 있습니다.

하드 코딩 그룹 이름없이 자동으로 수행하도록 DOS 배치를 스크립팅하려면 어떻게해야합니까?

+0

zip 프로그램을 사용 하시나요? – Endoro

답변

1
@ECHO OFF 
SETLOCAL 
SET sourcedir=c:\sourcedir 
SET destdir=u: 
PUSHD "%sourcedir%" 
FOR /f %%i IN ('dir /b /a-d dev*.* qas*.*') DO CALL :zipme %%i 
popd 
GOTO :EOF 

:zipme 
SET destzip=%~n1 
SET "num=" 
SET /a num=1%destzip:~-2% 2>nul 
IF NOT DEFINED num ECHO(reject %1&GOTO :EOF 
FOR %%g IN (db wb ap) DO (
IF /i %%g==%destzip:~-4,2% SET destzip=%destzip:~3,-4%&GOTO zipthis 
IF /i %%gt==%destzip:~-5,3% SET destzip=%destzip:~3,-5%&GOTO zipthis 
) 
ECHO(reject %1 
GOTO :EOF 
:zipthis 
ECHO wzzip -a "%destdir%\%destzip%" %1 
GOTO :eof 

예제 소스 디렉토리 :

abcxxxdb01.log 
devxxxdb01.log 
devxxxdb02.log 
devxxxdbt03.log 
devxxxdbt0x.log 
devxxxdbtx1.log 
devyyyydbt03.log 
devzzzzzap03.log 
devzzzzzapt99.log 
devzzzzzapt999.log 
devzzzzzdb03.log 
devzzzzzdbt03.log 
devzzzzzjq03.log 
devzzzzzwb03.log 
devzzzzzxy03.log 
qasxxxdb01.log 
qasxxxdb02.log 
qasxxxdbt03.log 
qasxxxdbt0x.log 
qasxxxdbtx1.log 
qasyyyydbt03.log 
qaszzzzzap03.log 
qaszzzzzapt99.log 
qaszzzzzapt999.log 
qaszzzzzdb03.log 
qaszzzzzdbt03.log 
qaszzzzzjq03.log 
qaszzzzzwb03.log 
qaszzzzzxy03.log 
zxzxxxdb01.log 

실행 결과 :

wzzip -a "u:\xxx" devxxxdb01.log 
wzzip -a "u:\xxx" devxxxdb02.log 
wzzip -a "u:\xxx" devxxxdbt03.log 
reject devxxxdbt0x.log 
reject devxxxdbtx1.log 
wzzip -a "u:\yyyy" devyyyydbt03.log 
wzzip -a "u:\zzzzz" devzzzzzap03.log 
wzzip -a "u:\zzzzz" devzzzzzapt99.log 
reject devzzzzzapt999.log 
wzzip -a "u:\zzzzz" devzzzzzdb03.log 
wzzip -a "u:\zzzzz" devzzzzzdbt03.log 
reject devzzzzzjq03.log 
wzzip -a "u:\zzzzz" devzzzzzwb03.log 
reject devzzzzzxy03.log 
wzzip -a "u:\xxx" qasxxxdb01.log 
wzzip -a "u:\xxx" qasxxxdb02.log 
wzzip -a "u:\xxx" qasxxxdbt03.log 
reject qasxxxdbt0x.log 
reject qasxxxdbtx1.log 
wzzip -a "u:\yyyy" qasyyyydbt03.log 
wzzip -a "u:\zzzzz" qaszzzzzap03.log 
wzzip -a "u:\zzzzz" qaszzzzzapt99.log 
reject qaszzzzzapt999.log 
wzzip -a "u:\zzzzz" qaszzzzzdb03.log 
wzzip -a "u:\zzzzz" qaszzzzzdbt03.log 
reject qaszzzzzjq03.log 
wzzip -a "u:\zzzzz" qaszzzzzwb03.log 
reject qaszzzzzxy03.log 

당신은 기본적으로 소스 및 대상 디렉토리 이름을 설정하기 만하면.

루틴 :zipmecall입니다. 지정된 파일 마스크와 일치하는 소스 디렉토리의 각 파일 이름을 전달합니다. 이름 부분 만 destzip에 할당되고 num이 먼저 삭제 된 다음 100 + 이름의 마지막 2 자로 지정됩니다. 결과가 숫자가 아니면 nun은 할당되지 않은 상태로 유지되고 (2>nul은 오류를 표시하지 않음) 파일 이름이 거부됩니다 (디스플레이는 물론 선택 사항입니다).

그런 다음 세 가지 대상 문자 조합이 두 번째 문자는 네 번째 마지막 문자이며 두 번째 문자는 t이고 세 번째 문자는 다섯 번째 문자입니다. 일치하는 경우 ZIPTHIS으로 전송되고 일치하지 않으면 거부가 (선택적으로)보고됩니다.

여기에서 간단히 zip 프로그램을 호출해야합니다. ECHOWZZIP 명령 줄이었습니다.

+0

은 매력처럼 작동합니다! 고마워. – meokey