CMD / Windows shell - найти и заявить программу, используя порт - PullRequest
1 голос
/ 08 июня 2011

Это больше вопрос программирования оболочки Win32 - намерение состоит в том, чтобы иметь команду с одной строкой / каналом, которая даст мне приложение, использующее определенный порт -

У меня есть 2 команды оболочки, и я хочу объединить / передать их вместе:

netstat -aon | findstr 0.0:80
wmic PROCESS get Caption,ProcessId | findstr <process_id_here>

Первая команда дает мне идентификатор процесса, который использует порт 80 на моей машине, например. "12345" Вторая команда дает мне имя процесса, если я даю «12345» в

Я не уверен, как тогда объединить - могу ли я передать processID ко второй команде? Можно ли это сделать в одну строку ... И как ...

Спасибо - Сами

1 Ответ

2 голосов
/ 08 июня 2011

Добавление аргумента -b к команде netstat также даст имя исполняемого файла с открытым портом.

netstat -aonb

Обновление

Невозможно соединить две команды вместе, потому что для этого вторая команда должна принять в стандартном вводе результаты первой команды в стандартном выводе.В вашем примере это не тот случай.

Одна из возможностей для такого рода действий заключается в использовании команды for /f, и она может маркировать выходные данные команды, чтобы назначать биты вывода переменным, которыезатем может быть использован в другой команде.Проблема здесь заключается в том, что символ канала нельзя использовать в команде, выходные данные которой обрабатываются командой for.Вы можете делать то, что хотите, только в одной строке, хотя и довольно страшной:

for /f "tokens=2,5" %i in ('netstat -aon') do @(if "%i"=="0.0.0.0:80" (wmic PROCESS get Caption,ProcessId | findstr "%j"))

Эта строка выполняет команду netstat -aon, а затем для каждой строки вывода выполняет следующее:

  • Разбивает строку на токены, используя пробелы в качестве разделителя
  • Назначает токены 2 и 5 переменным% i (адрес для регистрации: порт) и% j (идентификатор процесса)
  • Проверяет, является ли %i строка для порта, который вы ищете
  • Если это так, запускает команду wmic и фильтрует вывод на основе% j

Другое обновление

Я только что обнаружил, что в команде for можно использовать команду по каналу.Итак, вот несколько более простой однострочный текст, который в основном делает именно то, что вы просите:

for /f "usebackq tokens=5" %i in (`"netstat -aon | findstr "0.0:80""`) do @wmic PROCESS get Caption,ProcessId | findstr "%i"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...