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.
To działało idealnie dobrze! – BrainStone
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