Узнайте, содержит ли переменная окружения подстроку
Мне нужно выяснить, содержит ли определенная переменная среды (скажем, 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