Выходные буферы имеют ограниченную емкость.Если ваша команда записывает слишком много текста для вывода, буфер заполнится и заблокирует команду на дальнейшую запись, пока вы не очистите буфер (например, прочитав его).ReadAll
не может использоваться для этого, хотя, потому что этот метод возвратит только после , команда завершилась и блокирует в противном случае, таким образом создавая тупик.
Ваш лучший вариант -перенаправьте вывод в один или несколько (временных) файлов и прочитайте вывод из этих файлов после завершения команды.
outfile = "C:\out.txt"
errfile = "C:\err.txt"
cmd = "cmd /c ipconfig /all >""" & outfile & """ 2>""" & errfile & """"
timeout = DateAdd("s", 600, Now)
Set sh = CreateObject("WScript.Shell")
Set ex = sh.Exec(cmd)
Do While ex.Status = WshRunning And Now < timeout
WScript.Sleep 200
Loop
Set fso = CreateObject("Scripting.FileSystemObject")
outtxt = fso.OpenTextFile(outfile).ReadAll
errtxt = fso.OpenTextFile(errfile).ReadAll
Если вы по какой-либо причине не хотите этого делать, вы должны прочитать из StdOut
несколько раз.
outtxt = ""
errtxt = ""
cmd = "ipconfig /all"
timeout = DateAdd("s", 600, Now)
Set sh = CreateObject("WScript.Shell")
Set ex = sh.Exec(cmd)
Do While ex.Status = WshRunning And Now < timeout
WScript.Sleep 200
outtxt = outtxt & ex.StdOut.ReadLine & vbNewLine
Loop
Обратите внимание, что вам также может потребоваться чтение из StdErr
, поскольку этот буфер может также заполниться, если выводится слишком много ошибок.Однако чтение обоих буферов может создать еще один тупик, поскольку IIRC ReadLine
блокируется до тех пор, пока не сможет прочитать полную строку, поэтому, если сценарий может зависнуть, ожидая вывода ошибок, которые никогда не появляются.Возможно, вам удастся обойти это, используя Read
вместо ReadLine
, но это все равно будет очень хрупким.
Итак, опять же, ваш лучший вариант - перенаправить вывод команды в файлы и прочитатьэти файлы после завершения команды.