我使用下面的代码,当它运行时,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
)
)
答案 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