【发布时间】:2019-05-31 17:16:58
【问题描述】:
我正在设置一个 bat 脚本,按使用的端口(5432、5433 等)列出所有 postgres 安装,并让用户选择安装。我 netstat 成一个 txt,然后用 for 循环读取它以过滤结果
到目前为止一切顺利,但问题是我无法根据自己的喜好缩小结果范围。我希望生成的列表是这样的:
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
这是 for 循环过滤的 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
我不知道如何进一步过滤结果。我正在使用“-b”生成 netstat,因为我想知道哪些 .exe 正在使用哪些端口。
是否可以循环 for 循环? for 中的 for,所以我可以进一步缩小结果范围吗? 如果我可以例如运行这个 for:
for /f "usebackq tokens=1 delims=. " %%s in ("F:\lop.txt") do (echo %%s)
因为 lop.txt 具有前一个 for 的输出,所以我最终会得到:
5432
postgres
5432
postgres
5939
49680
49680
这将更接近我想要的。我只需要“以某种方式”过滤掉下面一行没有“postgres”的结果,并找到一种忽略重复值的方法,比如不列出两个 5432。知道我该怎么做吗?
【问题讨论】:
-
for /f "tokens=3 delims=: " %a in ('netstat') do @echo %a做你想做的事吗? -
@Stephan - 我认为如果您将 IN() 子句更改为
('netstat -bnf -p tcp ^| findstr "127.0.0.1 post"')
标签: batch-file for-loop findstr