2013-02-19 267 views
0

我遇到了FOR命令的一些问题。我在这里读了无数的文章,没有什么打到我正在寻找的东西。我正在尝试使用大量文件(大约6000)的目录,读取文件并将数据格式化为单个文件(如果变量读取1而不是0)。脚本远远没有完成,我只是有一个问题。我到目前为止的代码是这样的多个批处理命令

@echo off 

set Rfile= 
dir /b g:\health\test\ >> dir.txt 
For /F "tokens=1 delims=" %%y in (dir.txt) do Call :Read %%y 

:Read 

set Rfile=%~1 

For /F "tokens=1,2,3,4,5,6 delims=" %%a in (g:\health\test\%Rfile%) do Call :test %%a 

:test 
SET Machine=%~1 
SET BSOD=%~2 
SET NTFS=%~3 
SET DISK=%~4 
Set Workstation=%~5 
Set Server=%~6 


If NOT "%BSOD%" == "%Machine%" (

echo %machine% %BSOD% %NTFS% %DISK% %WorkStation% %Server% 

) 

:EOF 

这给了我这样一个文件,这样的信息具有下面的输出。

计算机BSOD0 NTFS0 DISK0 Service0 Service0

测试”没有空间,但测试是在输出

我不想文件名的其余部分线下(在这种情况下测试)输出。我在做什么错在这里?

文件信息 “计算机BSOD0 NTFS0 DISK0 Service0 Service0”

回答

0

您的问题是,您的FOR循环按预期呼叫:test,但是,一旦完成了FOR循环,无论如何您都将进入:test。如果你这样做,那么%1将作为脚本的输入(在这种情况下为test)。

要解决,只需添加一个GOTO :eof像这样:

For /F "tokens=1,2,3,4,5,6 delims=" %%a in (g:\health\test\%Rfile%) do Call :test %%a 

REM Do not fall through into the :test label code! 
GOTO :eof 

:test 
SET Machine=%~1 

顺便说一句,你不应该有一个叫做:EOF标签。已经定义了一个隐含的eof标签。另外,您应该确保所有的子程序都以goto :eof结束。在这个例子中你只有1个子程序(:test),所以它工作正常,但如果你添加更多,你将会遇到问题。

+0

谢谢你在早上工作太早,在我的批次生锈。 – 2013-02-19 13:36:08