您可以尝试通过将击键作为 Windows 消息发送到运行程序的 CMD 窗口来以编程方式输入命令。
我不知道 VBS,也许它有一个或多个函数映射到系统 API 函数PostMessage 和/或SendMessage。如果这样做会很棒,尤其是如果有人发布了解释如何使用它们的答案。同时,我可以通过一个名为SendMessage 的实用程序在批处理文件中向您展示如何使用此方法。
基本上,该实用程序允许您将任意 Windows 消息发送到任意窗口,如下所示:
SendMessage.exe target_specification /message:value /wparam:value /lparam:value
稍后我将解决 target_specification 位,其他参数是:
-
/message:<i>value</i> – 正在发送的消息,由 code 指定。在您的情况下,它将是以下任何一种:
/message:WM_CHAR
/message:258
/message:0x0102
其中都指定WM_CHAR message。
-
/wparam:<i>value</i> – 对于 WM_CHAR 消息,这应该是正在发送的击键代码。
在您的情况下,由于您的命令仅包含 ASCII 字符,因此所有代码都将匹配相应字符的 ASCII 代码。因此,您可以使用ASCII chart 来转换命令中的字符。例如,s 是
/wparam:115
和h
/wparam:104
等等。
请注意,您还需要发送 Enter 按键。根据ASCII control code chart,应该是
/wparam:13
-
/lparam:<i>value</i> – 您可以从WM_CHAR's manual page 中看到,LPARAM 参数实际上应该将多条信息作为单个数值携带。但是,对于您的具体情况,只需记住该参数应简单地指定为
/lparam:1
现在到目标规范部分。这个可能很棘手。您将从the tool's web page 的描述中了解到指定目标窗口的不同方法。不过,并非每种方法都适合您。
例如,您可以尝试通过进程名称指定目标:
/processname:name_of_your_executable
但是,如果您不直接调用您的程序,而是在例如一个批处理文件,那么程序将不会在自己的窗口中运行,而是会借用托管 CMD 会话的窗口,因此这种方法可能不起作用。
如果这确实是你调用程序的方式,那么你可以尝试使用窗口标题来指定目标:
/windowtitle:window_title
这里要记住的唯一警告是标题必须唯一标识所需的窗口,否则击键将发送到与指定标题匹配的所有窗口。您可以尝试通过在调用程序的批处理中使用title 命令来使标题唯一化(在调用程序之前设置它)。
因此,总而言之,以下是完整备份脚本(batch 脚本)的样子,假设出于示例的目的,目标窗口将由其标题指定:
@ECHO OFF
:: s
SendMessage.exe /windowtitle:"My Title" /message:WM_CHAR /wparam:115 /lparam:1
:: h
SendMessage.exe /windowtitle:"My Title" /message:WM_CHAR /wparam:104 /lparam:1
:: u
SendMessage.exe /windowtitle:"My Title" /message:WM_CHAR /wparam:117 /lparam:1
:: t
SendMessage.exe /windowtitle:"My Title" /message:WM_CHAR /wparam:116 /lparam:1
:: d
SendMessage.exe /windowtitle:"My Title" /message:WM_CHAR /wparam:100 /lparam:1
:: o
SendMessage.exe /windowtitle:"My Title" /message:WM_CHAR /wparam:111 /lparam:1
:: w
SendMessage.exe /windowtitle:"My Title" /message:WM_CHAR /wparam:119 /lparam:1
:: n
SendMessage.exe /windowtitle:"My Title" /message:WM_CHAR /wparam:110 /lparam:1
:: ENTER
SendMessage.exe /windowtitle:"My Title" /message:WM_CHAR /wparam:13 /lparam:1
:: y
SendMessage.exe /windowtitle:"My Title" /message:WM_CHAR /wparam:121 /lparam:1
:: e
SendMessage.exe /windowtitle:"My Title" /message:WM_CHAR /wparam:101 /lparam:1
:: s
SendMessage.exe /windowtitle:"My Title" /message:WM_CHAR /wparam:115 /lparam:1
:: ENTER
SendMessage.exe /windowtitle:"My Title" /message:WM_CHAR /wparam:13 /lparam:1
:: wait for some time (~3 sec) till the program shuts down, if necessary
PING -n 4 localhost 1>NUL
:: proceed with the back-up
...