Пакетный файл: Найти, если подстрока в строке (не в файле) - PullRequest
181 голосов
/ 10 августа 2011

В командном файле у меня есть строка abcdefg.Я хочу проверить, есть ли в строке bcd.

К сожалению, кажется, что все решения, которые я нахожу, ищут файл для подстроки, а не строку для подстроки.

Существует ли простое решение для этого

Ответы [ 8 ]

261 голосов
/ 10 августа 2011

Да, вы можете использовать подстановки и сверяться с исходной строкой:

if not x%str1:bcd=%==x%str1% echo It contains bcd

Бит %str1:bcd=% заменит bcd in str1 пустой строкой, что сделает его отличным оторигинал.

Если в оригинале не было строки bcd, измененная версия будет идентичной.

Тестирование с использованием следующего скрипта покажет его в действии:

@setlocal enableextensions enabledelayedexpansion
@echo off
set str1=%1
if not x%str1:bcd=%==x%str1% echo It contains bcd
endlocal

И результаты различных прогонов:

c:\testarea> testprog hello

c:\testarea> testprog abcdef
It contains bcd

c:\testarea> testprog bcd
It contains bcd

Пара замечаний:

  • Оператор if является основой этого решения, все остальноеявляется вспомогательным материалом.
  • x перед двумя сторонами равенства состоит в том, чтобы строка bcd работала нормально.Он также защищает от некоторых «неправильных» стартовых символов.
100 голосов
/ 28 августа 2011

Вы можете передать исходную строку на findstr и проверить значение ERRORLEVEL, чтобы увидеть, была ли найдена строка шаблона.Нулевое значение указывает на успех, и шаблон был найден.Вот пример:

::
: Y.CMD - Test if pattern in string
: P1 - the pattern
: P2 - the string to check
::
@echo off

echo.%2 | findstr /C:"%1" 1>nul

if errorlevel 1 (
  echo. got one - pattern not found
) ELSE (
  echo. got zero - found pattern
)

Когда это выполняется в CMD.EXE, мы получаем:

C:\DemoDev>y pqrs "abc def pqr 123"
 got one - pattern not found

C:\DemoDev>y pqr "abc def pqr 123" 
 got zero - found pattern
41 голосов
/ 12 января 2014

Я обычно делаю что-то вроде этого:

Echo.%1 | findstr /C:"%2">nul && (
    REM TRUE
) || (
    REM FALSE
)

Пример:

Echo.Hello world | findstr /C:"world">nul && (
    Echo.TRUE
) || (
    Echo.FALSE
)

Echo.Hello world | findstr /C:"World">nul && (Echo.TRUE) || (Echo.FALSE)

Вывод:

TRUE
FALSE

Я не знаю, является ли этолучший способ.

18 голосов
/ 28 августа 2014

Для совместимости и простоты использования часто лучше использовать FIND для этого.

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

Метод с78 баллов (я думаю, что я имел в виду пост Паксдиабло) будут соответствовать только регистру, поэтому вы должны поставить отдельную проверку для каждого варианта регистра для каждой возможной итерации, которую вы можете захотеть найти.

(Какая боль!Всего 3 буквы, что означает 9 различных тестов для выполнения проверки!)

Кроме того, во многих случаях предпочтительнее сопоставлять выходные данные команды, переменную в цикле или значение переменной-указателя вВаша партия / CMD не так просты.

По этим причинам это предпочтительная альтернативная методология:

Использование: Найти [/ I] [/ V] "Соответствующие символы"

[/ I] (без учета регистра) [/ V] (НЕ ДОЛЖНО содержать символы)

как одна строка:

ECHO.%Variable% | FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" )

многострочный:

ECHO.%Variable%| FIND /I "ABC">Nul && ( 
  Echo.Found "ABC"
) || (
  Echo.Did not find "ABC"
)

как мужчиныЭто хорошо для вещей, которые не входят в переменные, которые также допускают подстановку строк:

FOR %A IN (oihu AljB lojkAbCk) DO ( ECHO.%~A| FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" ) )

Вывод из команды:

NLTest | FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" )

Как видите, это лучший способобрабатывать чек по нескольким причинам.

9 голосов
/ 11 февраля 2015

Если вы обнаруживаете присутствие, вот самое простое решение:

SET STRING=F00BAH
SET SUBSTRING=F00
ECHO %STRING% | FINDSTR /C:"%SUBSTRING%" >nul & IF ERRORLEVEL 1 (ECHO CASE TRUE) else (ECHO CASE FALSE)

Это прекрасно работает для сброса вывода команд Windows в логическую переменную. Просто замените эхо командой, которую хотите запустить. Вы также можете связать Findstr вместе, чтобы дополнительно квалифицировать оператор, используя каналы. НАПРИМЕР. для управления службами (SC.exe)

SC QUERY WUAUSERV | findstr /C:"STATE" | FINDSTR /C:"RUNNING" & IF ERRORLEVEL 1 (ECHO case True) else (ECHO CASE FALSE)

Тот, кто оценивает выходные данные запроса SC для служб обновления Windows, который выходит в виде многострочного текста, находит строку, содержащую «состояние», затем находит, встречается ли слово «выполняется» в этой строке, и соответственно устанавливает уровень ошибки. 1007 *

1 голос
/ 17 января 2019

Я, вероятно, опоздаю с этим ответом, но принятый ответ работает только для проверки, является ли "жестко закодированная строка" частью строки поиска.вам придется сделать это:

SET searchString=abcd1234
SET key=cd123

CALL SET keyRemoved=%%searchString:%key%=%%

IF NOT "x%keyRemoved%"=="x%searchString%" (
    ECHO Contains.
)

Примечание: вы можете взять две переменные в качестве аргументов.

1 голос
/ 16 сентября 2018

Лучший ответ был здесь :

set "i=hello " world"
set i|find """" >nul && echo contains || echo not_contains
0 голосов
/ 26 апреля 2019
ECHO %String%| FINDSTR /C:"%Substring%" && (Instructions)
...