Findstr ERRORLEVEL returns 如果我键入与搜索字符串长度相同的点,则级别错误
Findstr ERRORLEVEL returns wrong level if I type dot's of the same length as the search string
我创建批处理 (.bat)
脚本,其中我使用 findstr
和 if / else
语句。
效果好的部分:
- 如果我键入一个与要搜索的文件中的一行相匹配的有效字符串,它会将我带到
IF
<- 这没问题
- 如果我键入无效字符串,它会将我带到
ELSE
<- 这没关系
不好的部分:
如果我键入 点的 而不是字母( 相同长度 ),它会将我带到 IF
。比如我输入....
,字符数匹配字符串blue
为什么?这些点与我文件中的任何字符串都不匹配,所以我应该转到 ELSE
。我的代码有什么问题?
我的searchable_file.xml
:
dev
current
old
stable
oldest
newest
blue
green
我的 findstr
脚本:
SET /P SELECTION=
FINDSTR /R /C:"^%SELECTION%$" searchable_file.xml > NUL
IF NOT ERRORLEVEL 1 (
ECHO [OK] The value entered is valid.
) ELSE (
ECHO [ERROR] The path entered does not exist. Try again.
)
findstr
命令将 .
视为通配符,因此在字符串中搜索点将 return 任何字符数与点数相同的单词。例如,在 the
中搜索 t.e
将 return the
。如果您搜索 .*
,它会 return 几乎所有内容,因为 *
允许通配符匹配任意次数。您应该能够使用反斜杠转义通配符,例如 \.\.\.
只会搜索点而不是其他字符。
Reference
FINDSTR /R /C:"^%SELECTION%$" file.txt
中的/R
表示使用REGEX(点作为通配符)。只是删除 /R
是没有用的,因为它无论如何都是标准的。将其替换为 /L
(Literal)。
当然这意味着,“行首”的 ^
和“行尾”的 $
将不再起作用(它们是正则表达式),但您可以添加 /B
(B行首)和/E
(E行首)改为:
FINDSTR /L /B /E /C:"%SELECTION%" file.txt
或使用/X
开关(整行):
FINDSTR /L /X /C:"%SELECTION%" file.txt
未记录但受支持的 findstr
功能:您可以将开关与单个 /
:
结合使用
FINDSTR /LXC:"%SELECTION%" file.txt
也许您还想使用 /i
开关(I忽略大写)来查找 blue
、Blue
、BLUE
等:
FINDSTR /ILXC:"%SELECTION%" file.txt
我创建批处理 (.bat)
脚本,其中我使用 findstr
和 if / else
语句。
效果好的部分:
- 如果我键入一个与要搜索的文件中的一行相匹配的有效字符串,它会将我带到
IF
<- 这没问题 - 如果我键入无效字符串,它会将我带到
ELSE
<- 这没关系
不好的部分:
如果我键入 点的 而不是字母( 相同长度 ),它会将我带到
IF
。比如我输入....
,字符数匹配字符串blue
为什么?这些点与我文件中的任何字符串都不匹配,所以我应该转到
ELSE
。我的代码有什么问题?
我的searchable_file.xml
:
dev
current
old
stable
oldest
newest
blue
green
我的 findstr
脚本:
SET /P SELECTION=
FINDSTR /R /C:"^%SELECTION%$" searchable_file.xml > NUL
IF NOT ERRORLEVEL 1 (
ECHO [OK] The value entered is valid.
) ELSE (
ECHO [ERROR] The path entered does not exist. Try again.
)
findstr
命令将 .
视为通配符,因此在字符串中搜索点将 return 任何字符数与点数相同的单词。例如,在 the
中搜索 t.e
将 return the
。如果您搜索 .*
,它会 return 几乎所有内容,因为 *
允许通配符匹配任意次数。您应该能够使用反斜杠转义通配符,例如 \.\.\.
只会搜索点而不是其他字符。
Reference
FINDSTR /R /C:"^%SELECTION%$" file.txt
中的/R
表示使用REGEX(点作为通配符)。只是删除 /R
是没有用的,因为它无论如何都是标准的。将其替换为 /L
(Literal)。
当然这意味着,“行首”的 ^
和“行尾”的 $
将不再起作用(它们是正则表达式),但您可以添加 /B
(B行首)和/E
(E行首)改为:
FINDSTR /L /B /E /C:"%SELECTION%" file.txt
或使用/X
开关(整行):
FINDSTR /L /X /C:"%SELECTION%" file.txt
未记录但受支持的 findstr
功能:您可以将开关与单个 /
:
FINDSTR /LXC:"%SELECTION%" file.txt
也许您还想使用 /i
开关(I忽略大写)来查找 blue
、Blue
、BLUE
等:
FINDSTR /ILXC:"%SELECTION%" file.txt