Тема: CMD/BAT: дублирование вывода команды
Без гарантий. Используете на свой страх и риск.
Можно попробовать дублировать вывод StdOut консольной команды одновременно в консоль и файл:
команда | CScript [имя скрипта] /параметры
CScript забирает выходной поток команды, после чего, с помощью WSH скрипта, возвращает его в консоль и дублирует в файл.
OC Win 7
Получение списка процессов:
plist.cmd
@set @x=1/*
::
:: Список процессов с дублированием вывода
::
@echo off
setlocal enableextensions
rem chcp 1251>nul
wmic process list brief 2>&1|CScript /e:jscript "%~f0"
pause
exit /b 0
::--------------------------------------------
*/
redirect();
WScript.Quit();
//
// Дублирование вывода в консоль и файл
//
function redirect()
{
var sdata;
var oFs = new ActiveXObject("Scripting.FileSystemObject");
//------------------------------------
sFilePath = WScript.ScriptFullName;
sFileOut = sFilePath.substring(0,sFilePath.lastIndexOf('\\')+1) + "proclist.txt";
var oStream = oFs.OpenTextFile(sFileOut, 2, true, 0);
var ostdin = oFs.GetStandardStream(0, false);
var ostdout = oFs.GetStandardStream(1, false);
//------------------------------------
sdata = ostdin.ReadAll();
//Дублирование вывода
ostdout.Write(sdata);
oStream.Write(sdata);
oStream.Close();
}
Тестирование rar и zip архивов с помощью 7z, рекурсивно, с выбором начального каталога:
7ztest.cmd
@set @x=1/*
::
:: Тест архивов с помощью 7z с выбором начального каталога и дублированием вывода
::
@echo off
setlocal enableextensions
rem chcp 1251>nul
for /f "tokens=*" %%a in ('CScript /nologo /e:jscript "%~f0" /choosedir') do set dir1=%%a
if /i "%dir1%" equ "" (exit /b 0)
rem [проверка на слеш в конце строки, на случай если выбран диск]
if "%dir1:~-1%" equ "\" (set dir1=%dir1:~0,-1%)
set dir1="%dir1%"
echo Init directory %dir1%
pause
::
:: Проверка архивов с помощью 7z
::
::--------------------------------------------
rem "C:\Program Files\7-Zip\7z" t -an -air!%dir1%\*.rar -air!%dir1%\*.zip -air!%dir1%\*.7z
"C:\Program Files\7-Zip\7z" t -an -air!%dir1%\*.rar -air!%dir1%\*.zip 2>&1|CScript /e:jscript "%~f0" /doit
pause
exit /b 0
::--------------------------------------------
*/
var oArgs = WScript.Arguments
if (oArgs.Length==0){WScript.Quit();}
var rearg = /doit/i;
var f = rearg.test(String(oArgs.Item(0)))
if (f){redirect();}else{choosedir();}
WScript.Quit();
//
// Диалог выбора целевого каталога на JScript
//
function choosedir()
{
var oShell = new ActiveXObject('Shell.Application');
var oFolder = oShell.BrowseForFolder(0, "Выбор папки", 1, "");
if (Number(isNaN(oFolder))==1){WScript.Echo(oFolder.Self.Path);}
}
//
// Дублирование вывода 7z в консоль и файл
//
function redirect()
{
var re1 = /path|ok/i;
var re2 = /error|warning/i;
var f1 = false;
var f2 = false;
var sdata;
var oFs = new ActiveXObject("Scripting.FileSystemObject");
//---------------------------------------------------------
sFilePath = WScript.ScriptFullName;
sFileOut = sFilePath.substring(0, sFilePath.lastIndexOf('\\')+1) + "myfile.txt";
var oStream = oFs.OpenTextFile(sFileOut, 2, true, 0);
oStream.WriteLine("testing archives");
var ostdin = oFs.GetStandardStream(0, false);
var ostdout = oFs.GetStandardStream(1, false);
//---------------------------------------------------------
while (!ostdin.AtEndOfStream)
{
sdata = ostdin.ReadLine();
ostdout.WriteLine(sdata);
if (f2){oStream.WriteLine(sdata);}
f1 = re1.test(sdata);
f2 = re2.test(sdata);
if (f1||f2){oStream.WriteLine(sdata);}
}
oStream.Close();
}