1

Тема: VBScript: запуск консольного приложения с чтением его вывода

В примере запускается командный интерпретатор, затем по очереди выполняется несколько команд, затем считывается весь вывод этих команд.

Set WshShell = CreateObject("WScript.Shell")
Set WshExec = WshShell.Exec("cmd.exe /q /k echo off")
WshExec.StdIn.WriteLine "chcp 1251>nul"
WshExec.StdIn.WriteLine "cd /d ""%ProgramFiles%"" && dir"
WshExec.StdIn.WriteLine "exit"
Set TextStream = WshExec.StdOut
Str = TextStream.ReadAll
WScript.Echo Str

Метод ReadAll при этом ожидает появления всех данных в потоке вывода.
Автор примера - wisgest.
Любопытно, что следующие команды могут привести к различным результатам:

chcp 1251>nul
cd /d "%ProgramFiles%" && dir
chcp 1251>nul && cd /d "%ProgramFiles%" && dir

В первом случае вывод может оказаться в кодировке Windows-1251, а во втором - в cp866.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

2

Re: VBScript: запуск консольного приложения с чтением его вывода

Пример чтения данных со скрытой консоли:

JScript:
В примере WScript.Echo работает как WriteLine. Для отображения графических предупреждений можно воспользоваться функцией MsgBox.

if (WScript.FullName.indexOf("WScript.exe")!=-1) 
{
    WshShell=WScript.CreateObject("WScript.Shell");
    WshShell.Run("%WinDir%\\System32\\CScript.exe \""+WScript.ScriptFullName+"\"", 0);
    WScript.Quit();
}

var vbe = new ActiveXObject('ScriptControl');
vbe.Language = 'VBScript';
vbe.AddCode("dim buffer");

function MsgBox(a)
{
    vbe.CodeObject.buffer = a;
    vbe.eval("MsgBox(buffer)");
}

var WshShell=WScript.CreateObject("WScript.Shell"), 
WshScriptExec=WshShell.Exec("cmd.exe");

WshScriptExec.StdIn.WriteLine("chcp 1251");
WshScriptExec.StdIn.WriteLine("dir");
WshScriptExec.StdIn.WriteLine("exit");

MsgBox(WshScriptExec.StdOut.ReadAll());

VBScript

if Instr(1,WScript.FullName,"WScript.exe",1) > 0 Then
    Set WshShell = CreateObject("WScript.Shell")
    WshShell.Run "CScript """ & WScript.ScriptFullName & """",0
    WScript.Quit
End if

Set WshShell = WScript.CreateObject("WScript.Shell")
Set WshExec = WshShell.Exec("cmd")
With WshExec.StdIn
    .WriteLine "chcp 1251"
    .WriteLine "dir"
    .WriteLine "exit"
End With

MsgBox WshExec.StdOut.ReadAll