Ответы:
Да, вы можете использовать подстановки и проверить исходную строку:
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
работает нормально. Он также защищает от определенных «неправильных» стартовых персонажей.Вы можете передать исходную строку 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
Я обычно делаю что-то вроде этого:
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
Я не знаю, если это лучший способ.
Для совместимости и простоты использования часто лучше использовать 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 (
"Some long string with Spaces does not contain the expected string"
oihu AljB
lojkAbCk
Something_Else
"Going to evaluate this entire string for ABC as well!"
) DO (
ECHO.%~A| FIND /I "ABC">Nul && (
Echo.Found "ABC" in "%A"
) || ( Echo.Did not find "ABC" )
)
Output From a command:
NLTest | FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" )
As you can see this is the superior way to handle the check for multiple reasons.
setlocal EnableExtensions
затем IF /I
для сравнения без учета регистра.
Если вы обнаруживаете присутствие, вот самое простое решение:
SET STRING=F00BAH
SET SUBSTRING=F00
ECHO %STRING% | FINDSTR /C:"%SUBSTRING%" >nul & IF ERRORLEVEL 1 (ECHO CASE TRUE) else (ECHO CASE FALSE)
Это прекрасно работает для сброса вывода команд Windows в логическую переменную. Просто замените эхо командой, которую хотите запустить. Вы также можете связать Findstr вместе, чтобы дополнительно квалифицировать оператор, используя каналы. EG для управления службами (SC.exe)
SC QUERY WUAUSERV | findstr /C:"STATE" | FINDSTR /C:"RUNNING" & IF ERRORLEVEL 1 (ECHO case True) else (ECHO CASE FALSE)
Тот оценивает выходные данные SC Query для служб обновления Windows, которые появляются в виде многострочного текста, находит строку, содержащую «состояние», затем находит, встречается ли слово «выполняется» в этой строке, и соответственно устанавливает уровень ошибки.
SET STRING=abcdefgh SET SUBSTRING=bcd ECHO %STRING% | FINDSTR /C:"%SUBSTRING%" >nul & IF ERRORLEVEL 1 (ECHO CASE FALSE) else (ECHO CASE TRUE)
Возможно, я слишком поздно приду с этим ответом, но принятый ответ работает только для проверки, является ли «жестко закодированная строка» частью строки поиска.
Для динамического поиска вы должны сделать это:
SET searchString=abcd1234
SET key=cd123
CALL SET keyRemoved=%%searchString:%key%=%%
IF NOT "x%keyRemoved%"=="x%searchString%" (
ECHO Contains.
)
Примечание: вы можете взять две переменные в качестве аргументов.
Лучший ответ был здесь :
set "i=hello " world"
set i|find """" >nul && echo contains || echo not_contains
ECHO %String%| FINDSTR /C:"%Substring%" && (Instructions)
Решения, которые ищут файл для подстроки, могут также искать строку , например. find
или findstr
.
В вашем случае простое решение было бы передать строку в команду вместо указания имени файла, например.
чувствительная к регистру строка:
echo "abcdefg" | find "bcd"
игнорировать регистр строки:
echo "abcdefg" | find /I "bcd"
Если совпадение не найдено, вы получите пустой ответ на CMD, и% ERRORLEVEL% будет установлен в 1
Windows
иcmd
или этоms-dos
. MSDOS не является частью Windows , в течение долгого времени.