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?
Author: Ben, 0000-00-00

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ąg bcd działa dobrze. Chroni również przed pewnymi "niewłaściwymi" znakami początkowymi.
 231
Author: paxdiablo,
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
 97
Author: ghostdog74,
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.
 37
Author: user839791,
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.

 13
Author: Ben Personick,
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

 6
Author: ,
Warning: date() expects parameter 2 to be long, string given in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54