在for(if语句)中比较批处理中的字符串)

时间:2017-04-18 12:44:16

标签: batch-file

我有一个带有一些文件名的file1.txt。 我想从文件中读取文件名是否包含" xyz"我需要运行一些命令,如果没有其他命令 无法做到这一点,需要你的帮助,尝试了很多方法,但无法弄清楚 这是我尝试过的示例代码:

 @echo off
 setlocal EnableDelayedExpansion

 for /F "tokens=1,2,3 delims=" %%i in (file1.txt) do (
     set f=%%i
     set z=XYZ
     echo !f! >>test.txt
     if /i "!f!" == "!z!" (
         echo matched >> test.txt
     ) else ( 
         echo nomatch >> test.txt
     )
 )

1 个答案:

答案 0 :(得分:2)

要比较字符串是否包含另一个字符串,您可以这样做(请注意,这不区分大小写,因为基础sub-string expansion syntax本身不区分大小写):

if "!STRING!"=="!STRING:%SUB%=!" echo Sub-string "%SUB%" NOT found within "!STRING!"

以上方法已在您的脚本中实现:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_INFILE=file1.txt"
set "_OUTFILE=test.txt"
set "_SUBSTR=XYZ"

>> "%_OUTFILE%" (
    for /F "usebackq tokens=1-3 delims=" %%L in ("%_INFILE%") do (
        set "LINE=%%L"
        setlocal EnableDelayedExpansion
        echo(!LINE!
        if not "!LINE!"=="!LINE:%_SUBSTR%=!" (
            echo matched
        ) else ( 
            echo nomatch
        )
        endlocal
    )
)

endlocal
exit /B

此外,我改进了以下内容:

  • 类似常量的变量在开头预定义;
  • 返回的文本仅重定向一次;将>>替换为>以覆盖现有文件而不是附加到该文件;
  • delayed expansion在循环内切换,以免在文本中丢失感叹号;请注意_SUBSTR中的字符串不得包含此类字符串;
  • 脚本中使用的所有文件路径都用引号括起来;
  • 在整个脚本中使用引用的set语法;
  • 代码缩进用于提高可读性;

或者,您可以使用find command,它仅返回file1.txt中包含%SUB%中子字符串的那些行;添加/I选项以进行不区分大小写的搜索:

find "%SUB%" "file1.txt"