如何在Windows批处理文件中检查变量是否包含另一个变量?

20
假设以下批处理文件。
set variable1=this is variable1
set variable2=is
set variable3=test

if variable1 contains variable2 (
    echo YES
) else (
    echo NO
)

if variable1 contains variable3 (
    echo YES
) else (
    echo NO
)

我希望输出结果为“是”后面跟着一个“不是”。

4个回答

22

我用以下方法解决了这个问题。

setLocal EnableDelayedExpansion

set variable1=this is variable1
set variable2=is
set variable3=test

if not "x!variable1:%variable2%=!"=="x%variable1%" (
    echo YES
) else (
    echo NO
)

if not "x!variable1:%variable3%=!"=="x%variable1%" (
    echo YES
) else (
    echo NO
)

endlocal

我从以下回答中得到了基本的思路,但它不是通过变量搜索,所以它并不完全是我要找的东西。

批处理文件:查找字符串是否在字符串中(而不是在文件中)


6

另一种方式:

echo/%variable1%|find "%variable2%" >nul
if %errorlevel% == 0 (echo yes) else (echo no)

/符号的作用是防止在%variable1%为空的情况下输出Echo is ONEcho is OFF


这对于变量1=/?、变量1=on和变量1=off都会失败。考虑使用echo foobar %variable1%|find "%variable2%" >nul,但对于变量2=foobar也会失败。 - GKFX

4

对我来说,Gary Brunton的回答并没有起作用。

如果你尝试使用set variable1="C:\Users\My Name\",你最终会遇到一个错误:

 'Name\""' is not recognized as an internal or external command

参考这个答案(查找环境变量是否包含子字符串),我最终得到了以下代码:

echo.%variable1%|findstr /C:"%variable2%" >nul 2>&1
if not errorlevel 1 (
   echo Found
) else (
   echo Not found
)

0
以下内容基于此主题中JBE的回答,它区分空/未定义变量。
if not defined VARIABLE1 (echo VARIABLE1 undefined) & goto proceed
if not defined VARIABLE2 (echo VARIABLE2 undefined) & goto proceed
echo %VARIABLE1% | find "%VARIABLE2%" > nul
if ERRORLEVEL 1 (echo Not found) & goto proceed
echo Found
:proceed

如果VARIABLE1的值包含括号,例如C:\Program Files (x86),则括号可能被解释为一个不同的命令而非回显,导致出现错误。类似于(x86)这样的子字符串可以通过使用插入符进行转义以便正确回显,例如:
SET V1_DISPLAY=%VARIABLE1%
if /i "%V1_DISPLAY:(x86)=%" NEQ "%V1_DISPLAY%" set V1_DISPLAY=%V1_DISPLAY:(x86)=^^(x86^^)%
echo %V1_DISPLAY% | find "%VARIABLE2%" > nul

第二个语句可以这样理解:
如果用空字符串替换子字符串 (x86) 有所不同,那么 (x86) 存在,因此将任何出现的 (x86) 替换为 ^^(x86^^),其中每对脱字符号表示一个转义的单个脱字符号。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接