Пакетный файл: найдите, если подстрока находится в строке (не в файле)

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

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

Есть ли для этого легкое решение?

Ответ 1

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

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

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

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

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

@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 работает нормально. Он также защищает от некоторых "неправильных" стартовых символов.

Ответ 2

Вы можете передать исходную строку в 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

Ответ 3

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

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

Я не знаю, лучший ли это.

Ответ 4

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

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

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

(Какая боль! Всего 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" )

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

Ответ 5

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

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 Query для служб обновления Windows, который выводится как многострочный текст, находит строку, содержащую "состояние", затем находит, если слово "работает" происходит в этой строке и соответственно устанавливает уровень ошибок.

Ответ 6

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

set "i=hello " world"
set i|find """" >nul && echo contains || echo not_contains

Ответ 7

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

Для динамического поиска вы должны сделать это:

SET searchString=abcd1234
SET key=cd123

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

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

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

Ответ 8

ECHO %String%| FINDSTR /C:"%Substring%" && (Instructions)