Odpowiedzi:
Tak, możesz użyć podstawień i sprawdzić oryginalny ciąg:
if not x%str1:bcd=%==x%str1% echo It contains bcd
%str1:bcd=%
Nieco zastąpi bcd
w str1
pustym ciągiem, co różni się od oryginału.
Jeśli oryginał nie zawierał bcd
łańcucha, zmodyfikowana wersja będzie identyczna.
Testowanie przy użyciu następującego skryptu pokaże go w akcji:
@setlocal enableextensions enabledelayedexpansion
@echo off
set str1=%1
if not x%str1:bcd=%==x%str1% echo It contains bcd
endlocal
I wyniki różnych przebiegów:
c:\testarea> testprog hello
c:\testarea> testprog abcdef
It contains bcd
c:\testarea> testprog bcd
It contains bcd
Kilka uwag:
if
Stwierdzenie jest mięso z tego rozwiązania, wszystko inne jest wsparcie rzeczy.x
Przed dwóch stronach równości jest zapewnienie, że ciąg bcd
działa w porządku. Chroni również przed niektórymi „niewłaściwymi” postaciami początkowymi.Możesz potokować łańcuch źródłowy findstr
i sprawdzić wartość, ERRORLEVEL
aby zobaczyć, czy łańcuch wzorca został znaleziony. Wartość zero oznacza sukces i wzorzec został znaleziony. Oto przykład:
::
: 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
)
Po uruchomieniu w CMD.EXE otrzymujemy:
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
Zwykle robię coś takiego:
Echo.%1 | findstr /C:"%2">nul && (
REM TRUE
) || (
REM FALSE
)
Przykład:
Echo.Hello world | findstr /C:"world">nul && (
Echo.TRUE
) || (
Echo.FALSE
)
Echo.Hello world | findstr /C:"World">nul && (Echo.TRUE) || (Echo.FALSE)
Wynik:
TRUE
FALSE
Nie wiem, czy to najlepszy sposób.
Dla kompatybilności i łatwości użytkowania często lepiej jest użyć ZNAJDŹ, aby to zrobić.
Musisz także rozważyć, czy chcesz dopasować wielkość liter z rozróżnieniem wielkości liter.
Metoda z 78 punktami (wydaje mi się, że odnosiłem się do postu paxdiablo) będzie pasować tylko do Case Sensitively, więc musisz sprawdzić osobno dla każdej odmiany przypadku dla każdej możliwej iteracji, którą chcesz dopasować.
(Co za ból! Przy zaledwie 3 literach oznacza to 9 różnych testów w celu przeprowadzenia kontroli!)
Ponadto wiele razy lepiej jest dopasować wyjście polecenia, zmienną w pętli lub wartość zmiennej wskaźnikowej w partii / CMD, która nie jest tak prosta.
Z tych powodów jest to preferowana alternatywna metodologia:
Użyj: Znajdź [/ I] [/ V] „Znaki do dopasowania”
[/ I] (wielkość liter niewrażliwa) [/ V] (NIE może zawierać znaków)
Jako pojedyncza linia:
ECHO.%Variable% | FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" )
Wieloliniowy:
ECHO.%Variable%| FIND /I "ABC">Nul && (
Echo.Found "ABC"
) || (
Echo.Did not find "ABC"
)
Jak wspomniano, jest to świetne dla rzeczy, których nie ma w zmiennych, które również pozwalają na podstawienie łańcucha:
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
następnie użyć IF /I
porównania bez rozróżniania wielkości liter.
Jeśli wykrywasz obecność, oto najprostsze rozwiązanie:
SET STRING=F00BAH
SET SUBSTRING=F00
ECHO %STRING% | FINDSTR /C:"%SUBSTRING%" >nul & IF ERRORLEVEL 1 (ECHO CASE TRUE) else (ECHO CASE FALSE)
Działa to doskonale w przypadku upuszczania danych wyjściowych poleceń systemu Windows do zmiennej boolean. Po prostu zastąp echo poleceniem, które chcesz uruchomić. Możesz także połączyć łańcuch Findstr, aby dodatkowo zakwalifikować instrukcję za pomocą potoków. EG do kontroli usług (SC.exe)
SC QUERY WUAUSERV | findstr /C:"STATE" | FINDSTR /C:"RUNNING" & IF ERRORLEVEL 1 (ECHO case True) else (ECHO CASE FALSE)
Ten ocenia wynik zapytania SC Query dla usług aktualizacji systemu Windows, który pojawia się jako tekst wielowierszowy, znajduje wiersz zawierający „stan”, a następnie sprawdza, czy słowo „uruchomione” występuje w tym wierszu, i odpowiednio ustawia poziom błędu.
SET STRING=abcdefgh SET SUBSTRING=bcd ECHO %STRING% | FINDSTR /C:"%SUBSTRING%" >nul & IF ERRORLEVEL 1 (ECHO CASE FALSE) else (ECHO CASE TRUE)
Prawdopodobnie przychodzę trochę za późno z tą odpowiedzią, ale zaakceptowana odpowiedź działa tylko w celu sprawdzenia, czy „ciąg zakodowany na stałe” jest częścią ciągu wyszukiwania.
W przypadku wyszukiwania dynamicznego musisz to zrobić:
SET searchString=abcd1234
SET key=cd123
CALL SET keyRemoved=%%searchString:%key%=%%
IF NOT "x%keyRemoved%"=="x%searchString%" (
ECHO Contains.
)
Uwaga: Możesz wziąć dwie zmienne jako argumenty.
Lepsza odpowiedź była tutaj :
set "i=hello " world"
set i|find """" >nul && echo contains || echo not_contains
ECHO %String%| FINDSTR /C:"%Substring%" && (Instructions)
Rozwiązania, które wyszukują w pliku podciąg, mogą również wyszukiwać ciąg , np. find
lub findstr
.
W twoim przypadku łatwym rozwiązaniem byłoby wstawienie ciągu znaków do polecenia zamiast podania nazwy pliku, np.
rozróżniana jest wielkość liter:
echo "abcdefg" | find "bcd"
zignoruj wielkość liter ciągu:
echo "abcdefg" | find /I "bcd"
JEŻELI nie znaleziono dopasowania, otrzymasz odpowiedź na pustym wierszu na CMD i% ERRORLEVEL% ustawiony na 1
Windows
icmd
albo toms-dos
. MS-DOS nie jest częścią systemu Windows przez długi czas.