Ihre Variable Unter der Annahme, enthält keine Zeilenumbrüche oder Wagenrücklauf, dann alles, was benötigt wird, ist ein einzelner FINDSTR Befehl. Es hat eine begrenzte Unterstützung für reguläre Ausdrücke, die für dieses Problem mehr als ausreichend ist.
@echo off
setlocal
set test1=abc
set test2="abc"
set test3="")
set test4=")"
set test5=abc")"
set test6=xyzBETAzyx
set test7="xyz BETA zyx"
set test8=xyzBETAzyx")"
set test9=xyzBETAzyx")"
set test10="xyzbetazyx")
set test11="xyzBETAzyx")
for /l %%N in (1 1 11) do call :test test%%N
exit /b
:test variableName
setlocal enableDelayedExpansion
echo !%1!|>nul findstr /rx \".*BETA.*\") && set "result=PASS" || set "result=FAIL"
echo %1 = !result!: !%1!
exit /b
Nur TEST11 besteht.
Die Option /R
erzwingt, dass die Suchzeichenfolge als regulärer Ausdruck behandelt wird.
Die Option /X
bedeutet, dass es eine exakte Übereinstimmung sein muss - die gesamte Zeichenfolge muss mit der Suchzeichenfolge übereinstimmen.
.*
ist der Regex-Platzhalterausdruck, der mit einer beliebigen Zeichenfolge übereinstimmt.
Ich leite die FINDSTR-Ausgabe auf NUL um, weil wir die Linie nicht sehen müssen. Wir wollen nur den Return-Code
FINDSTR doppelte Anführungszeichen Literale erfordert als \"
Verwendung verzögerte Expansion entkommen sein, so dass Sie sicher einen beliebigen Wert innerhalb des variablen Echo kann.
Ich verwende &&
, um Maßnahmen ergreifen, wenn FINDSTR erfolgreich war, und ||
, um Maßnahmen ergreifen, wenn FINDSTR fehlgeschlagen.
Meine :TEST
Routine nimmt den Namen der Variablen als einziges Argument.
Beachten Sie, dass der Stapelparser in einigen Situationen erfordert, dass Sie das doppelte Anführungszeichen ebenfalls als ^"
ausschließen, was bedeutet, dass ein vollständig mit Escapezeichen versehenes Anführungszeichen wie \^"
aussieht. Aber diese Komplikation ist in Ihrem Fall nicht erforderlich. Die FINDSTR Escape-Regeln sind eigentlich ein bisschen wackelig. Weitere Informationen finden Sie unter What are the undocumented features and limitations of the Windows FINDSTR command?.
Mein Testcode unterscheidet zwischen Groß- und Kleinschreibung. So beta
wird nicht übereinstimmen BETA
. Wenn Sie eine Suche ohne Beachtung der Groß-/Kleinschreibung durchführen möchten, fügen Sie einfach die Option /I
hinzu.
EDIT: 2015-07-22
Eine weitere Option, wenn und nur wenn Sie Fall ignoriert werden sollen, ist eine Kombination aus variablen Expansions Suche verwenden/ersetzen und Operationen Erweiterungsstring. Sowohl test10 als auch test11 gehen weiter unten.
@echo off
setlocal
set test1=abc
set test2="abc"
set test3="")
set test4=")"
set test5=abc")"
set test6=xyzBETAzyx
set test7="xyz BETA zyx"
set test8=xyzBETAzyx")"
set test9=xyzBETAzyx")"
set test10="xyzbetazyx")
set test11="xyzBETAzyx")
for /l %%N in (1 1 11) do call :test test%%N
exit /b
:test variableName
setlocal enableDelayedExpansion
set "result=FAIL"
if "!%1:beta=!" neq "!%1!" if "!%1:~0,1!" equ ^""" if "!%1:~-2!" equ ^"")" set "result=PASS"
echo %1 = !result!: !%1!
exit /b
Das erste ZF-Kontrollen für beta
überall (Groß- und Kleinschreibung). Der zweite IF prüft am Anfang "
und der letzte IF prüft am Ende auf ")
. Die einzige knifflige Sache ist herauszufinden, wie man aus der Vergleichszeichenkette aussteigt, wenn sie eine ungerade Anzahl von Anführungszeichen hat.
Das funktionierte einwandfrei! – BrainStone
Dies funktioniert sicherlich, aber es gibt eine viel einfachere Lösung mit einer einzigen FINDSTR Regex-Suche. Siehe [meine Antwort] (http://stackoverflow.com/a/15730788/1012053) – dbenham