W pliku wsadowym mam ciąg abcdefg
. Chcę sprawdzić, czy bcd
jest w ciągu.
Niestety wydaje się, że wszystkie rozwiązania, które znajduję, szukają w pliku podłańcucha, a nie ciągu podciągu.
Czy istnieje na to łatwe rozwiązanie?
W pliku wsadowym mam ciąg abcdefg
. Chcę sprawdzić, czy bcd
jest w ciągu.
Niestety wydaje się, że wszystkie rozwiązania, które znajduję, szukają w pliku podłańcucha, a nie ciągu podciągu.
Czy istnieje na to łatwe rozwiązanie?
Windows
icmd
albo toms-dos
. MS-DOS nie jest częścią systemu Windows przez długi czas.Odpowiedzi:
Tak, możesz użyć podstawień i sprawdzić oryginalny ciąg:
%str1:bcd=%
Nieco zastąpibcd
wstr1
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:
I wyniki różnych przebiegów:
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ągbcd
działa w porządku. Chroni również przed niektórymi „niewłaściwymi” postaciami początkowymi.źródło
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:Po uruchomieniu w CMD.EXE otrzymujemy:
źródło
Zwykle robię coś takiego:
Przykład:
Wynik:
Nie wiem, czy to najlepszy sposób.
źródło
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:
Wieloliniowy:
Jak wspomniano, jest to świetne dla rzeczy, których nie ma w zmiennych, które również pozwalają na podstawienie łańcucha:
źródło
setlocal EnableExtensions
następnie użyćIF /I
porównania bez rozróżniania wielkości liter.Jeśli wykrywasz obecność, oto najprostsze rozwiązanie:
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)
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.
źródło
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ć:
Uwaga: Możesz wziąć dwie zmienne jako argumenty.
źródło
Lepsza odpowiedź była tutaj :
źródło
źródło
Rozwiązania, które wyszukują w pliku podciąg, mogą również wyszukiwać ciąg , np.
find
lubfindstr
.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
źródło