假设您的变量不包含任何换行符或回车符,那么所需要的只是一个 FINDSTR 命令。它具有有限的正则表达式支持,足以解决这个问题。
@echo off
setlocal
set test1=abc
set test2="abc"
set test3="")
set test4=")"
set test5=abc")"
set test6=xyzBETAzyx
set test7="xyz BETA zyx"
set test8=xyzBETAzyx")"
set test9=xyzBETAzyx")"
set test10="xyzbetazyx")
set test11="xyzBETAzyx")
for /l %%N in (1 1 11) do call :test test%%N
exit /b
:test variableName
setlocal enableDelayedExpansion
echo !%1!|>nul findstr /rx \".*BETA.*\") && set "result=PASS" || set "result=FAIL"
echo %1 = !result!: !%1!
exit /b
仅 TEST11 通过。
The /R
选项强制将搜索字符串视为正则表达式。
The /X
选项意味着它必须是完全匹配 - 整个字符串必须与搜索字符串匹配。
.*
是将匹配任何字符串的正则表达式通配符表达式。
我将 FINDSTR 输出重定向到 NUL,因为我们不需要查看该行。我们只想要返回码
FINDSTR 需要将双引号文字转义为\"
使用延迟扩展,以便您可以安全地回显变量内的任何值。
I use &&
当 FINDSTR 成功时有条件地采取行动,并且||
当 FINDSTR 失败时有条件地采取行动。
My :TEST
例程将变量的名称作为唯一的参数。
请注意,在某些情况下,批处理解析器还要求您将双引号转义为^"
,这意味着完全转义的引用看起来像\^"
。但在你的情况下不需要这种复杂化。 FINDSTR 转义规则实际上有点不稳定。看Windows FINDSTR 命令有哪些未记录的功能和限制?了解更多信息。
我的测试代码进行区分大小写的搜索。所以beta
不会匹配BETA
。如果您想要不区分大小写的搜索,只需添加/I
option.
编辑:2015-07-22
当且仅当您想忽略大小写时,另一种选择是结合使用变量扩展搜索/替换和扩展子字符串操作。下面的test10和test11都通过了。
@echo off
setlocal
set test1=abc
set test2="abc"
set test3="")
set test4=")"
set test5=abc")"
set test6=xyzBETAzyx
set test7="xyz BETA zyx"
set test8=xyzBETAzyx")"
set test9=xyzBETAzyx")"
set test10="xyzbetazyx")
set test11="xyzBETAzyx")
for /l %%N in (1 1 11) do call :test test%%N
exit /b
:test variableName
setlocal enableDelayedExpansion
set "result=FAIL"
if "!%1:beta=!" neq "!%1!" if "!%1:~0,1!" equ ^""" if "!%1:~-2!" equ ^"")" set "result=PASS"
echo %1 = !result!: !%1!
exit /b
第一个 IF 检查beta
任何地方(不区分大小写)。第二个 IF 检查"
在开始处,最后一个 IF 检查")
在最后。唯一棘手的事情是弄清楚当比较字符串具有奇数个引号时如何转义。