0

我想按组压缩的文件夹中有一堆 DOS 文件。文件名编码如下:

devXXXXdbt01.log

qasXXXXwb01.log

devYYYap01.log

qasYYYdb02.log

前 3 个字母是 dev 或 qas 以下3-5字母(XXXXYYY)是我想用作 zip 文件名的动态组名 以下 2 个字母(db、wb、ap)是 3 个字母之一:db、wb , 或 ap 以下可选字母 t 表示它是临时文件。在某些情况下,文件名没有字母 t 最后 2 位数字是序列号

所以我想创建包含前 2 个文件的 zip 文件XXXX.zip,包含最后 2 个文件的zip 文件YYY.zip 。

如何编写 DOS 批处理脚本以自动执行它,而不用硬编码组名称?

4

1 回答 1

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通过call源目录中与指定的文件掩码匹配的每个文件名来传递。仅将名称部分分配给destzipnum首先删除,然后分配给 100+名称的最后 2 个字符。如果结果不是数字,则nun保持未分配(2>nul抑制错误)并且文件名被拒绝(当然,显示是可选的。)

接下来,三个目标字符组合与倒数第四个字符的字符串匹配两个字符,并再次t附加到倒数第五个字符的三个字符。任何匹配都会导致转移ZIPTHIS,如果不匹配,则(可选)报告拒绝。

从那里开始,只需调用您的 zip 程序即可 - 我刚刚ECHO编辑了WZZIP命令行。

于 2013-07-25T00:41:31.307 回答