批处理或 PowerShell 命令获取 Windows 中所有打开的应用程序的名称

Posted

技术标签:

【中文标题】批处理或 PowerShell 命令获取 Windows 中所有打开的应用程序的名称【英文标题】:Batch or PowerShell command to get the names of all the open applications in Windows 【发布时间】:2014-02-12 00:13:32 【问题描述】:

我们有一个命令行实用程序,可以在服务器上打开 MS Office 文档并将它们转换为 PDF。对于其中包含宏的 Office 文档,将弹出一条安全警告消息,并且在有人启用宏之前,该实用程序不会继续完成工作。

例如,Visio 文件的警告消息对话框的标题为“Microsoft Visio 安全通知”。我们需要点击启用按钮。

此标题显示在 Windows 任务管理器的应用程序窗格中,但不在进程列表中。

我想编写一个实用程序来在发生这种情况时通知我。

您能否告诉我可以使用什么批处理或 PowerShell 命令来读取/搜索基于名称的任务列表(即,获取显示在 Windows 任务管理器的应用程序窗格中的所有应用程序的名称)。

我已经尝试过任务列表和获取进程。它们提供有关进程的信息,但不提供应用程序窗口标题的详细信息。

请您分享一种获取应用程序窗口名称列表的方法或检查是否有通过脚本打开的安全警告的方法。

【问题讨论】:

仅供参考,在较新版本的 Office 中,此警告不会显示在对话框中。它显示在应用主窗口顶部附近的信息栏中(以及启用按钮)。 【参考方案1】:

这是一个概念证明。如果需要,您可以实现电子邮件功能或触发器。但实际上,如果您知道窗口标题,操作起来相当容易。

$vischk = get-process | where-object $_.mainwindowhandle -ne 0 -and $_.MainWindowTitle -eq "Microsoft Visio Security Notice" | select-object name, mainwindowtitle

  if (!($vischk)) 
  
  Write-Warning "Security notice not present"
   else 
  Write-Warning "This is where you'd do your scripting"
  

【讨论】:

这给出了实用程序或进程的名称,而不是窗口名称。例如,在 IE 中打开 google.com 并转到任务管理器应用程序面板,您将看到 google 作为任务名称。当我们看到该进程时,它只显示 iexplorer.exe。我正在尝试在应用程序面板中搜索 google。【参考方案2】:

您在 TaskManager 中看到的信息(至少是 Win8 上的信息)可能来自 FileVersionInfo 的 Product 或 Description 字段,例如:

Get-Process | % $_.MainModule | ft Product,Description

顺便说一句,如果您正在寻找对话框窗口标题,则该过程的 MainWindowTitle 不会帮助您。您需要能够找到一个可以使用WASP 模块执行的窗口。如果是较新版本的 Office,主要应用程序将不再使用对话框来显示有关启用宏等的安全警告。

【讨论】:

感谢 WASP 的提示,我可能需要探索一下。

以上是关于批处理或 PowerShell 命令获取 Windows 中所有打开的应用程序的名称的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PowerShell 或 C# 中获取进程的命令行信息

UI Automation技术获取cmd或Powershell命令提示符窗口的实时内容

是否有任何 PowerShell 脚本或命令可以从 Azure 门户获取租户中所有用户访问角色的报告?

使用PowerShell操作Windows服务的命令小结

如何使用批处理或 powershell 更改 Windows PC 的主机名

Powershell 如何获取异常的名称