9

"バッチファイル内の変数が含むBETA場所で始まり、で終わるかどうかを確認しようとしています")

出来ますか?はいの場合、誰かが私を助けてくれますか?

4

3 に答える 3

11

変数にライン フィードやキャリッジ リターンが含まれていないと仮定すると、必要なのは 1 つの FINDSTR コマンドだけです。この問題には十分すぎる正規表現のサポートが制限されています。

@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

TEST11 のみがパスします。

この/Rオプションは、検索文字列を正規表現として処理することを強制します。

この/Xオプションは、完全に一致する必要があることを意味します。つまり、文字列全体が検索文字列と一致する必要があります。

.*任意の文字列に一致する正規表現のワイルドカード式です。

行を表示する必要がないため、FINDSTR 出力を NUL にリダイレクトします。戻りコードが必要なだけです

FINDSTR では、二重引用符リテラルを次のようにエスケープする必要があります。\"

遅延展開を使用して、変数内の任意の値を安全にエコーできるようにします。

FINDSTR&&が成功した場合は||条件付きでアクションを実行し、FINDSTR が失敗した場合は条件付きでアクションを実行していました。

私の:TESTルーチンは、変数の名前を唯一の引数として取ります。

場合によっては、バッチ パーサーで二重引用符を としてエスケープする必要があることに注意してください^"。つまり、完全にエスケープされた引用符は のようになります\^"。しかし、あなたの場合、その複雑さは必要ありません。FINDSTR エスケープ規則は、実際には少し不安定です。Windows FINDSTR コマンドの文書化されていない機能と制限事項は何ですか? を参照してください。詳細については。

私のテスト コードは、大文字と小文字を区別する検索を行います。だからbeta一致しませんBETA。大文字と小文字を区別しない検索が必要な場合は、/Iオプションを追加するだけです。

編集: 2015-07-22

別のオプションは、大文字と小文字を区別したくない場合にのみ、変数展開の検索/置換操作と展開部分文字列操作を組み合わせて使用​​することです。test10 と test11 の両方が以下に合格します。

@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

最初の IF はbetaどこでもチェックします (大文字と小文字は区別されません)。2 番目の IF"は最初にチェックし、最後の IF は最後にチェックし")ます。唯一難しいのは、引用符の数が奇数の場合に比較文字列をエスケープする方法を見つけることです。

于 2013-03-31T15:04:04.340 に答える
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

意志のあるところ…

アンバランスで変数を設定するの"は難しい場合があります。バランスをとって最後の文字を削除しました ( :llcheckentry : lop last and check.

基本的に、これらの変数名が設定された場合に何が起こるかをデモするために、変数をvar2にコピーしました。varvar

2 つのファイルが生成されます。TEST1.TXTand の最初と最後の 2 文字varTEST2.TXT含む"")

"2つを比較してください-それらが同一でない場合、変数は開始および終了しません。")それ以外の場合は、単にvarファイルに書き出してfindstrを検索するために使用できましたが、の内容であるはずbetaの出力を送信することにしましたフォーム内の変数SET varALLvar*

var=abc
var2=abc
varvar=abc

/bfindstr に入力し、( )で始まるものを見つけ、その文字列が含まれているvar=かどうかを調べます。特に大文字にしたい場合は、に変更して削除するだけです。beta/iBETAbetaBETA/i

resultYまたはに設定されていますN

于 2013-03-29T18:00:12.363 に答える
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 "
)

出力:

Variable="This must be true: BETA")
TRUE: it start with " contains BETA and ends with ")
  • アンバランスな引用符 (およびその他の特殊なバッチ文字) を処理する方法は、遅延展開を使用することです。この方法では、引用符と特殊文字が解析されるコマンド ラインに表示されません。

  • コマンド ブロックの括弧を閉じていない右括弧は ^ でエスケープすることを忘れないでください。

  • 変数に特定の文字列が含まれているかどうかを確認する簡単な方法は、変数値から文字列を削除することです。結果が元の値と異なる場合、変数には文字列が含まれています。

アントニオ

于 2013-03-29T18:49:07.627 に答える