我需要找出某个环境变量(比方说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”?
答案 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