Пакетный поиск с кавычками

Я пытаюсь понять, как изменить этот скрипт, чтобы выполнить точный поиск. Мне нужно найти строку (например: "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 находит значение parsed: 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


person Ramiro    schedule 23.11.2012    source источник
comment
здесь вам все равно понадобится "\"%1\"" вместо \"%1\"   -  person npocmaka    schedule 24.11.2012


Ответы (2)


Если вам нужен точный поиск, вы можете отфильтровать строки начального и конечного слов и пропустить точку "." поскольку в 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: Извините за мой плохой английский, надеюсь, это помогло вам.

person ElektroStudios    schedule 23.11.2012
comment
Спасибо за ваш ответ и примеры бутон. К сожалению, мне не удалось изменить свой сценарий, чтобы он работал. Я отредактировал основной пост с дополнительной информацией. Спасибо в любом случае, я ценю вашу помощь! - person Ramiro; 23.11.2012
comment
Я предполагаю, что проблема здесь в том, что вы хотите использовать прямо %1 и у вас нет прямого контроля над точками внутри. Итак, сначала вам понадобится вторая переменная для замены .'s на [.]'s => set ipadd=%%1 ; set ipadd=%ipadd:.=[.]% , findstr "\"%ipadd%\"" - person npocmaka; 24.11.2012
comment
Я знаю, что все ваши ответы были великолепны! Но мне нужно было исправить это как можно скорее, потому что я подвергся ddos-атаке, поэтому мне пришлось исправить это, написав консольное приложение на C++. Я действительно ценю твою помощь. - person Ramiro; 24.11.2012

escape-символ для кавычек - \" : Попробуйте это:

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

РЕДАКТИРОВАТЬ: я все еще не уверен, что правильно понял вопрос, но вот довольно простой пример летучей мыши, который я создал для проверки IP-адресов paste.bin:

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

с 10.02.0 я получаю 1, а с 10.02.02 я получаю 0. Я использовал FIND вместо FINDSTR, чтобы избежать ловушки точечного шаблона, на которую указывает Electro Hacker, поскольку у вас нет контроля над содержимым внутри %1, и он будет быть немного сложнее заменить. с [.] С тройными кавычками, поскольку "является экранированием" .и %~1 для значения первого аргумента без кавычек (может быть, это не обязательно)

person npocmaka    schedule 23.11.2012
comment
Спасибо за ответ, я попробовал этот пример, и он отлично работает, я использовал его в своем сценарии, и у меня ничего не получилось. Может я что не так делаю, все равно спасибо. Я отредактировал основной пост с дополнительной информацией. - person Ramiro; 23.11.2012
comment
Итак, вы хотите проверить, представлен ли 123.12? но вы не кавычки в результате? - person npocmaka; 24.11.2012
comment
Спасибо в любом случае мой друг !! - person Ramiro; 24.11.2012