Plik wsadowy: Find if substring is in string (not in a file)
W pliku wsadowym mam łańcuch abcdefg
. Chcę sprawdzić, czy {[1] } jest w łańcuchu.
Niestety wygląda na to, że wszystkie rozwiązania, które znajduję, przeszukują plik dla podłańcucha, a nie łańcuch dla podłańcucha.
Czy jest na to łatwe rozwiązanie?5 answers
Tak, możesz użyć podstawień i sprawdzić w stosunku do oryginalnego ciągu znaków:
if not x%str1:bcd=%==x%str1% echo It contains bcd
Bit %str1:bcd=%
zastąpi bcd
w str1
pustym ciągiem znaków, co odróżnia go od oryginału.
Jeśli oryginał nie zawierał bcd
, zmodyfikowana wersja będzie identyczna.
Testowanie za pomocą 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 poszczególnych biegów:
c:\testarea> testprog hello
c:\testarea> testprog abcdef
It contains bcd
c:\testarea> testprog bcd
It contains bcd
Kilka uwag:
- The
if
oświadczenie jest mięsem tego rozwiązania, Wszystko inne jest wsparciem. -
x
przed obiema stronami równości jest zapewnienie, że ciągbcd
działa dobrze. Chroni również przed pewnymi "niewłaściwymi" znakami początkowymi.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-13 02:27:05
Możesz skierować łańcuch źródłowy do findstr
i sprawdzić wartość ERRORLEVEL
, aby sprawdzić, czy łańcuch wzorca został znaleziony. Wartość zero oznacza sukces i wzór 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
)
Kiedy to jest uruchamiane 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-07 22:17:30
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)
Wyjście:
TRUE
FALSE
Nie wiem, czy to najlepszy sposób.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-12 08:12:34
Dla kompatybilności i łatwości użytkowania często lepiej jest użyć FIND, aby to zrobić.
Musisz również rozważyć, czy chcesz dopasować case wrażliwie lub case niewrażliwie.
Metoda z 78 punktami (chyba miałem na myśli post paxdiablo) będzie pasować tylko z wyczuciem przypadku, więc musisz umieścić osobną kontrolę dla każdego wariantu przypadku dla każdej możliwej iteracji, którą chcesz dopasować.
(Co za ból! Tylko 3 litery, co oznacza 9 różnych testów w celu / align = "left" / )Ponadto wiele razy lepiej jest dopasować wyjście polecenia, zmienną w pętli lub wartość zmiennej wskaźnika 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) [/V] (nie może zawierać znaków)
Jako Pojedyncza Linia:
ECHO.%Variable% | FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" )
Wielowierszowy:
ECHO.%Variable%| FIND /I "ABC">Nul && (
Echo.Found "ABC"
) || (
Echo.Did not find "ABC"
)
Jako wspomniałem, że jest to świetne dla rzeczy, które nie są w zmiennych, które pozwalają na podstawianie łańcuchów, jak również:
FOR %A IN (oihu AljB lojkAbCk) DO ( ECHO.%~A| FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" ) )
Wyjście z polecenia:
NLTest | FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" )
Jak widać, jest to najlepszy sposób na obsługę czeku z wielu powodów.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-01 17:54:36
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)
To świetnie sprawdza się przy upuszczaniu wyjścia poleceń systemu windows do zmiennej logicznej. Wystarczy wymienić echo wi