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

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

除了非常简单的脚本外,我从未编写过VBScript,因此,如果我的问题不够清楚,我感到抱歉。

想法是-使用VBScript,同时输入shutdown {Enter}和yes {Enter},然后关闭该CMD窗口,然后执行备份批处理文件,该文件已设置为在完成备份后启动CMD程序。

操作系统-Windows XP Professional

谢谢!

最佳答案

您可以通过将击键作为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键。根据ASCII control code chart,这将是
    /wparam:13
    
  • /lparam:value –您可以从WM_CHAR's manual page中看到LPARAM参数实际上应该携带多个信息作为单个数值。但是,对于您的特定情况,仅记住该参数应简单地指定为
    /lparam:1
    

  • 现在到目标规范部分。这可能很棘手。您将从the tool's web page的描述中了解到,有多种方法可以指定目标窗口。但是,并非每种方法都可以为您服务。

    例如,您可以尝试通过进程名称指定目标:
    /processname:name_of_your_executable
    

    但是,如果您不是直接调用程序,而是通过例如批处理文件,则该程序将不会在其自己的窗口中运行,而是会借用托管CMD session 的窗口,因此该方法可能不起作用。

    如果确实是调用程序的方式,则可以尝试使用窗口标题指定目标:
    /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
    ...
    

    关于windows - 如何使用VBScript在已打开的CMD窗口中执行命令,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20640057/

    10-11 23:07
    查看更多