在 Windows 中,使用 PowerShell 或 cmd shell,如何获取所有当前正在运行的应用程序列表,并按它们最后使用的时间排序(即它们在前台)?更具体地说,我需要这些应用程序的 PID 和进程名称。
理想情况下,我希望该列表与 Windows 任务栏中显示的应用程序相同,即包括文件资源管理器。
我需要这个列表来实现 Python 中的应用程序和窗口切换器实用程序。到目前为止,我已经找到了一个gps
或get-process
PowerShell 解决方案中的命令,但使用该解决方案,我找不到按应用程序最后使用时间对列表进行排序的方法。此外,它列出了一些额外的项目,而不仅仅是可以在 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
#>