Windows:如何获取按最后使用时间排序的正在运行的应用程序列表?

Windows:如何获取按最后使用时间排序的正在运行的应用程序列表?

在 Windows 中,使用 PowerShell 或 cmd shell,如何获取所有当前正在运行的应用程序列表,并按它们最后使用的时间排序(即它们在前台)?更具体地说,我需要这些应用程序的 PID 和进程名称。

理想情况下,我希望该列表与 Windows 任务栏中显示的应用程序相同,即包括文件资源管理器。

我需要这个列表来实现 Python 中的应用程序和窗口切换器实用程序。到目前为止,我已经找到了一个gpsget-processPowerShell 解决方案中的命令,但使用该解决方案,我找不到按应用程序最后使用时间对列表进行排序的方法。此外,它列出了一些额外的项目,而不仅仅是可以在 Windows 任务栏中找到的应用程序,对于某些应用程序(例如 cmd shell 窗口),它会将该应用程序窗口的每个实例列为列表中的单独项目,而我需要列表仅包含最近使用的 cmd 窗口。

因此,在第一步中,我需要这个正在运行的应用程序列表,然后在此基础上为列表中的每个应用程序项创建一个子菜单,以包含仅与所选应用程序有关的所有窗口,用户可以切换到该窗口。

答案1

根据@ReddyLutonadio',您将获得:

Get-Process | 
Where {$_.MainWindowTitle } | 
ForEach { Get-ChildItem $_.Path} | 
Select Name, LastAccessTime | 
Sort LastAccessTime
# Results
<#
Name                     LastAccessTime
----                     --------------
TextInputHost.exe        24-Jul-22 18:48:48
Calculator.exe           24-Jul-22 18:49:11
SystemSettings.exe       24-Jul-22 18:55:28
msedge.exe               24-Jul-22 21:53:50
OUTLOOK.EXE              24-Jul-22 21:53:50
EXCEL.EXE                24-Jul-22 21:53:50
ApplicationFrameHost.exe 24-Jul-22 21:53:50
powershell.exe           24-Jul-22 21:53:50 <--------- Process that ran the command
#>

重构“@ReddyLutonadio”有用的答案,如“DrMoishe Pippik”评论所示,以说明我的意思

消除运行该命令的当前进程。

(Get-Process | 
Where { $_.MainWindowTitle } | 
ForEach { Get-ChildItem $_.Path} | 
Select Name, LastAccessTime | 
Sort LastAccessTime) -notmatch [System.Diagnostics.Process]::GetCurrentProcess()

# Results
<#
Name                     LastAccessTime
----                     --------------
TextInputHost.exe        24-Jul-22 18:48:48
Calculator.exe           24-Jul-22 18:49:11
SystemSettings.exe       24-Jul-22 18:55:28
msedge.exe               24-Jul-22 21:54:50
OUTLOOK.EXE              24-Jul-22 21:54:50
EXCEL.EXE                24-Jul-22 21:54:50
powershell.exe           24-Jul-22 21:54:50
ApplicationFrameHost.exe 24-Jul-22 21:54:50
#>

注意事项:

上述响应仅从真正的 PowerShell 控制台实例执行时才有效。它在 PowerShell ISE 中不起作用。

笔记:

使用“Windows 终端” PScore (psv7...) 时,不需要该过滤器,因为不会报告该过程。您还将获得更长的列表。

笔记:

在原始 PSCore 中,您仍然需要如图所示的过滤器。

所以,重点是,您需要记住您在哪里运行它,因为结果会有所不同。

因此,在 powershell.exe、powershell_ise.exe、pwsh.exe 以及从“Windows 终端”通过“Windows PowerShell 和 PowerShell Core”测试该命令,亲自查看结果。

另外,在 VSCode 中测试,以确保您知道什么是什么。

更新并根据您的问题

Get-Process | 
Where { $PSItem.MainWindowTitle } | 
ForEach-Object { $PSItem } | 
Select ProcessName, Id, 
@{Name = 'LastAccessTime';Expression = {(Get-ChildItem $PSItem.Path).LastAccessTime}} | 
Sort LastAccessTime
# Results
<#
ProcessName             Id LastAccessTime
-----------             -- --------------
TextInputHost        14048 25-Jul-22 08:06:59
SystemSettings        7468 25-Jul-22 08:07:18
Calculator            8824 25-Jul-22 08:08:01
msedge               11372 25-Jul-22 10:40:10
OUTLOOK              10988 25-Jul-22 10:40:10
powershell_ise       20524 25-Jul-22 10:40:10
ApplicationFrameHost  7496 25-Jul-22 10:40:10
notepad               4212 25-Jul-22 10:40:10
powershell           17824 25-Jul-22 10:40:11
powershell           21824 25-Jul-22 10:40:11
#>

相关内容