VBScript与CMD交互提示异步

时间:2016-04-07 15:49:22

标签: vbscript cmd stdout

好吧,我花了几个小时在论坛上喋喋不休,谷歌试图写这个剧本,但我觉得我太过于一个菜鸟,或者做了一些非常不正常的事情,而且弗兰肯斯坦我的代码。

我正在尝试运行和可执行文件扫描其他文件,并给我反馈和提示。手动在命令提示符下运行它,它会进行初始扫描,询问您要执行的操作,运行修复(可能需要5分钟以上),然后提示再次运行或关闭。

伪代码应该是:

  • 运行EXE ArchiveFile ConfigFile
  • 等待“输入命令>”
  • 类型1
  • 等待“输入命令>”
  • 类型7
  • 等待“输入打印目的地>”
  • 类型2
  • 等待“输入命令>”
  • 类型9
  • 完成

这是我的实际代码

'Cycle through each iha file in the chosen folder
for each objFile in objFSO.GetFolder(archiveFolder).files
If LCase(objFSO.GetExtensionName(objFile.Name)) = "iha" Then
    'run the iharchiveInfo.exe with the chosen config and the current archive
        msgbox(chr(34) & exeFile & chr(34) & " " & chr(34) & objfile.path & chr(34) & " " & chr(34) & ArchiveConfig & chr(34) )
        set oExec = Shell.exec("cmd.exe /k "& chr(34) & exeFile & " " & chr(34) & objfile.path & chr(34) & " " & chr(34) & ArchiveConfig)
        do while Not oExec.StdOut.AtEndOfStream
            MsgBox oExec.stdout.Readline
        Loop
        Msgbox("second line")
        oExec.stdin.write chr(34) & exeFile & " " & chr(34) & objfile.path & chr(34) & " " & chr(34) & ArchiveConfig
        Do While oExec.Status = 0
            WScript.Sleep 100
            WScript.StdOut.Write(oExec.StdOut.ReadAll())
            WScript.StdErr.Write(oExec.StdErr.ReadAll())
        Loop
        msgbox ("write")
        oExec.stdin.write 1
        do while Not oExec.StdOut.AtEndOfStream
            MsgBox oExec.stdOut.Readline
        Loop
        oExec.stdin.write 7
exit for
end if
next

它会打开cmd提示符,但我从未获得带有Readline的msgbox。相反,当我关闭cmd提示时,我得到msgbox Write。

1 个答案:

答案 0 :(得分:0)

启动命令后首先要做的是逐行读取输出,直到到达流的末尾:

Do While Not oExec.StdOut.AtEndOfStream
    MsgBox oExec.stdout.Readline
Loop

然而,只有当cmd终止时才会发生这种情况,因为您使用参数/k启动了ReadAll。因此,您创建了一个死锁。

如果您可以阅读整行,则取决于实际输出使用ReadLine

Do
    line = oExec.StdOut.ReadLine
Loop Until line = "something"

Read单个字符,直到满足您要停止阅读的条件,例如:

str = ""
Do
    str = str & oExec.StdOut.Read(1)
Loop Until str = "something"

此外,在oExec.Status <> 0进程已经终止的时刻,写入StdIn已经不再适用了。您需要将写操作置于描述符仍处于打开状态的位置(即oExec.Status = 0)。