стандартный вывод для нескольких процессов — Windows

Очень похоже на: Как я могу отправить стандартный вывод одного процесса нескольким процессам, используя (желательно безымянные) каналы в Unix (или Windows)?

Особенно...

         proc2 -> stdout
       /
 proc1
       \ 
         proc3 -> stdout

У меня есть «proc1» с некоторым выводом, который я хотел бы передать в «proc2» и «proc3».
Я не хотел бы сохранять выходные данные 'proc1' и передавать их [в качестве входных данных] двум другим процессам, 'proc2' и 'proc3'.

Было много дискуссий о tee, и я нашел 'wtee.
Увы, не сработало следующее:

proc1 | wtee (proc2 -i - <other arguments>) (proc3 -i - <other arguments>)

Примечание. «-i-» передается в «proc2» и «proc3», чтобы каждый процесс знал, откуда поступает ввод (stdout).

Есть ли способ сделать то, что я пытаюсь сделать в Windows?
Возможно, аргументы, передаваемые каждому процессу, являются причиной того, что они не работают?
Мне лучше [или застрять] написать программу для этого?


person Supervisor    schedule 25.06.2014    source источник
comment
Взгляните на мои ответы здесь... один и тот же вывод в несколько журналов"> stackoverflow.com/questions/22323835/   -  person Mark Setchell    schedule 26.06.2014
comment
Только что попробовал - не получилось. T_T Я думаю, что программа 'tee' в этом скрипте имеет ту же функциональность, что и 'wtee'.   -  person Supervisor    schedule 26.06.2014
comment
Как насчет изменения моей программы-тройника, чтобы она читала со стандартного ввода, но записывала все в 2 именованных канала, а затем запускала вторую программу с -i \pipe\1, а другую с -i \pipe\2?   -  person Mark Setchell    schedule 26.06.2014
comment
Поддерживаются ли именованные каналы в Windows [без необходимости написания программы]? У меня сложилось впечатление, что это не так, и либо мне придется написать свой собственный 'pipe-writer'/'pipe-reader'.   -  person Supervisor    schedule 26.06.2014


Ответы (2)


Я не проверял это, но вы сможете сделать что-то подобное с именованными каналами. Вы пишете VBscript с именем splitter.vbs, который читает свой стандартный ввод и записывает в два именованных канала, а затем запускаете два других процесса, сообщая им, что нужно читать из каналов.

proc1 | cscript /nologo splitter.vbs

proc2 -i \\.\pipe\p1
proc3 -i \\.\pipe\p2

В зависимости от того, хотите ли вы, чтобы программы запускались в новых окнах или нет, вы можете либо запустить 3 окна командной строки и запустить по одному в каждом, либо повторно использовать одно окно командной строки, используя START /B

splitter.vbs будет выглядеть примерно так:

Set fso = CreateObject ("Scripting.FileSystemObject") 
Set p1 = fs.CreateTextFile("\\.\pipe\p1”, True)   
Set p2 = fs.CreateTextFile("\\.\pipe\p2”, True) 

Do While Not WScript.StdIn.AtEndOfStream
   Line  = WScript.StdIn.ReadLine()
   p1.WriteLine(Line)
   p2.WriteLine(Line)
Loop
person Mark Setchell    schedule 26.06.2014
comment
К сожалению, пакетные сценарии не могут читать из \\.\pipe*. :( Хотя я ценю усилия. - person Supervisor; 27.06.2014
comment
Ага, я не знал, что ваши proc2 и proc3 были пакетными сценариями. - person Mark Setchell; 30.06.2014

Я решил проблему, сделав свой собственный считыватель/сервер каналов, похожий на это, за исключением того, что сервер может выводить столько клиентов, сколько пожелает.

person Supervisor    schedule 30.06.2014