2013-03-29 7 views

Antwort

4
@ECHO OFF 
SETLOCAL 
SET var=abc&CALL :check 
SET var="abc"&CALL :llcheck 
SET var="")&CALL :check 
SET var=")"&CALL :llcheck 
SET var=abc")"&CALL :llcheck 
SET var=xyzbetazyx&CALL :check 
SET var="xyzbetazyx"&CALL :llcheck 
SET var=xyzbetazyx")"&CALL :llcheck 
SET var=xyzbetazyx")"&CALL :check 
SET var="xyzbetazyx")&CALL :check 
GOTO :eof 
:: Lop last, then check 
:llcheck 
SET var=%var:~0,-1% 
:check 
SET result=N 
SET var2=%var% 
SET varvar=%var% 

>test1.txt ECHO %var:~0,1%%var:~-2% 
>test2.txt ECHO "") 
FC test1.txt test2.txt >nul 
IF ERRORLEVEL 1 GOTO done 
SET var|FINDSTR /b "var="|FINDSTR /i "beta" >nul 
IF ERRORLEVEL 1 GOTO done 
SET result=Y 
:done 
ECHO %var% starts " has BETA and ends ") : %result% 
GOTO :eof 

Wo ein Wille ...

Einstellung Variablen mit unsymmetrischen " kann schwierig sein. Ich stelle es nur auf eine ausgewogene und abgeschlagen das letzte Zeichen (:llcheck Eintrag: lop letzte und überprüfen

Essentiall ich die Variable in var2 und varvar in oder Demo kopiert haben, was diese variablenames gesetzt passiert werden sollte

..

zwei Dateien werden dann erzeugt TEST1.TXT den ersten und letzten 2 Charakter var und TEST2.TXT

Vergleichen sie die beiden enthält einfach "")

-. wenn sie nicht identisch sind, dann wird die Variable nicht startet " und endet ") Andere weise gut - einfach hätte var in eine Datei geschrieben und verwendet findstr beta zu finden, aber ich beschlossen, die Ausgabe von SET var zu senden, die den Inhalt von ALL der var* Variablen in der Form in

var=abc 
var2=abc 
varvar=abc 

sein sollte findstr, sucht nach demjenigen, der startet() var= und sucht, ob THAT enthält die Zeichenfolge beta Die /i wählt Groß-und Kleinschreibung aus. Wenn Sie speziell BETA in UPPER-CASE möchten, ändern Sie einfach beta zu BETA und entfernen Sie die /i.

result wird auf Y oder N

+0

Das funktionierte einwandfrei! – BrainStone

+0

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

2
@echo off 
setlocal EnableDelayedExpansion 
set quote=" 
set variable="This must be true: BETA") 
echo Variable=!variable! 
if "!variable:~0,1!" equ "!quote!" (
    rem Start with " 
    if "!variable:BETA=!" neq "!variable!" (
     rem Contains BETA 
     if "!variable:~-2!" equ "!quote!^)" (
     echo TRUE: it start with " contains BETA and ends with "^) 
    ) else (
     echo FALSE, it does not ends with "^) 
    ) 
    ) else (
     echo FALSE, it does not contain BETA 
    ) 
) else (
    echo FALSE, it does not start with " 
) 

Ausgang:

Variable="This must be true: BETA") 
TRUE: it start with " contains BETA and ends with ") 
  • Die Art und Weise mit unsymmetrischen Anführungszeichen umgehen (und mit anderen speziellen Batch Zeichen, in der Tat) verwenden Verzögerte Expansion: Auf diese Weise erscheinen die Anführungszeichen und Sonderzeichen nicht in der Befehlszeile, die analysiert wird.

  • Denken Sie daran, mit^allen rechten Klammern zu entkommen, die die Klammern der Befehlsblöcke nicht schließen.

  • Eine einfache Möglichkeit zu überprüfen, ob eine Variable eine gegebene Zeichenfolge enthält, ist die Eliminierung der Zeichenfolge aus Variablenwert: Wenn das Ergebnis vom ursprünglichen Wert abweicht, enthält die Variable die Zeichenfolge.

Antonio

+0

Thabks für Ihre Antwort. Es ist auch toll! – BrainStone

10

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.

+0

Entschuldigung, Dave.Ist kein Fehler die richtigen Klammern bei 'findstr/rx '. * BETA. * \") '? Ja, es ist eine alte Antwort, aber ich sehe gerade einen Link zu diesem Thema ... – Aacini

+0

@Aacini - Ich verstehe nicht, warum Sie vermuten, dass es ein Fehler sein könnte. Die Zeichenfolge wird niemals in einem Codeblock angezeigt, sodass das nicht angeführte, nicht deklarierte Rechtspaar nie ein Problem verursacht. Ich habe auch den Code getestet, und es funktioniert. – dbenham

+0

Ok. Vielleicht verursacht es keinen _error_, aber ich sehe keinen Grund, ein Recht paren an dieser Stelle einzuschließen, ausgenommen ein Tippfehler ... – Aacini