好吧,我花了几个小时在论坛上喋喋不休,谷歌试图写这个剧本,但我觉得我太过于一个菜鸟,或者做了一些非常不正常的事情,而且弗兰肯斯坦我的代码。
我正在尝试运行和可执行文件扫描其他文件,并给我反馈和提示。手动在命令提示符下运行它,它会进行初始扫描,询问您要执行的操作,运行修复(可能需要5分钟以上),然后提示再次运行或关闭。
伪代码应该是:
这是我的实际代码
'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。
答案 0 :(得分:0)
启动命令后首先要做的是逐行读取输出,直到到达流的末尾:
Do While Not oExec.StdOut.AtEndOfStream MsgBox oExec.stdout.Readline Loop
然而,只有当cmd
终止时才会发生这种情况,因为您使用参数/k
启动了ReadAll
。因此,您创建了一个死锁。 1}}在下一个循环中也是如此。
如果您可以阅读整行,则取决于实际输出使用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
)。