如何使用DOS批处理脚本按文件名中不确定的子字符串分组压缩文件



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

devXXXXdbt01.log
qasXXXXwb01.log
devYYYap01.log
qasYYYdb02.log

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

因此,我想创建zip文件XXXX.zip,其中包含前2个文件,zip文件<强>YYY.zip//strong>中包含后2个文件。

如何编写DOS批处理的脚本以自动执行,而不必对组名进行硬编码?

@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

您基本上需要做的就是设置源和目标目录名称。

例程:zipmecalled,传递源目录中与指定的文件掩码匹配的每个文件名。单独的名称部分被分配给destzipnum,首先被删除,然后被分配给名称的100+最后2个字符。如果结果不是数字,则nun保持未分配(2>nul抑制错误),文件名被拒绝(当然,显示是可选的)

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

从那里开始,只需要调用zip程序——我刚刚用ECHO调用了WZZIP命令行。

最新更新