как заархивировать файлы по группе, которая является неопределенной подстрокой в ​​именах файлов, используя пакетный скрипт DOS

У меня есть куча файлов DOS в папке, которую я хочу заархивировать по группам. Имена файлов кодируются следующим образом:

devXXXXdbt01.log

qasXXXXwb01.log

devYYYap01.log

qasYYYdb02.log

первые 3 буквы — это либо dev, либо q, а следующие 3-5 буквы (XXXX или YYY) — это имя динамической группы, которое я хочу использовать в качестве имени zip-файла, следующие 2 буквы ( db, wb, ap) являются одним из 3: db, wb или ap следующая необязательная буква t означает, что это временный файл. в некоторых случаях в имени файла нет буквы t последние 2 цифры серийный номер

поэтому я хочу создать zip-файл XXXX.zip, содержащий файлы, подобные первым двум, zip-файл YYY.zip< /strong>, который содержит такие файлы, как последние 2.

Как я могу написать пакет DOS, чтобы он делал это автоматически, без жесткого кодирования имен групп?


person meokey    schedule 24.07.2013    source источник
comment
какую zip-программу вы используете?   -  person Endoro    schedule 24.07.2013


Ответы (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

Все, что вам по существу нужно сделать, это установить имена исходного и целевого каталогов.

Подпрограмма :zipme called передает каждое имя файла из исходного каталога, которое соответствует указанным маскам файлов. Только часть имени присваивается destzip и num сначала удаляется, а затем присваивается 100+последним 2 символам имени. Если результат не является числом, nun остается неназначенным (2>nul подавляет ошибку) и имя файла отклоняется (конечно, отображение не является обязательным).

Затем три целевые комбинации символов сопоставляются со строкой, начиная с четвертого-последнего символа для двух символов, и снова с добавлением t к пятому-последнему для 3-х символов. Любое совпадение вызывает передачу на ZIPTHIS, и если ничего не совпадает, то (необязательно) сообщается об отклонении.

Оттуда это просто вопрос вызова вашей zip-программы - я только что ECHOed WZZIP командную строку.

person Magoo    schedule 25.07.2013