it-roy-ru.com

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

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

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

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

179
Ben

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

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

Бит %str1:bcd=% заменит bcd в 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 работала нормально. Он также защищает от определенных "неправильных" стартовых персонажей.
260
paxdiablo

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

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

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

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

41
user839791

Для совместимости и простоты использования часто лучше использовать 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" )

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

17
Ben Personick

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

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

9
byorking

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

set "i=hello " world"
set i|find """" >nul && echo contains || echo not_contains
1
T.Todua

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

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

SET searchString=abcd1234
SET key=cd123

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

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

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

1
Andy Sug
ECHO %String%| FINDSTR /C:"%Substring%" && (Instructions)
0
Riccardo La Marca