Узнайте, содержит ли переменная окружения подстроку

Мне нужно выяснить, содержит ли определенная переменная среды (скажем, Foo) подстроку (пусть говорят 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"?

Ответ 1

Конечно, просто используйте добрую старую findstr:

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

Вместо echo ing вы также можете входить в другое место там, но я думаю, что если вам нужно несколько операторов на основе этого, проще:

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

Изменить: Обратите внимание на jeb solution, что является более кратким, хотя для этого необходим дополнительный умственный шаг, чтобы выяснить, что это при чтении.

Ответ 2

Решение 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

Ответ 3

@mythofechelon:% var: str =% part удаляет str из var. Поэтому, если var содержит str в левой части уравнения, он будет удален с правой стороны - таким образом, уравнение приведет к "false", если str была найдена в var или "true", если str не присутствовала в var.

Ответ 4

Я написал эту функцию для приятной интеграции script. Код выглядит лучше, и его также легче запомнить. Эта функция основана на ответе Джо на этой странице. Я знаю, что это не самый быстрый код, но, похоже, он очень хорошо работает для того, что мне нужно делать.

Просто скопируйте код функции в конце вашего script, и вы можете использовать его, как в этом примере:

Пример:

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