Windows批量检查变量是否以,以...结尾并包含特定字符串

时间:2013-03-29 16:53:56

标签: windows if-statement batch-file cmd equals

我正在尝试检查批处理文件中的变量是否以某个"包含BETA开头,并以")结尾。

有可能吗? 如果是的话,有人可以帮我吗?

3 个答案:

答案 0 :(得分:11)

假设您的变量不包含任何换行符或回车符,那么所需的只是一个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通过。

/R选项强制将搜索字符串视为正则表达式。

/X选项意味着它必须完全匹配 - 整个字符串必须与搜索字符串匹配。

.*是正则表达式通配符表达式,它将匹配任何字符串。

我将FINDSTR输出重定向到NUL,因为我们不需要查看该行。我们只想要返回代码

FINDSTR要求将双引号文字转义为\"

使用延迟扩展,以便您可以安全地回显变量中的任何值。

我使用&&在FINDSTR成功时有条件地采取行动,||在FINDSTR失败时有条件地采取行动。

我的:TEST例程将变量的名称作为唯一参数。

请注意,在某些情况下,批处理解析器要求您还将双引号转义为^",这意味着完全转义的引号将显示为\^"。但是在你的情况下不需要这种复杂情况。 FINDSTR逃逸规则实际上有点不稳定。有关详细信息,请参阅What are the undocumented features and limitations of the Windows FINDSTR command?

我的测试代码执行区分大小写的搜索。因此betaBETA不匹配。如果您想要不区分大小写的搜索,只需添加/I选项。

编辑: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在最后检查")。唯一棘手的事情是弄清楚当它具有奇数引号时如何转义比较字符串。

答案 1 :(得分:4)

@ECHO OFF
SETLOCAL
SET var=abc&CALL :check
SET var="abc"&CALL :llcheck
SET var="")&CALL :check
SET var=")"&CALL :llcheck
SET var=abc")"&CALL :llcheck
SET var=xyzbetazyx&CALL :check
SET var="xyzbetazyx"&CALL :llcheck
SET var=xyzbetazyx")"&CALL :llcheck
SET var=xyzbetazyx")"&CALL :check
SET var="xyzbetazyx")&CALL :check
GOTO :eof
:: Lop last, then check
:llcheck
SET var=%var:~0,-1%
:check
SET result=N
SET var2=%var%
SET varvar=%var%

>test1.txt ECHO %var:~0,1%%var:~-2%
>test2.txt ECHO "")
FC test1.txt test2.txt >nul
IF ERRORLEVEL 1 GOTO done
SET var|FINDSTR /b "var="|FINDSTR /i "beta" >nul
IF ERRORLEVEL 1 GOTO done
SET result=Y
:done
ECHO %var% starts " has BETA and ends ") : %result% 
GOTO :eof

哪里有遗嘱......

使用不平衡"设置变量可能会非常棘手。我只是将它设置为平衡并且丢掉最后一个字符(:llcheck条目:lop last并检查。

基本上,我已将变量复制到oder中的var2varvar,以演示如果设置这些变量名会发生什么。

然后生成两个文件。 TEST1.TXT包含varTEST2.TXT的第一个和后两个字符"")

比较两者 - 如果它们不相同,则变量不会启动"并结束")否则很好 - 可能只是将var写入文件并使用findstr要查找beta,但我决定发送SET var的输出,该输出应该是ALL形式的var*变量的内容

var=abc
var2=abc
varvar=abc

进入findstr,找到一个开始(/bvar=并查找 THAT 是否包含字符串beta /i选择案例不敏感的。如果您希望在大写字母中专门BETA,只需将beta更改为BETA并删除/i

result设置为YN

答案 2 :(得分:2)

@echo off
setlocal EnableDelayedExpansion
set quote="
set variable="This must be true: BETA")
echo Variable=!variable!
if "!variable:~0,1!" equ "!quote!" (
   rem Start with "
   if "!variable:BETA=!" neq "!variable!" (
      rem Contains BETA
      if "!variable:~-2!" equ "!quote!^)" (
         echo TRUE: it start with " contains BETA and ends with "^)
      ) else (
         echo FALSE, it does not ends with "^)
      )
   ) else (
      echo FALSE, it does not contain BETA
   )
) else (
   echo FALSE, it does not start with "
)

输出:

Variable="This must be true: BETA")
TRUE: it start with " contains BETA and ends with ")
  • 处理不平衡报价(以及其他特殊批处理字符)的方法是使用延迟扩展:这样引号和特殊字符不会出现在正在解析的命令行中。

  • 请记住要使用^任何右括号转义,这些括号不是关闭命令块的括号。

  • 检查变量是否包含给定字符串的简单方法是尝试从变量值中消除字符串:如果结果与原始值不同,则变量包含字符串。

    < / LI>

安东尼奥