在Windows批处理文件中嵌套for循环未正确执行

时间:2014-05-05 14:24:20

标签: batch-file

我使用下面的代码,当它运行时,REM 2块中的代码不起作用。如果我改变REM 1块和REM 2块的顺序,则第一个块正常工作。

如果您遇到类似情况,请提供建议

谢谢, 罗斯汉


@ECHO OFF
SETLOCAL
SETLOCAL ENABLEDELAYEDEXPANSION

SET /A Count_tif=0
SET /A Count_lst=0
SET /A Count_cust_files = -1


FOR %%A IN (%Date%) DO (
    FOR /F "tokens=1-3 delims=/-" %%B in ("%%~A") DO ( SET Today=%%D%%B%%C )
                       )

SET Today=%Today: =%


REM ********************** To generate .lst files for Customerx.txt ****************************
ECHO Generating .lst files

@FOR %%A IN (C:\Imaging\COMWC\SQR\Customer?.txt) DO SET /A Count_cust_files += 1


for /l %%x in (1, 1, %Count_cust_files%) do (


REM 1 block
FOR /f %%c IN (C:\Imaging\COMWC\SQR\Customer%%x.txt) DO (
FOR /f %%d IN ('dir /b /a-d \\albaix41\HPII_data\%Today%\WCBFMISWCIMGS%%x\%%c_*.tif') DO ECHO(%%d)>>\\albaix41\HPII_data\%Today%\WCBFMISWCIMGS%%x\%%c.lst
                                                         )                              

REM 2 block
FOR /f %%a IN (C:\Imaging\COMWC\SQR\Customer%%x.txt) DO (
FOR /f %%b IN ('dir /b /a-d \\albaix41\HPII_data\%Today%\WCBFMISWCIMGS%%x\%%a.tif') DO ECHO(%%b)>\\albaix41\HPII_data\%Today%\WCBFMISWCIMGS%%x\%%a.lst
                                                         )                                                       


                                              )

2 个答案:

答案 0 :(得分:1)

我建议,因为你没有说出你的意思,并没有"工作"'可能存在两个问题。

首先,您在#2区块中有> ,但在#1区块中有>> > 将在每次迭代时重新创建文件(您只能获得最后一次迭代。)>> 附加到任何现有文件或创建新文件,如果文件已经存在,那么它将累积数据。

第二个问题是echo(whatever)

echo(如果没有向echo提供数据,则会生成新行。 echo本身会生成echo status report,即echo is ON(或关闭)

因此,echo(%%b)没有按照您的预期进行。如果echo(%%b未定义,则%%b将显示%%b或空行。 这里是关键点 - 以下然后匹配在echo中,但匹配FOR中的

解决方案:将echo(%%b)替换为echo(%%b。如果您确实希望圆括号内显示%%b的内容,请使用echo((%%b)

答案 1 :(得分:0)

问题是此行包含尾随空格,并且您没有使用双引号来处理空格。我确实看到了以下的set语句,但最好能够实现这个特定空间的问题。

DO ( SET Today=%%D%%B%%C )
:: use this instead:
DO (SET Today=%%D%%B%%C)

虽然这适用于set / a命令,但最好使用以下语法 - 空格在批处理文件的某些地方很重要,如果你习惯在变量名中放置空格那么它会让你有一天咬你:

DO SET /A Count_cust_files += 1
:: use this instead:
DO SET /A Count_cust_files+=1

这是为文件生成时间戳的更好方法:

此代码的前四行将为您提供XP Pro及更高版本中可靠的YY DD MM YYYY HH Min Sec变量。

@echo off
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"

set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%"
set "fullstamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%"
echo datestamp: "%datestamp%"
echo timestamp: "%timestamp%"
echo fullstamp: "%fullstamp%"
pause