Bra*_*one 9 windows cmd if-statement equals batch-file
我正在尝试检查批处理文件中的变量是否以"
包含BETA
某个地方开头并以其结尾")
.
可能吗?如果是的话,有人可以帮助我吗?
dbe*_*ham 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
Run Code Online (Sandbox Code Playgroud)
只有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
Run Code Online (Sandbox Code Playgroud)
第一个IF检查beta
任何地方(不区分大小写).第二个IF "
在开始时检查,最后一个IF在最后检查")
.唯一棘手的事情是弄清楚当它具有奇数引号时如何转义比较字符串.
@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
Run Code Online (Sandbox Code Playgroud)
哪里有意志...
设置不平衡的变量"
可能很棘手。我只是将其设置为平衡并删除了最后一个字符(:llcheck
条目:删除最后并检查。
本质上,我已将变量复制到var2
并varvar
演示如果设置这些变量名会发生什么。
然后生成两个文件。TEST1.TXT
包含 的第一个和最后 2 个字符var
并且TEST2.TXT
简单地"")
比较两者 - 如果它们不相同,则变量不会开始"
和结束")
否则很好 - 可以简单地写出var
到文件并用于findstr
find beta
,但我决定发送其输出SET var
,其内容应该ALL
是var*
表格中的变量
var=abc
var2=abc
varvar=abc
Run Code Online (Sandbox Code Playgroud)
/b
进入 findstr,查找以 ( )开头的那个var=
并查找该字符串是否包含字符串beta
The/i
选择,不区分大小写。如果您想要专门BETA
使用大写字母,只需更改beta
为BETA
并删除/i
.
result
设置为Y
或N