我想使用批处理脚本命令获取使用 GDI 对象 157 运行的进程,但无法做到这一点,我的脚本是 tasklist /fi "gdiobject eq 157"
答案1
读取全文tasklist /?
:列出了所有允许的过滤器(11
目前仅有过滤器名称)。
此外,您无法检索Windows 任务管理器GDI Objects
专栏使用命令行实用程序tasklist.exe
或 powershell cmdlet Get-Process
。您需要使用以下方法计算GetGuiResources
功能:
检索指定进程正在使用的图形用户界面 (GUI) 对象的句柄数。
幸运的是,有一种方法可以在 Windows PowerShell 中调用本机 Windows API:Add-Type
命令.dll
可以使用平台调用 (P/Invoke) 机制从 Windows PowerShell调用库中的函数。
例如,示例 5:调用本机 Windows API足以证明这一点,可以编写以下简单的脚本:
# GDI objects: get number of GDI handles per process
Add-Type -Name NativeMethods -Namespace Win32 -MemberDefinition @'
[DllImport("User32.dll")]
public static extern int GetGuiResources(IntPtr hProcess, int uiFlags);
'@
$allProcesses = [System.Diagnostics.Process]::GetProcesses() #or# Get-Process
$auxCountHandles = [int]0
$auxCountProcess = [int]0
$GuiResources = @()
ForEach ($p in $allProcesses) {
if ( [string]::IsNullOrEmpty( $p.Handle)) { continue }
$auxCountProcess += 1
$auxGdiHandles = [Win32.NativeMethods]::GetGuiResources($p.Handle, 0)
If ($auxGdiHandles -eq 0) { continue }
$auxCountHandles += $auxGdiHandles
$auxDict = [ordered]@{
PID = $p.Id
Handles = $auxGdiHandles
ProcessName = $p.Name
}
$GuiResources += [PSCustomObject]$auxDict
}
$GuiResources #| Sort-Object "ProcessName" #| Format-Table -AutoSize
<##>
### summary debugging output ###
Write-Host $('{0} processes; {1}/{2} with/without GDI objects' -f $allProcesses.Count,
$GuiResources.Count,
($allProcesses.Count - $GuiResources.Count))
Write-Host "Total number of GDI handles: $auxCountHandles`n"
<##>
示例输出(截断):
PS C:\WINDOWS\system32> D:\PShell\tests\GdiObjectCounter.ps1
161 processes; 27/134 with/without GDI objects
Total number of GDI handles: 2642
PID Handles ProcessName
--- ------- -----------
712 16 SettingSyncHost
744 6 winlogon
7524 7 ShellExperienceHost
3852 36 RuntimeBroker
3696 74 chrome
…