我想知道如果一个人拥有正在运行的进程 PID,他如何能获得文件的名称。
假设我有 2 个连续运行的 notepad.exe 文本文件,并且我在命令行运行(代码由以下公司提供:https://stackoverflow.com/questions/13507902/how-to-extract-a-specific-field-from-output-of-tasklist-on-the-windows-command-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
您所要查找的是每个进程正在处理的文件的名称(如果有)。
背景
问题在于正在处理的文件的名称(与可执行文件名不同)通常不会显示在任务列表输出中,或者我所知道的任何其他标准命令行工具的输出中。
进程始终有一个已打开文件的内部列表 - 这些文件位于进程“句柄表”中。这在 Process Explorer 等中可见,但您需要一个命令行工具。并且没有通用的方法可以知道在进程打开的所有文件中,哪个是进程打开以进行编辑的文档。
但是,有些应用程序(包括记事本、Office 套件和许多其他应用程序)确实会在其窗口标题中设置文件名。例如“Notepad 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 命令会过滤非空窗口标题,而 format-table 只是将结果放在一个整洁的表中。
现在,让我们让它变得简单一些。将以下内容放入 .cmd 文件中,假设您将其命名为 wn.cmd(wn 代表窗口名称)。将 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 文件只是为了更方便使用。