Vbscript 在HTA中选择ProcessId意外行为

Vbscript 在HTA中选择ProcessId意外行为,vbscript,Vbscript,首先,谢谢你的阅读 我有一个HTA来集中一些重复的任务。 通过ssh登录到多个服务器并发送多个命令就是其中之一 这段代码在vbs文件中像一个符咒一样工作 Option Explicit Dim Shell, WMI, wql, process Set Shell = CreateObject("WScript.Shell") Set WMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") wql

首先,谢谢你的阅读

我有一个HTA来集中一些重复的任务。 通过ssh登录到多个服务器并发送多个命令就是其中之一

这段代码在vbs文件中像一个符咒一样工作

Option Explicit

Dim Shell, WMI, wql, process

Set Shell = CreateObject("WScript.Shell")
Set WMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")

wql = "SELECT ProcessId FROM Win32_Process WHERE Name = 'putty.exe'"
dim cmd : cmd=InputBox("Enter command")
For Each process In WMI.ExecQuery(wql)
    Shell.AppActivate process.ProcessId
    Shell.SendKeys cmd & " {ENTER}"
Next
但是这个等价物,在HTA内部,只向一个或两个窗口发送命令

sub sendToPuttyWindow(cmd)
    Dim Shell, WMI, wql, process

    Set Shell = CreateObject("WScript.Shell")
    Set WMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")

    wql = "SELECT ProcessId FROM Win32_Process WHERE Name = 'putty.exe'"

    For Each process In WMI.ExecQuery(wql)
        Shell.AppActivate process.ProcessId
        Shell.SendKeys cmd & " {ENTER}"
    Next
end sub
目前,我正在从hta调用vbs文件,但我希望保持hta文件尽可能独立

你能帮帮我吗?

不要用
发送键来自动安装腻子。它将所有模拟的击键发送到当前的前台窗口,不管是什么。如果需要连续运行多个命令:请使用PuTTY套件中的。它就是为了这个目的而建的

plink -ssh -batch -m file user@host

我会检查
SendKeys
API,包括等待处理选项、调试,以及众所周知的“复杂”问题。谢谢您的评论。我知道普林克,我把它用于其他目的。但对于这种情况,我需要的是向所有的putty窗口发送击键。有一些程序可以做这种事情,putty命令发送器就是一个例子。我需要使用一个交互式会话登录多个服务器,有时我想向所有打开的putty窗口发送击键。我不理解SendKeys方法的歇斯底里。@Danielo515
SendKeys
的问题是它的按键会进入当前的前台窗口,不管是什么。VBScript无法可靠地将击键发送到特定窗口。链接的文档说明:指定要激活的应用程序。这可以是包含应用程序标题(如标题栏中所示)或应用程序进程ID的字符串。如您所见,进程ID是有效的输入。正如我所说,这就像一个来自外部vbs文件的魅力。无论如何谢谢你的努力嗯。。。你说得对。我不知道为什么我没有注意到“或应用程序的进程ID”部分。无论如何,我从我的答案中删除了不正确的注释。