Узнайте, содержит ли переменная окружения подстроку - PullRequest
14 голосов
/ 30 марта 2011

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

27 голосов
/ 30 марта 2011

Конечно, просто используйте старый добрый 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.
)

Редактировать: Обратите также внимание на решение Джеба , которое более лаконично, хотя для выяснения того, что он делает при чтении, требуется дополнительный умственный шаг.

24 голосов
/ 31 марта 2011

Решение 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 голосов
/ 11 августа 2014

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

1 голос
/ 08 февраля 2017

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

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

Пример:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...