4

Мне было интересно, как можно получить имя файла, если у него есть PID запущенного процесса.

Скажите, если у меня есть 2 текстовых файла notepad.exe, запущенных последовательно, и я запускаю в командной строке (код предоставлен: https://stackoverflow.com/questions/13507902/how-to-extract-a-specific-field-from- вывод-списка-задач-на-окнах-команда-l):

for /f "tokens=2 delims=," %F in ('tasklist /nh /fi "imagename eq notepad.exe" /fo csv') do @echo %~F

Я получаю результат:

6624 7124

Какое текстовое имя файла является PID 6624? или Какой текстовый файл с именем PID 7124?

скажем, PID 6624 - это «findme1.txt», а PID 7124 - это findme2.txt »

Я не знаю, какой из PID процессов убивает.

Я мог бы убить неправильный процесс и потерять важную информацию ...

Другими словами: какой из приведенных выше файлов findme * .txt является findme1.txt, а какой из вышеуказанных файлов findme * .txt - findme2.txt?

Я только хочу убить findme1.txt и НЕ findme2.txt, который содержит жизненно важную системную информацию, скажем.

Любые предложения будут приветствоваться и благодарны мне. Заранее большое спасибо.

1 ответ1

0

То, что вы ищете, это имя файла, над которым работает каждый процесс - если таковой имеется.

фон

Проблема в том, что имя файла, над которым выполняется работа (в отличие от имени исполняемого файла), обычно не отображается в выводе списка задач или выводе любого другого стандартного инструмента командной строки, о котором я знаю.

У процесса всегда есть внутренний список файлов, которые он открыл - они находятся в "дескрипторной таблице" процесса. Это видно, например, в Process Explorer, но вам нужен инструмент командной строки. И нет никакого общего способа узнать, среди всех файлов, открытых процессом, какой документ является документом, открываемым процессом для редактирования.

Тем не мение. Некоторые приложения, в том числе Блокнот, пакет Office и многие другие, задают имя файла в заголовке окна. например, «Блокнот file1.txt» Это не в согласованной форме от одного приложения к другому. Приложение может установить заголовок своего окна на что угодно. Программа может, например, сначала указать собственное имя, а затем имя файла. Без разницы.

Итак, вы хотите посмотреть на заголовки окон. Диспетчер задач может показывать заголовки окон, но вам нужен инструмент командной строки. Как отмечает JosefZ, tasklist /v может сделать это. (Существует также небольшая программа под названием tlist, которая сделает это. Он поставляется с пакетом средств отладки Windows.) Однако они покажут вам, помимо процессов, которые вы хотите, целую кучу процессов, которые не имеют имен окон.

ответ

PowerShell на помощь! Попробуйте это в командной строке: (Вы не должны быть в c:\, это только пример)

c:\> powershell -command "get-Process | where-Object {$_.mainWindowTitle} | format-table id,name,mainwindowtitle -AutoSize"

Это перечислит все процессы, которые имеют непустой заголовок окна.

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

c:\> powershell -command "get-Process notepad | where-Object {$_.mainWindowTitle} | format-table id,name,mainwindowtitle -AutoSize"

Это фильтрует вывод get-Process до того, как он достигнет остальных команд. команда where-Object фильтрует непустые заголовки окон, а таблица форматов просто помещает результат в аккуратную таблицу.

Теперь давайте сделаем это проще. Поместите следующее в файл .cmd, скажем, вы называете его wn.cmd (wn для windowname). Поместите wn.cmd в какой-то каталог, который находится на вашем пути. (Я всегда создаю каталог с именем c:\progs и добавляю его к своему пути, для таких мелочей, как этот. Я поместил инструменты sysinternals в этот каталог тоже.)

c:\> @echo off
c:\> powershell -command "get-Process %1 | where-Object {$_.mainWindowTitle} | format-table id,name,mainwindowtitle -AutoSize"

Примеры

Теперь в командной строке ... при условии, что wn.cmd находится где-то на вашем пути ... вы можете просто набрать

c:\> wn

и вы получите полный список процессов с именованными окнами .. вот так:

   Id Name           MainWindowTitle
   -- ----           ---------------
 9596 chrome         How can I show the file NAME of each running process from the command-line in Windows? - Super ...
11980 cmd            Command Prompt - wn
10164 explorer       progs
10180 Horas          Horas - Fri 11
 2520 notepad        windownames.ps1 - Notepad
15348 notepad        notes2.txt - Notepad
 8304 OUTLOOK        Inbox - mailbox - Outlook
17312 powershell_ise Windows PowerShell ISE
 6140 TTool103       Alarm

и если вы наберете, например,

c:\> wn notepad

вы получаете только те, на которых работает блокнот:

   Id Name    MainWindowTitle
   -- ----    ---------------
 6240 notepad Untitled - Notepad
13096 notepad wn.cmd - Notepad
15348 notepad notes2.txt - Notepad

(Этот выбор идет по имени исполняемого файла, а не заголовку окна.)

Кредит, где кредит должен: я нашел оригинальный "скрипт" powershell для перечисления процессов с именованными окнами на этой странице powershell.com . Упаковка в файл .cmd упрощает его использование.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .