如果FOR循环中的字符串比较失败

时间:2016-01-28 03:27:45

标签: batch-file cmd windows-7-x64

我一直在尝试按照我在此处和其他页面上找到的一些示例,但我无法设法让IF工作。

我想做的是:

有一个名为SIS134F160107.txt的文件。它有数字记录和数据 我需要将以09(仅)开头的行复制到另一个我可以命名为output.txt的文件或其他任何文件。

我的代码如下:

@echo on
setlocal enableDelayedExpansion
set "Comp=09"
FOR /F %%# IN (SIS134F160107.txt) DO (
    Call Set "Line=%%#"
    Call Echo %%Line%%
    Call Set "Token=%%Line%%"
    Call Echo %%Token%%
    Call Set "T=%%Token:~0,2%%"
    Call Echo %%T%%
    Call Echo %%Comp%%
    if %%T%%==%Comp% (call Echo Imprimir .%Comp%. .%%T%%.)
PAUSE
)

结果是IF不会打印任何信息,但是如果我打印出IF的NOT语句,我会得到:

C:\....\Batch>setlocal enableDelayedExpansion
C:\....\Batch>set "Comp=09"
C:\....\Batch>FOR /F %# IN (SIS134F160107.txt)
DO (
Call Set "Line=%#"
 Call Echo %Line%
 Call Set "Token=%Line%"
 Call Echo %Token%
 Call Set "T=%Token:~0,2%"
 Call Echo %T%
 Call Echo %Comp%
 if NOT %T% == 09 (call Echo Imprimir .09. .%T%. )
 PAUSE
)

C:\....\Batch>(
Call Set "Line=09Linea01"
 Call Echo %Line%
 Call Set "Token=%Line%"
 Call Echo %Token%
 Call Set "T=%Token:~0,2%"
 Call Echo %T%
 Call Echo %Comp%
 if NOT %T% == 09 (call Echo Imprimir .09. .%T%. )
 PAUSE
)
09Linea01
09Linea01
09
09
Imprimir .09. .09.
Press any key to continue . . .

C:\....\Batch>(
Call Set "Line=88Linea01"
 Call Echo %Line%
 Call Set "Token=%Line%"
 Call Echo %Token%
 Call Set "T=%Token:~0,2%"
 Call Echo %T%
 Call Echo %Comp%
 if NOT %T% == 09 (call Echo Imprimir .09. .%T%. )
 PAUSE
)
88Linea01
88Linea01
88
09
Imprimir .09. .88.
Press any key to continue . . .

有些回声得到了09 09而有些回不了。所以我不明白为什么即使字符串是"等于"为什么IF不工作。

我也试过使用EQU,但没用。

我的代码中的错误在哪里导致字符串比较无法按预期工作?

3 个答案:

答案 0 :(得分:0)

对于初学者... 09中的前导0使得它假设该数字是八进制的。 09不是合法的八进制数。进行字符串比较而不是算术比较。改变所有出现的

if NOT %T% == 09

if NOT "%T%"=="09"

答案 1 :(得分:0)

由于您已调用delayedexpansion,因此无需call echo ...echo !line!echo !token!也可以正常运作。 %var%在解析时提取""值var!var!" currrent值由于运行"而改变了值。

if %%T%%==%Comp% 

将被解释为

如果"%T%" ==" comp的原始值"

因此除非comp包含文字值%T%,否则结果将为false;因此不是 - 这是真的。

使用

if "!T!"=="%comp%" ....

T当前值与comp原始值进行比较。

答案 2 :(得分:0)

您可以修复代码,但有更好的方法。这正是FINDSTR旨在解决的问题类型。

使用简单的正则表达式搜索,解决方案成为一个简单的单线程序:

findstr "^09" "SIS134F160107.txt" >output.txt

或使用字符串文字搜索

的这一个班轮
findstr /b /c:"09" "SIS134F160107.txt" >output.txt