IF 在 FOR 循环中比较字符串失败
IF failure on string comparison within a FOR loop
我一直在尝试遵循我在此处和其他页面上找到的一些示例,但我无法让 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,有些则没有。所以我不明白为什么即使字符串是 "Equal".
IF 也不起作用
我也试过用EQU,但是没用。
我的代码中哪里有错误导致字符串比较没有按我预期的那样工作?
对于初学者... 09 中的前导 0 使其假定该数字是八进制的。 09 不是合法的八进制数。进行字符串比较而不是算术比较。更改所有出现的
if NOT %T% == 09
至
if NOT "%T%"=="09"
既然已经调用了delayedexpansion
,就没有必要call echo ...
了。 echo !line!
或 echo !token!
也可以。 %var%
提取 var
的 "at the time of parsing" 值,!var!
提取 "currrent value as changed by running" 值。
if %%T%%==%Comp%
将被解释为
if "%T%"=="comp的原始值"
因此,除非 comp
包含文字值 %T%
,否则结果将为假;因此 not-this 为真。
使用
if "!T!"=="%comp%" ....
将 T
的 当前 值与 comp
的 原始 值进行比较。
您可以修复代码,但还有更好的方法。这正是 FINDSTR 旨在解决的问题类型。
使用简单的正则表达式搜索,解决方案变成了一个简单的一行:
findstr "^09" "SIS134F160107.txt" >output.txt
或者这一行使用字符串文字搜索
findstr /b /c:"09" "SIS134F160107.txt" >output.txt
我一直在尝试遵循我在此处和其他页面上找到的一些示例,但我无法让 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,有些则没有。所以我不明白为什么即使字符串是 "Equal".
IF 也不起作用我也试过用EQU,但是没用。
我的代码中哪里有错误导致字符串比较没有按我预期的那样工作?
对于初学者... 09 中的前导 0 使其假定该数字是八进制的。 09 不是合法的八进制数。进行字符串比较而不是算术比较。更改所有出现的
if NOT %T% == 09
至
if NOT "%T%"=="09"
既然已经调用了delayedexpansion
,就没有必要call echo ...
了。 echo !line!
或 echo !token!
也可以。 %var%
提取 var
的 "at the time of parsing" 值,!var!
提取 "currrent value as changed by running" 值。
if %%T%%==%Comp%
将被解释为
if "%T%"=="comp的原始值"
因此,除非 comp
包含文字值 %T%
,否则结果将为假;因此 not-this 为真。
使用
if "!T!"=="%comp%" ....
将 T
的 当前 值与 comp
的 原始 值进行比较。
您可以修复代码,但还有更好的方法。这正是 FINDSTR 旨在解决的问题类型。
使用简单的正则表达式搜索,解决方案变成了一个简单的一行:
findstr "^09" "SIS134F160107.txt" >output.txt
或者这一行使用字符串文字搜索
findstr /b /c:"09" "SIS134F160107.txt" >output.txt