BAT Multiple For-loop для дальнейшей фильтрации результатов - PullRequest
0 голосов
/ 31 мая 2019

Я устанавливаю скрипт bat, который перечисляет все установки postgres по используемому порту (5432, 5433 и т. Д.) И позволяет пользователю выбрать установку. Я netstat в TXT, а затем читать его с для цикла для фильтрации результатов

Пока все хорошо, но проблема в том, что я не могу сузить результаты по своему вкусу. Я хотел бы, чтобы сгенерированный список был таким:

5432
5433
5434
etc

Вот что я использую:

netstat -bnf -p tcp | findstr "127.0.0.1 post" > C:\anbo.txt 2>&1

for /f "usebackq tokens=2 delims=[:]" %%p in ("C:\anbo.txt") do (echo %%p )

Это необработанный вывод "netstat":

  TCP    127.0.0.1:5432         127.0.0.1:51725        ESTABLISHED
 [postgres.exe]
  TCP    127.0.0.1:5432         127.0.0.1:56261        ESTABLISHED
 [postgres.exe]
  TCP    127.0.0.1:5939         127.0.0.1:49833        ESTABLISHED
  TCP    127.0.0.1:49680        127.0.0.1:54677        ESTABLISHED
  TCP    127.0.0.1:49680        127.0.0.1:57445        ESTABLISHED

Это netstat, отфильтрованный по для цикла:

5432         127.0.0.1
postgres.exe
5432         127.0.0.1
postgres.exe
5939         127.0.0.1
49680        127.0.0.1
49680        127.0.0.1

Я озадачен тем, как дальше фильтровать результаты. Я генерирую netstat с "-b", потому что я хочу знать, какие порты используются каким .exe.

Возможно ли зациклить для петель? A для в пределах для , чтобы я мог еще больше сузить результаты? Если бы я мог, например, запустить это для :

for /f "usebackq tokens=1 delims=. " %%s in ("F:\lop.txt") do (echo %%s)

Поскольку lop.txt имеет выходные данные предыдущего для , я получу:

5432
postgres
5432
postgres
5939
49680
49680

Что было бы намного ближе к тому, что я хочу. Мне просто нужно «как-то» отфильтровать результаты, которые не имеют «postgres» в строке под ними, и найти способ игнорировать повторяющиеся значения, например, не перечислять два 5432. Есть идеи, как мне это сделать?

1 Ответ

0 голосов
/ 01 июня 2019
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q56399294.txt"

:: remove variables starting #
FOR  /F "delims==" %%a In ('set # 2^>Nul') DO SET "%%a="

FOR /f "usebackq tokens=1,3 delims=[:] " %%p IN ("%filename1%") DO (
 IF "%%p"=="postgres.exe" (CALL :record) ELSE (SET "candidate=%%q")
)

FOR  /F "delims=#=" %%a In ('set # 2^>Nul') DO ECHO %%a

GOTO :EOF

:record
SET "#%candidate%=Y"
GOTO :eof

Я использовал файл с именем q56399294.txt, содержащий ваши netstat данные для моего тестирования.

Сначала очистите все переменные, начиная с # Затем проанализируйте вывод netstat (я предположил, что каждая строка начинается с пробела, как указано) и выберите первый и третий токен (примечание DELIMS было изменено на включить пространство). Порт должен быть назначен на %%q, а затем на candidate, если только первый токен не равен postgres.exe, когда порт из предыдущей строки записан как # port . Наконец, сообщите о любых # портах s, которые установлены.

...