python - 带描述的任务列表命令

标签 python tasklist

我正在尝试找出一个tasklist命令,该命令提供Description以及Taskmangaer UI中所示的内容?我正在尝试从python运行它,如果它是不可能有一个等效的 python 命令来获取所有带有描述的任务列表?

tasklist /?

最佳答案

这比您想象的要棘手一些,您确实需要一个充分的理由来克服所有麻烦来证明它的合理性。首先,任务管理器 UI 无法从 tasklist.exe 获取其信息。 ,尽管您可以非常接近:

import csv
import subprocess

try:
    tl_out = subprocess.check_output(["tasklist", "/fo", "csv", "/v"])
except subprocess.CalledProcessError as e:
    print("Call to `tasklist` failed: {}".format(e))
    exit(1)

tl_csv = csv.DictReader(tl_out.splitlines())
for row in tl_csv:
    print(row)  # prints a dict for each task with all available fields
    # Available fields (may vary from platform to platform) are:
    # 'Status', 'CPU Time', 'Image Name', 'Session Name', 'Window Title',
    # 'PID', 'User Name', 'Session#', 'Mem Usage'

但是,要访问 Description字段(以及任务管理器 UI 中的许多其他字段),您至少必须从 WMI 中提取数据。更糟糕的是,WMICWindows 7 has a bug when exporting to CSV让整个事情变得更加复杂,为了获得最大的可移植性,我们需要使用 list自己格式化并解析:

import subprocess

try:
    wmi_out = subprocess.check_output(["wmic", "process", "list", "full", "/format:list"])
except subprocess.CalledProcessError as e:
    print("Call to `wmic` failed: {}".format(e))
    exit(1)

# parse the WMI list:
wmi_entries = []
for task in wmi_out.strip().split("\r\r\n\r\r\n"):
    wmi_entries.append(dict(e.split("=", 1) for e in task.strip().split("\r\r\n")))

for row in wmi_entries:
    print(row)  # prints a dict for each task with all available fields
    # Available fields (may vary from platform to platform) are:
    # 'CSName', 'CommandLine', 'Description', 'ExecutablePath', 'ExecutionState', 'Handle',
    # 'HandleCount', 'InstallDate', 'KernelModeTime', 'MaximumWorkingSetSize',
    # 'MinimumWorkingSetSize', 'Name', 'OSName', 'OtherOperationCount', 'OtherTransferCount',
    # 'PageFaults', 'PageFileUsage', 'ParentProcessId', 'PeakPageFileUsage',
    # 'PeakVirtualSize', 'PeakWorkingSetSize', 'Priority', 'PrivatePageCount', 'ProcessId',
    # 'QuotaNonPagedPoolUsage', 'QuotaPagedPoolUsage', 'QuotaPeakNonPagedPoolUsage',
    # 'QuotaPeakPagedPoolUsage', 'ReadOperationCount', 'ReadTransferCount', 'SessionId',
    # 'Status', 'TerminationDate', 'ThreadCount', 'UserModeTime', 'VirtualSize',
    # 'WindowsVersion', 'WorkingSetSize', 'WriteOperationCount', 'WriteTransferCount'
<小时/>

Python3 的代码更新(使用编码进行按字节搜索):

s1 = "\r\r\n\r\r\n".encode()
s2 = "\r\r\n".encode()
for task in wmi_out.strip().split(s1):
   wmi_entries.append(dict(e.split("=".encode(), 1) for e in task.strip().split(s2)))
<小时/>

如果您不需要所有这些字段,您可以随时限制 wmic获取您想要的字段(即 wmi_out = subprocess.check_output(["wmic", "process", "get", "ProcessId,ExecutablePath,Description", "/format:list"]) 只获取 Description 每个 ProcessId )。

但不要以为你的麻烦就结束了——我们才刚刚开始。虽然我们现在有 Description字段(以及其他一些要引导的字段),您会注意到,对于不公布其描述的进程(其中大多数,Windows 程序员显然很懒)或没有描述的服务 - 描述值仅包含可执行文件名称,即如果您正在运行普通的旧记事本,而任务管理器 UI 将显示 Notepad作为描述,其字典条目将有 notepad.exe - 这是因为任务管理器 UI 使用完全不同的方法来处理任务列表,并直接从流程可执行文件获取描述。

因此,您实际上需要一个额外的步骤来直接从其资源表中检索可执行文件描述,这可能是通过调用 Win32 API 来获取描述的“最简单”方法,因此您需要安装 pyWin32第一个模块:

import subprocess
import win32api

# gets executable description via W32API
def get_executable_desc(path, default=''):
    try:
        language, codepage = win32api.GetFileVersionInfo(path, "\\VarFileInfo\\Translation")[0]
        return win32api.GetFileVersionInfo(path, "\\StringFileInfo\\{:04x}{:04x}\\FileDescription".format(language, codepage)) or default
    except:
        return default

try:
    wmi_out = subprocess.check_output(["wmic", "process", "list", "full", "/format:list"])
except subprocess.CalledProcessError as e:
    print("Call to `tasklist` failed: {}".format(e))
    exit(1)

# parse the WMI list:
wmi_entries = []
for task in wmi_out.strip().split("\r\r\n\r\r\n"):
    entry = dict(e.split("=", 1) for e in task.strip().split("\r\r\n"))
    entry['Description'] = get_executable_desc(entry.get("ExecutablePath", None), entry.get("Description", None))
    wmi_entries.append(entry)

for row in wmi_entries:
    print(row)  # prints a dict for each task with all available fields

Voilà!现在已填充描述(如果可用,或至少保存可执行文件名称),但由于我们必须使用 Win32 API 来获取描述,因此我们不妨获取任务列出它 - 它更快、更简洁:

from win32api import GetFileVersionInfo, OpenProcess
from win32con import PROCESS_QUERY_INFORMATION, PROCESS_VM_READ
from win32process import EnumProcesses, EnumProcessModules, GetModuleFileNameEx
import pywintypes

# gets executable description via W32API
def get_executable_desc(path, default=''):
    try:
        language, codepage = GetFileVersionInfo(path, "\\VarFileInfo\\Translation")[0]
        return GetFileVersionInfo(path, "\\StringFileInfo\\{:04x}{:04x}\\FileDescription".format(language, codepage)) or default
    except:
        return default

# gets the process list via W32API        
def get_process_list():
    proc_list = []
    processes = EnumProcesses()
    if not processes:
        return []  # optionally raise an exception, no ProcessIds could be obtained
    for proc in processes:
        try:
            handle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, pywintypes.FALSE, proc)
            modules = EnumProcessModules(handle)
            if not modules:
                continue  # task died in the meantime?
            path = GetModuleFileNameEx(handle, modules[0])
            proc_list.append({"ProcessId": proc, "ExecutablePath": path, "Description": get_executable_desc(path, path)})
        except pywintypes.error as e:
            continue  # optionally report the error stored in `e`
    return proc_list

tasks = get_process_list()
for row in tasks:
    print(row)  # prints a dict for each task with ProcessId, ExecutablePath and Description fields

这只会获取 ProcessId、ExecutablePath 和 Description,但如果您需要更多字段,您可以进一步探索 Win32 API。

同样,我不明白Description有什么值(value)。领域是要经历所有这些麻烦,但如果你真的非常想要它 - 这就是如何获得它。

关于python - 带描述的任务列表命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44008243/

相关文章:

filter - 在tasklist.exe中过滤不带通配符?

python - 在python中合并具有相同类别的csv文件行

python - 我如何根据我提供的特定顺序进行排序

windows - 查看进程树 - tlist/tasklist

Java 循环输入流直到 boolean = false

windows - 用于测试 TASKKILL 错误级别的语法

python - 如何从 Python 中的 SQLite3 数据库查询构建字典列表?

python - re.sub 与 utf-8 字符串的奇怪行为

python - 在 python numpy.savez 中使用变量值而不是关键字

java - 在 Windows 2000 Pro 上通过 Java 获取 Activity 进程