Узнайте, содержит ли переменная среды подстроку
Мне нужно выяснить, содержит ли некоторая переменная окружения (скажем, Foo) подстроку (скажем, BAR) в пакетном файле Windows. Есть ли способ сделать это, используя только команды пакетного файла и / или программы / команды, установленные по умолчанию с 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 ответа
Конечно, просто используйте старый добрый findstr:
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.
)
Редактировать: принять к сведению решение Джеба, который является более лаконичным, хотя ему требуется дополнительный умственный шаг, чтобы выяснить, что он делает при чтении.
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
@mythofechelon:%var:str=% part удаляет str из var. Таким образом, если var содержит str в левой части уравнения, оно будет удалено в правой части - таким образом, уравнение приведет к "false", если str был найден в var, или "true", если str не присутствовал в var.
Я написал эту функцию для хорошей интеграции скриптов. Код выглядит лучше, и его также легче запомнить. Эта функция основана на ответе Джои на этой странице. Я знаю, что это не самый быстрый код, но он, кажется, работает очень хорошо для того, что мне нужно сделать.
Просто скопируйте код функции в конце вашего скрипта, и вы можете использовать его, как в этом примере здесь:
Пример:
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