Ответы:
Да, вы можете использовать подстановки и проверить исходную строку:
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 , в течение долгого времени.