1 (изменено: Poltergeyst, 2022-05-07 00:01:48)

Тема: 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();
}

2

Re: CMD/BAT: дублирование вывода команды

Открыл обсуждение в теме: CMD/BAT: дублирование вывода команды (обсуждение).

( 2 * b ) || ! ( 2 * b )