在批处理中搜索字符串中的分号会导致奇怪的问题

时间:2014-03-24 06:02:35

标签: batch-file batch-processing

我正在尝试编写一个简单的批处理命令,它读取文件的第二行(ProfileName),查找“;”在该行中然后拆分该行并将其存储在两个变量(ProfileName和RRSProfileName)

    for /F "tokens=1 skip=1" %%A in (%ContentFilePath%) do ( SET ProfileName=%%A )
    ECHO %ProfileName% | findstr /spin ";">nul
    IF %ERRORLEVEL%==0 (
         FOR /F "tokens=1,2 delims=;" %%A in ("%ProfileName%") do ( SET ProfileName=%%A& SET RRSProfileName=%%B ) 
    )

ContentFile包含2行

    blah
    blah1

由于某种原因,如果存在“IF”语句,则不会设置ProfileName变量。如果我删除“IF”语句,ProfileName将设置为blah1。这很奇怪。有人可以帮忙吗? ProfileName和RRSProfileName最初都设置为“”。

2 个答案:

答案 0 :(得分:0)

findstr /spin

它在子目录中搜索(/s)省略不可打印的文件(/p)忽略大小写(/i)编号输出行(/n),而你没有给出任何文件,因此findstr失败,因为它的参数不正确。从这里你得到错误级别1,因此,if内的代码不会被执行

更好地使用

for /F "usebackq tokens=1 skip=1" %%A in ("%ContentFilePath%") do ( SET "ProfileName=%%A" )
ECHO %ProfileName%| find ";" > nul 
IF %ERRORLEVEL%==0 (
     FOR /F "tokens=1,2 delims=;" %%A in ("%ProfileName%") do ( SET "ProfileName=%%A" & SET "RRSProfileName=%%B" ) 
)

或者只是(如果有可能,我不知道您的所有情况),将两个步骤合并为一个

for /f "usebackq tokens=1,2 skip=1 delims=;" %%a in ("%ContentFilePath%"
) do ( set "ProfileName=%%a" & set "RRSProfileName=%%b" )

它读取相同的必需行,如果存在分号,则用于分割行,每个变量检索所需的内容。

答案 1 :(得分:0)

for /F "tokens=1,2 skip=1delims=;" %%A in (q22602116.txt) do SET "ProfileName=%%A"&SET "RRSProfileName=%%B"

对我来说效果很好,假设Profilename应该设置为最后一行分号前面的部分,RRSprofilename后面的部分(如果存在)

但是 - 请注意字符串赋值中 Spaces 的存在 - 它们很重要(原始批处理似乎有尾随空格......) - 这样定位的引号应该克服这个特性...