Windows批量检查variables是否以“开头”结束,并包含特定的string

我试图检查一个batch file中的variables是否以"包含BETA并以")结尾")

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

Solutions Collecting From Web of "Windows批量检查variables是否以“开头”结束,并包含特定的string"

 @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:llcheck entry:lop last并检查。

Essentiall,我已经复制变量到var2varvar在oder来演示如果这些变量名被设置会发生什么。

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

比较这两个 – 如果它们不相同,那么变量不会开始"和结束")否则很好 – 可以简单地写出var到一个文件,并使用findstr来找到beta ,但我决定发送SET var的输出SET var应该是表单中ALL var*变量的内容

 var=abc var2=abc varvar=abc 

找到一个开始( /bvar=并找出是否包含字符串beta /i选择不区分大小写。 如果你想在大写的特定的BETA ,只需将beta BETA更改为BETA并删除/i

result设置为YN

假设您的变量不包含任何换行或回车,那么所需的只是一个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失败时有条件地采取行动。

My :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 

第一个IF检查任何地方的beta (不区分大小写)。 第二个IF在最后检查")开始,最后一个IF检查") 。 唯一棘手的事情是搞清楚如何在引用奇数时逃避比较字符串。

 @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 ") 
  • 处理不平衡的引号(和其他特殊的批处理字符)的方法是使用Delayed Expansion:这样引号和特殊字符就不会出现在被解析的命令行中。

  • 请记住要使用任何没有关闭命令块括号的右括号。

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

安东尼奥