Відповіді:
Так, ви можете використовувати підстановки та перевіряти початкові рядки:
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 пунктами (я вважаю, що я мав на увазі допис paxdiablo) буде відповідати лише випадку Case Sensitively, тому ви повинні поставити окрему перевірку для кожного варіанту випадку на кожну можливу ітерацію, яку ви хочете відповідати.
(Який біль! Усього 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's разом, щоб додатково кваліфікувати заяву за допомогою pipe. EG для управління сервісом (SC.exe)
SC QUERY WUAUSERV | findstr /C:"STATE" | FINDSTR /C:"RUNNING" & IF ERRORLEVEL 1 (ECHO case True) else (ECHO CASE FALSE)
Цей оцінює вихід запиту SC для служб оновлення 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 , в протягом довгого часу.