【问题标题】:Batch findstr with quotes带引号的批量 findstr
【发布时间】:2012-11-23 01:35:17
【问题描述】:

我正在尝试弄清楚如何修改此脚本以进行精确搜索。 我需要搜索一个字符串(例如:“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

【问题讨论】:

  • 这里你仍然需要"\"%1\"" 而不是\"%1\"

标签: batch-file quotes findstr


【解决方案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"(包括引号),无一例外,即 Regex 搜索:

\<start of word , end of word\>

PS:抱歉我的英语不好,希望对你有所帮助。

【讨论】:

  • 感谢您的回答和示例芽。不幸的是,我无法更改我的脚本以使其正常工作。我已经用更多信息编辑了主要帖子。无论如何,谢谢你,感谢你的帮助!
  • 我想这里的问题是你想直接使用 %1 并且你不能直接控制里面的点。所以首先你需要第二个变量来替换 .'s 与 @987654325 @ => set ipadd=%%1 ; set ipadd=%ipadd:.=[.]% , findstr "\"%ipadd%\""
  • 我知道你的回答都很棒!但是我需要尽快修复这个问题,因为我受到了 ddos​​ 攻击,所以我不得不修复它,用 C++ 编写控制台应用程序。非常感谢您的帮助。
【解决方案2】:

引号的转义字符是 \" : 试试这个:

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

编辑:我仍然不确定我是否真的得到了这个问题,但是。这是我创建的一个非常简单的示例 bat,用于测试 paste.bin ip 地址:

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

使用 10.02.0 我得到 1,使用 10.02.02 我得到 0。我使用 FIND 而不是 FINDSTR 来避免 Electro Hacker 指出的点图案陷阱 - 因为您无法控制 %1 内的内容而且更换起来会有点困难。用 [.] 用三引号作为 " 是 " 的转义。而 %~1 用于第一个参数的取消引用值(可能没有必要)

【讨论】:

  • 感谢您的回答,我尝试了这个示例,效果很好,我在脚本中使用了它,但没有成功。也许我做错了,还是谢谢你。我已经编辑了包含更多信息的主要帖子。
  • 所以您想检查是否显示“123.12”?但结果中没有引号?
  • 谢谢你,我的朋友!!
猜你喜欢
  • 1970-01-01
  • 2012-11-23
  • 2021-04-05
  • 1970-01-01
  • 2017-12-11
  • 2014-07-01
  • 2020-05-16
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多