Batch file Batchfile-findstr can';我找不到绳子

Batch file Batchfile-findstr can';我找不到绳子,batch-file,cmd,findstr,Batch File,Cmd,Findstr,因此,我运行findstr命令来搜索文件中的以下文本 [errorCode: 0] 并使用/v选项输出不包含此字符串的行。下面是我正在使用的代码 @findstr /i /v "\[errorCode: 0\]" file1.log >>file2.txt 然而,这只是将file1的所有内容放到file2中。哪里出错了?使用以下命令行: @%SystemRoot%\System32\findstr.exe /I /L /V /C:"[errorCode: 0]" file1.lo

因此,我运行findstr命令来搜索文件中的以下文本

[errorCode: 0]
并使用/v选项输出不包含此字符串的行。下面是我正在使用的代码

@findstr /i /v "\[errorCode: 0\]" file1.log >>file2.txt

然而,这只是将file1的所有内容放到file2中。哪里出错了?

使用以下命令行:

@%SystemRoot%\System32\findstr.exe /I /L /V /C:"[errorCode: 0]" file1.log >>file2.txt
由于
/L
/C
,这会显式地运行
[errorCode:0]
的文本字符串搜索

使用FINDSTR时,其正则表达式支持无法与其他应用程序和解释器中的正则表达式支持相比,建议通过在命令提示窗口中运行
FINDSTR/?
来阅读其简要帮助,此外:

  • SS64命令文档
  • SS64附加页面
  • 由Dave Benham在堆栈溢出上编写
命令行

@findstr /i /v "\[errorCode: 0\]" file1.log >>file2.txt
未生成预期的输出,因为仅带双引号的搜索字符串中的空格字符被解释为多个搜索字符串之间的分隔符。因此,FINDSTR正在使用此命令行搜索包含字符串
[errorCode:
或字符串
0]
的行,使用不区分大小写的正则表达式查找,而不是搜索包含字符串
[errorCode:0]
的行,并输出所有不包含这两个字符串的行

此命令行也可以编写为:

  • Literal而不是正则表达式查找一行中的
    [errorCode
    0]
    不区分大小写,并输出不包含这两个字符串的所有行:

    @findstr /I /L /V "[errorCode 0]" file1.log
    
    @findstr /I /V /C:"[errorCode:" /C:"0]" file1.log
    
    @findstr /I /R /V /C:"\[errorCode:" /C:"0\]" file1.log
    
  • Literal而不是正则表达式查找在一行中显式搜索
    [errorCode
    0]
    ,并输出不包含这两个字符串中任何一个的所有行:

    @findstr /I /L /V "[errorCode 0]" file1.log
    
    @findstr /I /V /C:"[errorCode:" /C:"0]" file1.log
    
    @findstr /I /R /V /C:"\[errorCode:" /C:"0\]" file1.log
    
  • 正则表达式在一行中显式搜索
    [errorCode
    0]
    时不区分大小写,并输出不包含这两个字符串的所有行:

    @findstr /I /L /V "[errorCode 0]" file1.log
    
    @findstr /I /V /C:"[errorCode:" /C:"0]" file1.log
    
    @findstr /I /R /V /C:"\[errorCode:" /C:"0\]" file1.log
    
例如
file1.log
包含:

Line 1: [errorCode: 0]
Line 2: [CodeError: 0]
Line 3: [errorCode: 1]
Line 4: [noErrCode: 1]
上述三个命令行和所讨论的初始命令行的输出为:

Line 4: [noErrCode: 1]
但本例的预期输出为:

Line 2: [CodeError: 0]
Line 3: [errorCode: 1]
Line 4: [noErrCode: 1]
这是运行以下命令行之一时的输出:

@findstr /I /V /C:"[errorCode: 0]" file1.log
@findstr /I /V /C:"\[errorCode: 0\]" file1.log
@findstr /I /L /V /C:"[errorCode: 0]" file1.log
@findstr /I /L /V /C:"\[errorCode: 0\]" file1.log
@findstr /I /R /V /C:"\[errorCode: 0\]" file1.log
\
是文本和正则表达式字符串中的转义字符。但在文字字符串中,只有反斜杠
\
本身和双引号字符
必须用反斜杠转义。在正则表达式字符串中,对具有特殊正则表达式含义的字符保留反斜杠会导致将下一个字符解释为文字字符

我建议使用FINDSTR

  • 指定一个或多个字符串进行比较,并始终与
    /C:“…”
    (或与
    /C:…
    )进行比较,而决不仅与
    “…”
    进行比较,以便在搜索字符串中获取始终解释为空格字符的空格
  • 为文本指定始终
    /L
    ,或为正则表达式查找指定始终
    /R

  • 然后,大多数了解从其他应用程序或解释器进行字符串搜索的用户都会像预期的那样进行查找,而不知道有关解释双引号中的字符串的FINDSTR特定规则。

    使用命令行
    @%SystemRoot%\System32\FINDSTR.exe/I/L/V/C:[errorCode:0]“file1.log>>file2.txt
    ,它显式运行文本字符串搜索。谢谢,这很有效。奇怪的是,转义字符不应该在我发布的代码中工作吗?
    /C:“string”
    选项总是默认为文字搜索,因此不需要
    /L
    选项。但是如果没有
    /C
    ,则空格分隔的搜索词列表中的第一个搜索词将确定搜索是文本还是正则表达式。因此,在没有
    /C
    的情况下,建议始终使用
    /L
    /R
    来明确意图。此处的“较旧的”
    find
    命令就足够了:
    find/i/v“[errorCode:0]”file1.log>>file2.txt