如何使用VBScript在已打开的CMD窗口中执行命令

时间:2013-12-17 16:52:46

标签: windows batch-file vbscript cmd

我正在尝试自动执行必须每天完成的备份。我有一个在CMD中运行的程序,需要在运行备份之前正确关闭。 需要关闭的两个命令是: 关掉 是(承认行动)

然后可以关闭CMD窗口,并且我已经编写了.bat文件来执行备份。

我从未写过非常简单的VBScripts,所以如果我的问题不够明确,我很抱歉。

这个想法是这样的 - 使用VBScript,键入shutdown {Enter}和yes {Enter},然后关闭该CMD窗口,然后执行备份批处理文件,该文件已设置为一旦完成就启动CMD程序备份。

操作系统 - Windows XP Professional

谢谢!

1 个答案:

答案 0 :(得分:3)

您可以尝试通过将按键作为Windows消息发送到运行程序的CMD窗口以编程方式键入命令。

我不知道VBS,也许它有一个功能或函数映射到系统API函数PostMessage和/或SendMessage。如果有的话会很棒,特别是如果有人发布了解释如何使用它们的答案。与此同时,我可以在批处理文件中向您展示如何在名为SendMessage实用程序的帮助下使用此方法。

基本上,该实用程序允许您将任意Windows消息发送到任意窗口,如下所示:

SendMessage.exe target_specification /message:value /wparam:value /lparam:value 

我稍后会解决 target_specification 位,其他参数是:

  • /message:value - 正在发送的消息,由 code 指定。在你的情况下,它将是以下任何一个:

    /message:WM_CHAR
    /message:258
    /message:0x0102
    

    全部指定WM_CHAR message

  • /wparam:value - 对于WM_CHAR消息,这个消息应该是正在发送的击键代码。

    在您的情况下,由于您的命令仅由ASCII字符组成,因此所有代码都将匹配相应字符的ASCII代码。因此,您可以使用ASCII chart转换命令中的字符。例如,s将是

    /wparam:115
    

    h

    /wparam:104
    

    等等。

    请注意,您还需要发送 Enter 键。根据{{​​3}},它将是

    /wparam:13
    
  • /lparam:value - 您可以从ASCII control code chart看到LPARAM参数实际上应该作为单个数值携带多条信息。但是,对于您的具体情况,只需记住该参数应该简单地指定为

    /lparam:1
    

现在到目标规范部分。这个可能很棘手。您将从WM_CHAR's manual page的描述中了解到指定目标窗口的方法有多种。但是,并非每种方法都适用于你。

例如,您可以尝试按进程名称指定目标:

/processname:name_of_your_executable

但是,如果您没有直接调用您的程序,而是在例如批处理文件,然后程序将不会在自己的窗口中运行,而是借用托管CMD会话的窗口,因此这种方法可能无法正常工作。

如果确实如此调用程序,那么您可以尝试使用窗口标题来指定目标:

/windowtitle:window_title

这里要记住的唯一警告是标题必须唯一标识所需的窗口,否则键击将被发送到与指定标题匹配的所有窗口。您可以尝试在调用程序的批处理中使用title命令来统一标题(在调用程序之前设置它)。

因此,总而言之,完整的备份脚本(脚本)可能是这样的,假设为了示例的目的,目标窗口将由其标题指定:

@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
...