При запуске консольных программ, скриптов и командных файлов удобно одновременно с выводом на экран ещё и сохранить его в текстовый файл, чтобы иметь возможность наблюдать за процессом работы и можно потом просмотреть сохранённый вывод.

Это можно запрограммировать, если построчно читать входной поток StdIn и выводить каждую считанную строку и в StdOut, что даёт показ на экране, и в текстовый файл.

Далее приведены примеры JScript и командной строки.

Скрипт JScript для дублирования вывода программы на экран и в файл

На JScript дублирование реализуется следующим образом:

var stdin = WScript.StdIn;
var stdout = WScript.StdOut;

var fso = WScript.CreateObject("Scripting.FileSystemObject");
var filename = WScript.Arguments(0);
var file = fso.OpenTextFile(filename,2,true,-1);

while (!stdin.AtEndOfStream)
{
    var str = stdin.ReadLine();
    stdout.WriteLine(str);
    file.WriteLine(str);
}

file.Close();

Скрипт в цикле читает строку из StdIn и записывает в StdOut и в текстовый файл.

Имя файла задаётся параметром скрипта, тогда, чтобы запустить программу program.exe и сохранить вывод в program.out, надо будет запустить следующую команду:

program.exe | cscript duplicate.js program.out

Ещё одна особенность возникает, если вывод программы содержит русские символы, так как вывод программ производится в кодировке OEM 866, а скрипт JScript обрабатывает текст в кодировке ANSI Windows-1251, и запуск команды выдаст кракозябры. Исправить эту проблему легко – необходимо сделать преобразование кодировки 866 в 1251, например, программой nhrt:

program.exe | nhconv | cscript duplicate.js program.out

UPD — Дублирование вывода в файл в командной строке или bat файле

Оказывается, есть способ попроще, без скрипта (стянуто отсюда — Перенаправление вывода в два файла):

for /F "delims=" %i IN ('program.exe') DO @echo %i && @echo %i>>program.out

Важно учитывать, что в командной строке переменная записывается как %i, а в bat файле – как %%i.

Как дублировать консольный вывод на экран и в файл
Метки:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *