如何通过 Batch-Vbscript 混合脚本获取新生成进程的窗口标题?

Posted

技术标签:

【中文标题】如何通过 Batch-Vbscript 混合脚本获取新生成进程的窗口标题?【英文标题】:How to get Window title of newly spawned process thro' Batch-Vbscript hybrid script? 【发布时间】:2020-12-29 06:53:05 【问题描述】:

我正在尝试尽可能自动化组策略编辑过程。

我有以下脚本来生成 gpedit.msc 进程,但它的窗口一打开就失去焦点:

FINDSTR /E "'VbsCode" %~f0 > %temp%\~temp.vbs
CSCRIPT //NOLOGO %temp%\~temp.vbs
Sub GPEditOptions 'VbsCode
    On Error Resume Next 'VbsCode
    Set WshShell = WScript.CreateObject("WScript.shell") 'VbsCode
    WshShell.Visible = False 'VbsCode
    WshShell.Run "gpedit.msc",0 'VbsCode
    :: WshShell.AppActivate "Local Group Policy Editor" 'VbsCode
End Sub 'VbsCode
GPEditOptions 'VbsCode
:: WScript.Quit 0 'VbsCode

我如何AppActivate 新生成的 gpedit.msc 进程打开的窗口?具体来说,如何知道已打开的窗口的名称/标题是什么? “本地组...编辑器”不起作用。

【问题讨论】:

【参考方案1】:

我想我最终想通了,如何解决这个问题。有不同类型的流程。

在这种情况下,我首先需要选择Microsoft Management Console 窗口,因为它是产生实际“本地组策略编辑器”子进程的父进程。

因此,此代码通过预先发送大量键来选择第一个以字母“W”开头的 Windows 组件,是的,您确实需要管理员提升才能在 gpedit.msc 窗口中正确选择选项:

@echo off
net file 1>nul 2>nul
if not '%errorlevel%' == '0' (
    powershell Start-Process -FilePath "%0" -ArgumentList "%cd%" -verb runas >nul 2>&1
    exit /b
)
cd /d %1

FINDSTR /E "'VbsCode" %~f0 > %temp%\~temp.vbs
CSCRIPT //NOLOGO %temp%\~temp.vbs
Sub GPEditOptions 'VbsCode
    On Error Resume Next 'VbsCode
    Set WshShell = WScript.CreateObject("WScript.shell") 'VbsCode
    WshShell.Visible = False 'VbsCode
    WshShell.Run "gpedit.msc",0 'VbsCode
    WScript.Sleep 500 : WshShell.AppActivate "Microsoft Management Console" 'VbsCode
    WScript.Sleep 500 : WshShell.AppActivate "Local Group Policy Editor" 'VbsCode
    WScript.Sleep 500 : WshShell.sendKeys "% xTABENTER" 'VbsCode
    WScript.Sleep 500 : WshShell.sendKeys "TABTABTABTAB" 'VbsCode
    WScript.Sleep 500 : WshShell.sendKeys "DOWNDOWNENTER" 'VbsCode
    WScript.Sleep 500 : WshShell.sendKeys "TABTABTABTAB" 'VbsCode
    WScript.Sleep 500 : WshShell.sendKeys "DOWNDOWNDOWNDOWN" 'VbsCode
    WScript.Sleep 500 : WshShell.sendKeys "DOWNDOWNENTER" 'VbsCode
    WScript.Sleep 500 : WshShell.sendKeys "TABTABTABTABW" 'VbsCode
End Sub 'VbsCode
GPEditOptions 'VbsCode
WScript.Quit 0 'VbsCode

希望这对遇到类似问题的人有所帮助。

【讨论】:

【参考方案2】:

无需发送一堆密钥并获取组策略编辑器窗口标题。

实际上每个组策略设置都有等效的注册表项。并且可以从 VBScript 轻松编辑注册表。要查找组策略设置的等效注册表项:

从 SysInternals 下载一个名为 Process Monitor 的工具。 运行它并单击过滤器 > 过滤器。 现在创建两个过滤器,例如:"Process name" - "is" - "mmc.exe" - then "include""Operation" - "is" - "RegSetValue" - then "Include"。 现在编辑组策略设置,注册表项将出现在进程监视器中。

以及在 VBScript 中编辑注册表的功能:

Function RegSetValue(regkey,value)
  Dim WshShell
  Set WshShell = CreateObject("Wscript.Shell")
  WshShell.RegWrite(regkey,value)
End Function

【讨论】:

你的回答没问题,但我想使用默认系统做一些事情,即不安装额外的工具/应用程序,但感谢你的想法。

以上是关于如何通过 Batch-Vbscript 混合脚本获取新生成进程的窗口标题?的主要内容,如果未能解决你的问题,请参考以下文章

Batch-VBScript 发送特定键的特定次数[关闭]

如何调试混合 cmd 和 powershell 脚本以解决特殊字符问题,如 & 和

如何从混合任务中运行混合任务?

通过 Harfbuzz 和 FreeType 在文本编辑器中显示混合复杂脚本

如何在 PHP 脚本中混合音轨?

IBM Worklight 6.0 - 在加载框架库和 css 时,在混合应用程序(使用 Dojo 工具包 1.9)中获得了明显的亮点?