找出环境变量是否包含子字符串

时间:2011-03-30 19:38:21

标签: windows batch-file

我需要找出某个环境变量(比方说Foo)是否在Windows批处理文件中包含子字符串(比如说BAR)。有没有办法只使用批处理文件命令和/或默认安装的程序/命令与Windows?

例如:

set Foo=Some string;something BAR something;blah

if "BAR" in %Foo% goto FoundIt     <- What should this line be? 

echo Did not find BAR.
exit 1

:FoundIt
echo Found BAR!
exit 0

上面标记的行应该使这个简单的批处理文件打印“Found BAR”?

4 个答案:

答案 0 :(得分:27)

当然,只需使用好的旧发现者:

echo.%Foo%|findstr /C:"BAR" >nul 2>&1 && echo Found || echo Not found.

而不是echo你也可以在那里分支,但我想如果你需要多个语句,那么下面的内容会更容易:

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

编辑:注意jeb's solution也更简洁,虽然需要额外的心理步骤来弄清楚它在阅读时的作用。

答案 1 :(得分:23)

findstr解决方案有效,它有点慢,在我看来findstr你在一个方向盘上打破了一只蝴蝶。

简单的字符串替换也应该起作用

if "%foo%"=="%foo:bar=%" (
    echo Not Found
) ELSE (
    echo found
)

或使用反逻辑

if NOT "%foo%"=="%foo:bar=%" echo FOUND

如果比较的两边不相等,则变量内必须有文本,因此删除了搜索文本。

小样本如何扩展该行

set foo=John goes to the bar.
if NOT "John goes to the bar."=="John goes to the ." echo FOUND

答案 2 :(得分:3)

@mythofechelon:%var:str =%part从 var 中删除 str 。因此,如果 var 在等式的左侧包含 str ,它将在右侧被移除 - 因此如果 str,等式将导致“假”如果 str 中没有 str ,则 var 中的或“true”。

答案 3 :(得分:1)

我为一个很好的脚本集成编写了这个函数。代码看起来更好,也更容易记住。此功能基于Joey在此页面上的答案。我知道这不是最快的代码,但它似乎对我需要做的事情非常有效。

只需复制脚本末尾的函数代码,就可以像这个示例一样使用它:

示例:

set "Main_String=This is just a test"
set "Search_String= just "

call :FindString Main_String Search_String

if "%_FindString%" == "true" (
    echo String Found
) else (
    echo String Not Found
)

请注意,在将变量赋予此函数时,您无需为变量添加%,它会自动处理此变量。 (这是我发现的一种方法,它允许我在函数的参数/变量中使用空格而不需要在其中使用不受欢迎的引号。)

功能:

:FindString

rem Example:
rem 
rem set "Main_String=This is just a test"
rem set "Search_String= just "
rem 
rem call :FindString Main_String Search_String
rem 
rem if "%_FindString%" == "true" echo Found
rem if "%_FindString%" == "false" echo Not Found

SETLOCAL

for /f "delims=" %%A in ('echo %%%1%%') do set str1=%%A
for /f "delims=" %%A in ('echo %%%2%%') do set str2=%%A

echo.%str1%|findstr /C:"%str2%" >nul 2>&1
if not errorlevel 1 (
   set "_Result=true"
) else (
   set "_Result=false"
)

ENDLOCAL & SET _FindString=%_Result%
Goto :eof