При запуске консольных программ, скриптов и командных файлов удобно одновременно с выводом на экран ещё и сохранить его в текстовый файл, чтобы иметь возможность наблюдать за процессом работы и можно потом просмотреть сохранённый вывод.
Это можно запрограммировать, если построчно читать входной поток 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.