我遇到了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服务0服务0
测试“没有空间,但测试在输出的其余部分下面的行
我不希望输出中的文件名(在本例中为test)。我在这做错了什么?
文件信息“COMPUTER BSOD0 NTFS0 DISK0 Service0 Service0”
答案 0 :(得分: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
),所以它工作正常,但是如果你添加更多,你将遇到问题。