2013-03-29 16 views

Odpowiedz

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 

Gdzie jest wola ...

ustawienie zmiennych z niesymetrycznym " może być trudne. Ja po prostu ustawić go wyważone i odciął ostatniego znaku (:llcheck wpis: lop ostatni i sprawdzić

Essentiall, mam skopiowane zmienną w var2 i varvar w Odrze demo co dzieje powinny być ustawione te variablenames

..

dwa pliki są następnie generowane TEST1.TXT zawiera pierwszy i ostatni 2 charakteru var i TEST2.TXT prostu "")

Porównaj dwa. - jeżeli nie są one identyczne, wówczas zmienna nie uruchamia " i kończy ") Inne mądry dobrze - może po prostu napisałem var do pliku i używane findstr znaleźć beta, ale zdecydowałem się wysłać wyjście SET var która powinna być zawartość ALL z var* zmiennych w postaci

var=abc 
var2=abc 
varvar=abc 

do findstr, znajdowanie tego, który zaczyna się (/b) var= i ustalenie, czy TO zawiera ciąg znaków beta Opcja /i wybiera wielkość liter bez względu na wielkość liter. Jeśli chcesz konkretnie BETA w UPPER-CASE, po prostu zmień beta na BETA i usuń /i.

result jest ustawiony na Y lub N

+0

To działało idealnie dobrze! – BrainStone

+0

To na pewno działa, ale istnieje o wiele prostsze rozwiązanie przy użyciu pojedynczego wyszukiwania regex FINDSTR. Zobacz [moja odpowiedź] (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 " 
) 

wyjściowa:

Variable="This must be true: BETA") 
TRUE: it start with " contains BETA and ends with ") 
  • Sposobem radzenia sobie z niesymetrycznych cudzysłowach (iz innych znaków specjalnych wsadowe, rzeczywiście) jest użycie Delayed Expansion: w ten sposób cudzysłów i znaki specjalne nie pojawiają się w analizowanym wierszu poleceń.

  • Pamiętaj, aby uciec za pomocą^dowolnych prawych nawiasów, które nie zamykają nawiasów bloków poleceń.

  • Łatwym sposobem sprawdzenia, czy zmienna zawiera dany ciąg, jest próba wyeliminowania ciągu znaków z wartości zmiennej: jeśli wynik jest różny od pierwotnej wartości, wówczas zmienna zawiera ciąg znaków.

Antonio

+0

Zaopiekuje się twoją odpowiedzią. To też jest świetne! – BrainStone

10

Zakładając, że zmienna nie zawiera żadnej linii żywi lub powrotu karetki, a następnie wszystko, co potrzebne jest jedno polecenie FINDSTR. Ma ograniczone wsparcie dla regularnych wypowiedzi, które jest wystarczające dla tego problemu.

@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 

Przekazuje tylko TEST11.

Opcja /R wymusza traktowanie łańcucha wyszukiwania jako wyrażenia regularnego.

Opcja /X oznacza, że ​​musi to być dokładne dopasowanie - cały ciąg musi być zgodny z ciągiem wyszukiwania.

.* to wyrażenie wieloznaczne wyrażenia regularnego, które będzie pasowało do dowolnego ciągu znaków.

Przekierowuję wyjście FINDSTR na NUL, ponieważ nie musimy widzieć linii. Chcemy po prostu kod zwrotny

FINDSTR wymaga podwójnej literały zacytować być ocalałem jako \"

Zastosowanie opóźnione ekspansji, dzięki czemu można bezpiecznie powtórzyć dowolną wartość w zmiennej.

Używam && do warunkowego podjęcia działania, gdy FINDSTR powiodło się, a || do warunkowego podjęcia działania, gdy FINDSTR się nie powiodło.

Moja procedura :TEST przyjmuje nazwę zmiennej jako jedynego argumentu.

Należy pamiętać, że w niektórych sytuacjach parser wsadowy wymaga również uniknięcia podwójnego cudzysłowu jako ^", co oznacza, że ​​wyciszony cytat będzie wyglądał jak \^". Ale ta komplikacja nie jest potrzebna w twoim przypadku. Reguły ewakuacyjne FINDSTR są w rzeczywistości trochę nieporęczne. Aby uzyskać więcej informacji, patrz What are the undocumented features and limitations of the Windows FINDSTR command?.

Mój kod testowy uwzględnia rozróżnianie wielkości liter. Tak więc beta nie będzie pasować do BETA. Jeśli szukasz wyszukiwania niewrażliwego na wielkość liter, po prostu dodaj opcję /I.

EDIT: 2015-07-22

Inną opcją, jeśli i tylko jeśli chcesz zignorować sprawę, jest użycie kombinacji zmiennej poszukiwaniu ekspansji/wymienić i operacje ekspansja podciąg. Zarówno test10, jak i test11 przechodzą poniżej.

@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 

Pierwsza kontrola IF dla beta w dowolnym miejscu (bez względu na wielkość liter). Drugie IF sprawdza na początku ", a ostatnie IF sprawdza na końcu pod kątem "). Jedyną trudną rzeczą jest dowiedzieć się, jak uciec od ciągu porównania, gdy ma nieparzystą liczbę cytatów.

+0

Przepraszam, Dave.Nie jest błędem prawo nawiasy w 'findstr/rx \". * BETA. * \ ")'? Tak, to stara odpowiedź, ale widzę teraz link do tego tematu ... – Aacini

+0

@Aacini - Nie rozumiem, dlaczego podejrzewasz, że może to być błąd. Ciąg nigdy nie pojawia się w bloku kodu, więc niecytowany, nieskorygowany prawy paren nigdy nie powoduje problemu. Przetestowałem również kod i działa. – dbenham

+0

Ok. Być może to nie powoduje _error_, ale nie widzę żadnego powodu, by w tym miejscu umieścić prawy paren, z wyjątkiem literówki ... – Aacini

Powiązane problemy