2

このスクリプトを変更して正確な検索を行う方法を見つけようとしています。文字列を検索する必要があります (例: "123.12" -- 引用符付き)

これは今までの私のスクリプトです:

findstr %1 %systemdrive%\test\data.txt

IF %ERRORLEVEL% GTR 0 (
--- TRUE- DO SOMETHING
) ELSE (
--- FALSE- EXIT
)

これは私のファイルdata.txtです

「123.123」「345.345」「794.922」

(引用符付き)

問題は、findstr が解析された値 123.12 を見つけていることですが、それは私のリストには存在しません。その一部として 123.123 と 123.12 を誤って検出しています。そのため、引用符で検索する方法があるかどうかを知りたいのです。つまり、解析された値をフォーマットし、引用符を追加してテキスト ファイル内を検索する方法があるかどうかを知りたいのです。

"%1" を試しましたが成功しませんでした。

前もって感謝します !!


編集

特定の IP をブロックするようにファイアウォール バッチ スクリプトを変更しようとしています。

これがスクリプトです

ipconfig | findstr "Address" | qut -d: -f 2 | qni > %systemdrive%\Qaas\host_ip.txt
findstr \"%1\" %systemdrive%\Qaas\bin\host_ip.qas || findstr \"%1\" %systemdrive%\Qaas\white_list.txt || findstr \"%1\" %systemdrive%\Qaas\blocqedips.qas

IF %ERRORLEVEL% GTR 0 (
echo "NOT FOUND"
netsh ipsec stat add filter filterlist="IP List" srcaddr=%1 dstaddr=Me description=%1 protocol=any mirrored=yes
echo Blocked IP address %1, reason - %2 connections on %3 >> %systemdrive%\Qaas\Qaas-%dw%-%mm%-%dd%-%hh%.log
echo %1 >> %systemdrive%\Qaas\blocqedips.qas
) ELSE (
echo "FOUND"
echo %1 is either host IP or already blocked earlier >> %systemdrive%\Qaas\Qaas-%dw%-%mm%-%dd%-%hh%.log
)

これはブロックされた IP ファイルです: http://pastebin.com/cP4BteDM

今、たとえば 10.02.0 をブロックしようとすると、コンソールに "10.02.02" が表示されます。10.02.0が「instr」「10.02.02」だからだと思います。FINDSTR 文のこの問題により、たとえば「10.02.0」を禁止することはできなくなります。

助けてくれてありがとう、私はあなたの答えを試してみましたが運が悪かったです:S

4

2 に答える 2

1

引用符のエスケープ文字は次のとおりです\" :これを試してください:

C:\>echo "123.123" "345.345" "794.922" | findstr "\"123.12\""
C:\>echo %errorlevel%

編集: 私はまだ本当に質問が得られるかどうか確信が持てませんが.hereは、paste.bin IPアドレスをテストするために作成した非常に単純なバットの例です:

@echo off
find """%~1"""  ips.txt 
echo %errorlevel%

10.02.0 では 1 を取得し、10.02.02 では 0 を取得しています。FINDSTR の代わりに FIND を使用して、Electro Hacker によって指摘されたドット パターン トラップを回避しました。%1 内のコンテンツを制御できないためです。交換するのが少し難しくなります。with [.] 三重引用符 " は " のエスケープであり、%~1 は最初の引数の引用符が外された値用です (必要ない場合があります)。

于 2012-11-23T09:24:23.630 に答える
1

完全一致検索が必要な場合は、開始語と終了語の行をフィルタリングして、ポイント「.」をエスケープできます。RegEx では「任意の文字」を意味するため、リテラル文字「.」を使用する必要があります。より正確な結果が必要で、二重引用符もエスケープする場合。

引用符なしで検索したい場合は、次のように引数を展開できます。

:: I've removed start & ending quotes of argument %1
findstr %~1 "%systemdrive%\test\data.txt" &&  (
--- TRUE- DO SOMETHING
) || (
--- FALSE- EXIT
)

これは、必要な正確な正規表現です。

FINDSTR "\<\"123[.]123\"\>"

最初と最後の引用符は、FINDSTR コマンドを使用して値を囲むだけであることに注意してください

これは、「123.123」(引用符を含む)と正確に一致し、例外なく、正規表現は次の方法で検索します。

\<start of word , end of word\>

PS: 下手な英語で申し訳ありませんが、これがお役に立てば幸いです。

于 2012-11-23T10:18:50.840 に答える