<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; CMD/BAT: дублирование вывода команды (обсуждение)]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=17116&amp;type=atom" />
	<updated>2022-05-16T14:08:03Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=17116</id>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: дублирование вывода команды (обсуждение)]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=153222#p153222" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Rumata пишет:</cite><blockquote><p>Простите, но Ваш пример не выдеривает критики.</p></blockquote></div><p>Так и быть, прощаю, но в виду вашей невнимательности. Ибо як глаголилось русской гравою - то не распоточивание, що лишь &quot;имитация&quot;.<br /></p><div class="quotebox"><cite>Rumata пишет:</cite><blockquote><p>Во-первых, очень интересно реализовать некий функционал имея весьма ограниченные средства.</p></blockquote></div><p>Отнюдь. Как балакают в народе: кому что, а лысому - расчёска. Может кому-то и впрямь приятен весь этот БДСМ с cmd, но за время потраченное на &quot;некрофилию&quot; можно вполне освоить что-то в значительной мере упрощающее жизнь, нервы, а самое главное - экономящее время. Только не подумайте, что это какая-то пропаганда, скорее - здравый смысл.<br /></p><div class="quotebox"><cite>Rumata пишет:</cite><blockquote><p>PowerShell крутой и значительно продвинутый по сравнению с CMD. Но не всем он по вкусу.</p></blockquote></div><p>Те же яйца (точнее расчёска), только в профиль.</p>]]></content>
			<author>
				<name><![CDATA[greg zakharov]]></name>
			</author>
			<updated>2022-05-16T14:08:03Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=153222#p153222</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: дублирование вывода команды (обсуждение)]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=153218#p153218" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>greg zakharov пишет:</cite><blockquote><p>почему люди по-прежнему насилуют cmd</p></blockquote></div><p>Во-первых, очень интересно реализовать некий функционал имея весьма ограниченные средства. Во-вторых, многие писатели &quot;велосипедов&quot; уже имеют у себя гораздо продвинутые средства (те же Cygwin, MSYS). Тем не менее они по каким-то причинам пишут &quot;велосипеды&quot;.</p><p>WSL - это хорошо, но, по умолчанию, он не работает, и его надо доустанавливать (это не аргумент, ведь мы и сами качаем кучу программ для своего удобства). PowerShell крутой и значительно продвинутый по сравнению с CMD. Но не всем он по вкусу. А еще говорят, что не на всех системах он установлен. Не уверен, что достоверно.</p><p>Ну и наконец, это весело (см. &quot;во-первых&quot; выше).</p><div class="quotebox"><cite>greg zakharov пишет:</cite><blockquote><p>dir X:\path &gt; log.txt &amp; type log.txt</p></blockquote></div><p>Простите, но Ваш пример не выдеривает критики. Смысл команды tee заключается в синхронной записи логов в файл и консоль.</p>]]></content>
			<author>
				<name><![CDATA[Rumata]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24846</uri>
			</author>
			<updated>2022-05-16T12:32:34Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=153218#p153218</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: дублирование вывода команды (обсуждение)]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=153213#p153213" />
			<content type="html"><![CDATA[<p>Подобного рода &quot;велосипеды&quot; актуальны разве что в старых версиях Windows, да и там они без особой надобности, если:<br />1) установлен Cygwin или MSYS<br />2) из исходников собраны GNU утилиты<br />3) в качестве текстового процессора используется Vim<br />и т.д.<br />В остальном можно пойти по пути наименьшего сопротивления:<br /></p><div class="codebox"><pre><code>dir X:\path &gt; log.txt &amp; type log.txt</code></pre></div><p>Это конечно не &quot;расщепление&quot; потока, но как вариант, если не используется PowerShell, где tee уже имеется (почему люди по-прежнему насилуют cmd, остаётся загадкой). Что же до поздних ОС, с приходом WSL необходимость в кулибинском подходе отпадает:<br /></p><div class="codebox"><pre><code>wsl -e bash -c &quot;ls -g /mnt/x/path | tee log.txt&quot;</code></pre></div>]]></content>
			<author>
				<name><![CDATA[greg zakharov]]></name>
			</author>
			<updated>2022-05-15T10:25:25Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=153213#p153213</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[CMD/BAT: дублирование вывода команды (обсуждение)]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=153153#p153153" />
			<content type="html"><![CDATA[<p>Коллега Poltergeyst в теме <a href="https://forum.script-coding.com/viewtopic.php?id=17105">CMD/BAT: дублирование вывода команды</a> поделился своим вариантом реализации команды tee из мира unix. Тема открыта в разделе Коллекции, поэтому обсуждение здесь, отдельной темой.</p><p>Я тоже задавался вопросом &quot;а не сделать ли и мне что-то подобное&quot; на чистом батнике, но мне было лень. А еще я видел весьма интересные, но несколько запутанные и ограниченные решения. Например, здесь: <a href="https://www.dostips.com/forum/viewtopic.php?f=3&amp;t=5386">Asynchronous native batch tee script</a>. И там используется временный файл, что, на мой взгляд, не очень хорошо.</p><p>Я решил попробовать реализовать свое видение и немного дополнить его так, чтобы приблизить к возможностям исходной команды. Выглядит это так:</p><div class="codebox"><pre><code>
C:\&gt;tee
Usage: tee [/a] [FILE]...

Copy STDIN to each file and also to STDOUT

/a  Append to the given files, don&#039;t overwrite
</code></pre></div><p>Преимущества данного подхода:<br />1. возможность писать сразу в несколько файлов<br />2. возможность дописывать в существующие файлы (ключ /A)</p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;Исходный код (гибрид BAT+JS)</div><div class="fancy_spoiler"><div class="codebox"><pre><code>
0&lt;/*! ::
::&gt;Usage: tee [/a] [FILE]...
::&gt;
::&gt;Copy STDIN to each file and also to STDOUT
::&gt;
::&gt;/a  Append to the given files, don&#039;t overwrite
@echo off
timeout /t 0 &gt;nul 2&gt;&amp;1 &amp;&amp; (
	for /f &quot;tokens=1,* delims=&gt;&quot; %%a in ( &#039;findstr &quot;^::&gt;&quot; &quot;%~f0&quot;&#039; ) do echo:%%b
	goto :EOF
)

cscript //nologo //e:javascript &quot;%~f0&quot; %*
goto :EOF
*/0;

// Declare synonyms and references to the global WSH objects
var stdin  = WScript.StdIn;
var stdout = WScript.StdOut;
var stderr = WScript.StdErr;

var nargs = WScript.Arguments.Named;
var uargs = WScript.Arguments.Unnamed;

var fso = new ActiveXObject(&#039;Scripting.FileSystemObject&#039;);

// Constants
var F_MODE_WRITE = 2;
var F_MODE_APPEND = 8;
var F_FORMAT_DEFAULT = -2;

// Append or overwrite
var append = nargs.Exists(&#039;A&#039;);

// STDOUT is one of the targets
var files = [ {
	filename: &#039;&lt;stdout&gt;&#039;,
	handler: stdout
} ];

for (var i = 0; i &lt; uargs.length; i++) {
	var e;
	try {
		var f = uargs.item(i);
		var h = fso.OpenTextFile(
			f,
			append ? F_MODE_APPEND : F_MODE_WRITE,
			true,
			F_FORMAT_DEFAULT);
		files.push({
			filename: f,
			handler: h
		});
	} catch(e) {
		// Don&#039;t stop execution, just report the problem and continue
		stderr.WriteLine([
			WScript.ScriptName,
			f,
			e.description
		].join(&#039;: &#039;));
	}
}

// Read STDIN line by line and put each line to all available targets
while ( ! stdin.AtEndOfStream ) {
	var line = stdin.ReadLine();
	for (var i = 0; i &lt; files.length; i++) {
		files[i].handler.WriteLine(line);
	}
}

// Let&#039;s close all files gracefully
for (var i = 1; i &lt; files.length; i++) {
	files[i].handler.Close();
}
</code></pre></div></div></div><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;Лирическое отступление</div><div class="fancy_spoiler"><p>Наконец-то задумался о названии программы. Оказывается оно возникло из-за сходства с тройниками (синонимы: фитинг, т-образный переходник или т-образный разветвитель) и их функционалом (один поток развести на два направления). В английском их называют t-splitter и произносят, соответственно, [tee]. Отсюда и название программы.</p></div></div>]]></content>
			<author>
				<name><![CDATA[Rumata]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24846</uri>
			</author>
			<updated>2022-05-09T22:13:58Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=153153#p153153</id>
		</entry>
</feed>
