Antworten:
Ja, Sie können Ersetzungen verwenden und mit der ursprünglichen Zeichenfolge vergleichen:
if not x%str1:bcd=%==x%str1% echo It contains bcd
Das %str1:bcd=%
Bit ersetzt ein bcd
In str1
durch eine leere Zeichenfolge, wodurch es sich vom Original unterscheidet.
Wenn das Original keine bcd
Zeichenfolge enthält , 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 Anmerkungen:
if
Aussage ist das Fleisch dieser Lösung, alles andere ist Support.x
vor den beiden Seiten der Gleichung ist , um sicherzustellen , dass der String bcd
funktioniert in Ordnung. Es schützt auch vor bestimmten "falschen" Startzeichen.Sie können die Quellzeichenfolge an weiterleiten findstr
und den Wert von überprüfen, ERRORLEVEL
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
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.
Aus Gründen der Kompatibilität und Benutzerfreundlichkeit ist es häufig besser, FIND zu verwenden, um dies zu tun.
Sie müssen auch überlegen, ob Sie den Fall sensibel oder den Fall unempfindlich abgleichen möchten.
Die Methode mit 78 Punkten (ich glaube, ich habe mich auf den Beitrag von paxdiablo bezogen) stimmt nur mit der Groß- und Kleinschreibung überein. Sie müssen daher für jede mögliche Iteration, die Sie möglicherweise 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!)
Darüber hinaus ist es häufig vorzuziehen, die Befehlsausgabe, eine Variable in einer Schleife oder den Wert einer Zeigervariablen in Ihrem Stapel / CMD abzugleichen, was nicht so einfach ist.
Aus diesen Gründen ist dies eine bevorzugte alternative Methode:
Verwenden Sie: Finden Sie [/ I] [/ V] "Übereinstimmende Zeichen"
[/ I] (Groß- und Kleinschreibung wird nicht berücksichtigt) [/ V] (Darf die Zeichen NICHT enthalten)
Als einzelne Zeile:
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 nicht in Variablen enthalten sind, die auch das Ersetzen von Zeichenfolgen ermöglichen:
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
dann IF /I
Vergleiche ohne Berücksichtigung der Groß- und Kleinschreibung durchführen.
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 funktioniert hervorragend, um die Ausgabe von Windows-Befehlen in eine boolesche Variable zu verschieben. Ersetzen Sie einfach das Echo durch den Befehl, den Sie ausführen möchten. Sie können Findstrs auch aneinanderreihen, um eine Anweisung mithilfe von Pipes weiter zu qualifizieren. EG für Servicesteuerung (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 für Windows Update Services aus, die als mehrzeiliger Text ausgegeben wird, findet die Zeile mit "state" und findet dann, ob das Wort "running" in dieser Zeile vorkommt, und legt die Fehlerstufe entsprechend fest.
SET STRING=abcdefgh SET SUBSTRING=bcd ECHO %STRING% | FINDSTR /C:"%SUBSTRING%" >nul & IF ERRORLEVEL 1 (ECHO CASE FALSE) else (ECHO CASE TRUE)
Ich komme mit dieser Antwort wahrscheinlich etwas zu spät, aber die akzeptierte Antwort funktioniert nur, um zu überprüfen, ob eine "fest codierte Zeichenfolge" Teil der Suchzeichenfolge ist.
Für eine 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.
Bessere Antwort war hier :
set "i=hello " world"
set i|find """" >nul && echo contains || echo not_contains
ECHO %String%| FINDSTR /C:"%Substring%" && (Instructions)
Die Lösungen, die eine Datei nach einem Teilstring durchsuchen , können auch einen String durchsuchen , z. find
oder findstr
.
In Ihrem Fall besteht die einfache Lösung darin, eine Zeichenfolge in den Befehl einzufügen, anstatt einen Dateinamen anzugeben, z.
Groß- und Kleinschreibung beachten:
echo "abcdefg" | find "bcd"
Zeichenfolge der Zeichenfolge ignorieren:
echo "abcdefg" | find /I "bcd"
Wenn keine Übereinstimmung gefunden wird, erhalten Sie eine leere Antwort auf CMD und% ERRORLEVEL% auf 1 gesetzt
Windows
undcmd
oder es istms-dos
. MS - DOS ist nicht Teil von Windows für eine seit langer Zeit.