9

我正在尝试检查批处理文件中的变量是否以"contains开头BETA并以").

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

4

3 回答 3

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 转义规则实际上有点不稳定。请参阅Windows FINDSTR 命令有哪些未记录的功能和限制?了解更多信息。

我的测试代码执行区分大小写的搜索。所以beta不会匹配BETA。如果您想要不区分大小写的搜索,则只需添加该/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

The first IF checks for beta anywhere (case insensitive). The second IF checks for " at the beginning, and the last IF checks for ") at the end. The only tricky thing is figuring out how to escape the comparison string when it has an odd number of quotes.

于 2013-03-31T15:04:04.340 回答
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

哪里有意愿...

设置不平衡的变量"可能很棘手。我只是将其设置为平衡并删除了最后一个字符(:llcheckentry : lop last 并检查。

本质上,我已经将变量复制到var2varvar演示了如果设置这些变量名会发生什么。

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

比较两者 - 如果它们不相同,那么变量不会开始"和结束")否则很好 - 可能只是写出var一个文件并用于findstrfind beta,但我决定发送的输出SET var应该是的ALL内容表格中的var*变量

var=abc
var2=abc
varvar=abc

进入 findstr,查找以 ( /b)开头的那个,var=并查找THAT是否包含字符串选择不区分大小写。如果您特别想要大写,只需更改并删除.beta/iBETAbetaBETA/i

result设置为YN

于 2013-03-29T18:00:12.363 回答
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 ")
  • 处理不平衡引号(以及其他特殊批处理字符,实际上)的方法是使用延迟扩展:这样引号和特殊字符不会出现在正在解析的命令行中。

  • 请记住用 ^ 转义任何不是命令块右括号的右括号。

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

安东尼奥

于 2013-03-29T18:49:07.627 回答