web-dev-qa-db-de.com

Batch-Datei: Finden Sie heraus, ob sich der Teilstring in einem String befindet (nicht in einer Datei)

In einer Batch-Datei habe ich eine Zeichenfolge abcdefg. Ich möchte überprüfen, ob bcd in der Zeichenfolge enthalten ist.

Leider scheinen alle Lösungen, die ich finde, ein Datei für eine Teilzeichenfolge zu suchen, keine Zeichenfolge für eine Teilzeichenfolge.

Gibt es dafür eine einfache Lösung?

188
Ben

Ja, Sie können Substitutionen verwenden und mit der Originalzeichenfolge vergleichen:

if not x%str1:bcd=%==x%str1% echo It contains bcd

Das %str1:bcd=% Bit ersetzt ein bcd in str1 mit einem leeren String, der sich vom Original unterscheidet.

Wenn das Original keine bcd Zeichenfolge enthielt, ist die geänderte Version identisch.

Das Testen mit dem folgenden Skript zeigt es in Aktion:

@setlocal enableextensions enabledelayedexpansion
@echo off
set str1=%1
if not x%str1:bcd=%==x%str1% echo It contains bcd
endlocal

Und die Ergebnisse verschiedener Läufe:

c:\testarea> testprog hello

c:\testarea> testprog abcdef
It contains bcd

c:\testarea> testprog bcd
It contains bcd

Ein paar Notizen:

  • Die if -Anweisung ist das Kernstück dieser Lösung, alles andere ist Support.
  • Das x vor den beiden Seiten der Gleichheit soll sicherstellen, dass der String bcd in Ordnung funktioniert. Es schützt auch vor bestimmten "falschen" Startzeichen.
267
paxdiablo

Sie können die Quellzeichenfolge an findstr weiterleiten und den Wert von ERRORLEVEL überprüfen, um festzustellen, ob die Musterzeichenfolge gefunden wurde. Ein Wert von Null zeigt Erfolg an und das Muster wurde gefunden. Hier ist ein Beispiel:

::
: 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
)

Wenn dies in CMD.EXE ausgeführt wird, erhalten wir:

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
102
ghostdog74

Normalerweise mache ich so etwas:

Echo.%1 | findstr /C:"%2">nul && (
    REM TRUE
) || (
    REM FALSE
)

Beispiel:

Echo.Hello world | findstr /C:"world">nul && (
    Echo.TRUE
) || (
    Echo.FALSE
)

Echo.Hello world | findstr /C:"World">nul && (Echo.TRUE) || (Echo.FALSE)

Ausgabe:

TRUE
FALSE

Ich weiß nicht, ob das der beste Weg ist.

42
user839791

Aus Gründen der Kompatibilität und Benutzerfreundlichkeit ist es häufig besser, hierfür FIND zu verwenden.

Sie müssen auch überlegen, ob Sie Groß- oder Kleinschreibung nicht berücksichtigen möchten.

Die Methode mit 78 Punkten (ich glaube, ich bezog mich auf paxdiablos Beitrag) stimmt nur mit Groß-/Kleinschreibung überein, daher müssen Sie für jede mögliche Iteration, die Sie abgleichen möchten, eine separate Prüfung für jede Fallvariation durchführen.

(Was für ein Schmerz! Bei nur 3 Buchstaben bedeutet das 9 verschiedene Tests, um die Prüfung durchzuführen!)

Außerdem ist es oftmals vorzuziehen, die Befehlsausgabe, eine Variable in einer Schleife oder den Wert einer Zeigervariablen in Ihrem Stapel/CMD abzugleichen, der nicht so einfach ist.

Aus diesen Gründen ist dies eine bevorzugte alternative Methodik:

Benutzen: Finde [/ I] [/ V] "Charaktere, die passen"

[/ I] (Groß-/Kleinschreibung beachten) [/ V] (Darf NICHT die Zeichen enthalten)

Als einzelne Linie:

ECHO.%Variable% | FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" )

Mehrzeilig:

ECHO.%Variable%| FIND /I "ABC">Nul && ( 
  Echo.Found "ABC"
) || (
  Echo.Did not find "ABC"
)

Wie bereits erwähnt, ist dies ideal für Dinge, die sich nicht in Variablen befinden, die auch die Ersetzung von Zeichenfolgen ermöglichen:

FOR %A IN (oihu AljB lojkAbCk) DO ( ECHO.%~A| FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" ) )

Ausgabe von einem Befehl:

NLTest | FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" )

Wie Sie sehen, ist dies aus mehreren Gründen die beste Möglichkeit, die Prüfung durchzuführen.

19
Ben Personick

Wenn Sie nach Präsenz suchen, ist dies die einfachste Lösung:

SET STRING=F00BAH
SET SUBSTRING=F00
ECHO %STRING% | FINDSTR /C:"%SUBSTRING%" >nul & IF ERRORLEVEL 1 (ECHO CASE TRUE) else (ECHO CASE FALSE)

Dies eignet sich hervorragend zum Ablegen der Ausgabe von Windows-Befehlen in eine boolesche Variable. Ersetzen Sie einfach das Echo durch den Befehl, den Sie ausführen möchten. Sie können Findstrs auch aneinanderreihen, um eine Anweisung mit Pipes weiter zu qualifizieren. Z.B. für die Dienststeuerung (SC.exe)

SC QUERY WUAUSERV | findstr /C:"STATE" | FINDSTR /C:"RUNNING" & IF ERRORLEVEL 1 (ECHO case True) else (ECHO CASE FALSE)

Dieser wertet die Ausgabe von SC Query for windows update services aus, die als mehrzeiliger Text ausgegeben wird, findet die Zeile mit "state" und stellt fest, ob das Wort "running" in dieser Zeile vorkommt, und Stellt den Fehlerlevel entsprechend ein.

9
byorking

Bessere Antwort war hier :

set "i=hello " world"
set i|find """" >nul && echo contains || echo not_contains
1
T.Todua

Ich komme mit dieser Antwort wahrscheinlich etwas zu spät, aber die akzeptierte Antwort überprüft nur, ob eine "fest codierte Zeichenfolge" Teil der Suchzeichenfolge ist.

Für die dynamische Suche müssten Sie Folgendes tun:

SET searchString=abcd1234
SET key=cd123

CALL SET keyRemoved=%%searchString:%key%=%%

IF NOT "x%keyRemoved%"=="x%searchString%" (
    ECHO Contains.
)

Hinweis: Sie können die beiden Variablen als Argumente verwenden.

1
Andy Sug
ECHO %String%| FINDSTR /C:"%Substring%" && (Instructions)
0