每天我们会收到五个这样的文件:
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
,所以它有正确的值,只是即使你在后续索引中添加了条目,你也只打印了第一个条目)。