Проверить строку для подстроки в командном файле (Windows)? - PullRequest
19 голосов
/ 06 января 2012

Допустим, у меня есть текст в переменной с именем $ 1. Теперь я хочу проверить, содержит ли этот $ 1 определенную строку. Если он содержит определенную строку, я хочу напечатать сообщение. С печатью не проблема, проблема с проверкой ... идеи как это сделать?

Ответы [ 3 ]

20 голосов
/ 04 ноября 2013

Самый простой способ, на мой взгляд, заключается в следующем:

set YourString=This is a test

If NOT "%YourString%"=="%YourString:test=%" (
    echo Yes
) else (
    echo No
)

По сути, строка после ':' - это искомая строка, которую вы используете, а не перед if потому что% string: *% удалит * из строки, делая их не равными.

9 голосов
/ 06 января 2012

Уловка поиска и замены SET работает во многих случаях, но она не поддерживает регистрозависимый поиск или поиск по регулярным выражениям.

Если вам нужен регистрозависимый поиск или ограниченная поддержка регулярных выражений, вы можете использовать FINDSTR.

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

Вы можете передать $ 1 в команду FINDSTRс помощью команды ECHO.Используйте ECHO( в случае, если $ 1 не определено, и будьте осторожны, чтобы не добавлять лишние пробелы.ECHO !$1! отобразит ECHO is off. (или включит), если $ 1 не определено, тогда как ECHO(!$1! выведет пустую строку, если не определено.

FINDSTR отобразит $ 1, если найдет строку поиска - вы не будетехотите, чтобы вы перенаправили вывод на nul.FINDSTR устанавливает ERRORLEVEL в 0, если строка поиска найдена, и в 1, если она не найдена.Это то, что используется для проверки, была ли найдена строка.&& и || - это удобный синтаксис для проверки соответствия (ERRORLEVEL 0) или отсутствия соответствия (ERRORLEVEL not 0)

Поддержка регулярных выражений является элементарной, но все же полезной.

См. FINDSTR /?для получения дополнительной информации.

Этот пример регулярного выражения будет искать $ 1 для «BEGIN» в начале строки, «MID» в любом месте посередине и «END» в конце.По умолчанию в поиске учитывается регистр.

set "search=^BEGIN.*MID.*END$"
setlocal enableDelayedExpansion
echo(!$1!|findstr /r /c:"!search!" >nul && (
  echo FOUND
  rem any commands can go here
) || (
  echo NOT FOUND
  rem any commands can go here
)
2 голосов
/ 06 января 2012

Насколько я знаю, cmd.exe не имеет встроенной функции, которая отвечает на ваш вопрос напрямую.Но он поддерживает операцию замены.Итак, хитрость в том, что в вашем $ 1 замените подстроку, которую вам нужно проверить, на наличие пустой строки, затем проверьте, изменился ли $ 1.Если это так, то содержит содержит подстроку (в противном случае операции замены было бы вообще нечего заменить!).Смотрите код ниже:

set longString=the variable contating (or not containing) some text

@rem replace xxxxxx with the string you are looking for
set tempStr=%longString:xxxxxx=%

if "%longString%"=="%tempStr%" goto notFound
echo Substring found!
goto end

:notFound
echo Substring not found

:end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...