根据文件名压缩文件

根据文件名压缩文件

每天我们会收到五个这样的文件:

vi_250000364846.dqa_report.xlsx
vi_250000364846.3553_report
vi_250000364846.MSR_report
vi_250000364857.3553_report
vi_250000364857.dqa_report.xlsx

文件名中的数字每天都不同,但三个必需文件的数字相同。我只需要将这三个文件发送到压缩的 zip 文件夹中。

我编写了以下代码,但它多次使用第一个文件并显示相同的值五次:

@echo on  
set LOGFILE=batch.log  
call :LOG > %LOGFILE%  
exit /B  

:LOG  
setlocal EnableDelayedExpansion  
set n=0  
set count=0  
set vector[%n%]=0  
for /f "tokens=* delims=." %%i in ('dir /b /a-d "C:\Test"') do (  
set filename=%%i  
for /f "tokens=2 delims=_." %%a in ("%filename%") do (  
   set vector[!n!]=%%a  
  for /f "tokens=* delims==" %%v in ('set vector[%n%]')  do @echo %%v  
)  
 set /A n+=1  
)

我不确定为什么它不将第二个文件作为参数。我试图创建一个包含所有五个文件名的数字的数组,然后比较这些数组值。

请帮我找出问题所在。

答案1

您在几个地方使用了急切扩展(带%分隔符),而您本应使用延迟扩展(带!分隔符)。修复这个问题似乎可以得到您想要的行为:

@echo on  
set LOGFILE=batch.log  
call :LOG > %LOGFILE%  
exit /B  

:LOG  
setlocal EnableDelayedExpansion  
set n=0  
set count=0  
set vector[%n%]=0  
for /f "tokens=* delims=." %%i in ('dir /b /a-d "C:\Test"') do (  
set filename=%%i  
for /f "tokens=2 delims=_." %%a in ("!filename!") do (  
   set vector[!n!]=%%a  
  for /f "tokens=* delims==" %%v in ('set vector[!n!]')  do @echo %%v  
)  
 set /A n+=1  
)

需要明确的是,我所做的更改如下:

for /f "tokens=2 delims=_." %%a in ("%filename%") do (  

变成:

for /f "tokens=2 delims=_." %%a in ("!filename!") do (  

和:

for /f "tokens=* delims==" %%v in ('set vector[%n%]')  do @echo %%v  

变成:

for /f "tokens=* delims==" %%v in ('set vector[!n!]')  do @echo %%v  

如果没有这些变化,%filename%总是扩展为空字符串,并且%n%总是扩展为 0(外部开始时设置的值for);在后一种情况下,这只会搞砸你的输出(你!n!在分配给时正确使用vector,所以它有正确的值,只是即使你在后续索引中添加了条目,你也只打印了第一个条目)。

相关内容