Вы можете использовать второй FINDSTR для фильтрации «нормально открытых» портов. Решение, которое я показываю, использует внешний файл для вывода списка исключаемых портов (обычно открытых). В качестве альтернативы список может быть указан в командной строке как несколько /C
параметров.
ignore.txt (при необходимости измените)
portid="21"
portid="22"
portid="80"
portid="443"
portid="3389"
findstr /c:"portid=" test.txt | findstr /r /v /g:"ignore.txt"
В FINDSTR есть ошибка, из-за которой может не получиться найти совпадение, если есть несколько строк поиска литералов различной длины. Именно поэтому я решил использовать опцию регулярного выражения /R
.
Если формат файла XML согласован, то вы можете использовать FOR / F с DELIMS, установленным на символ кавычки, чтобы извлечь 4-й токен. Синтаксис для указания параметров FOR / F с кавычками в качестве разделителя нечетен: обычно вы делаете что-то вроде "tokens=4 delims=,"
. Но чтобы включить кавычку в качестве разделителя, вы должны выполнить несколько экранировок: tokens^=4^ delims^=^"
.
Собрав все вместе, вы получите
@echo off
for /f tokens^=4^ delims^=^" %%P in (
'findstr /c:"portid=" test.txt ^| findstr /r /v /g:"ignore.txt"'
) do (
echo unusual open port = %%P
)
exit /b
Если формат (порядок атрибутов) XML может отличаться, решение будет более сложным. Сначала вы используете внешний FOR / F, чтобы прочитать всю строку в переменную. Вы используете поиск SET * и замену op, чтобы найти местоположение порта в строке, а затем второй FOR / F, чтобы разобрать фактический порт.
setlocal enableDelayedExpansion
for /f "delims=" %%L in (
'findstr /c:"portid=" test.txt ^| findstr /r /v /g:"ignore.txt"'
) do (
set "ln=%%L"
for /f delims^=^=^" %%A in ("!ln:*portid=!") do set port=%%A
echo unusual open port = !port!
)
После того, как у вас есть идентификаторы портов, вы можете создать свое почтовое сообщение. Я рекомендую использовать Blat для Windows для отправки электронной почты.