3 объекта под окном - stdin, stdout, TCPSocket

Ты имеешь ввиду, что будет работать что подобное

Сообщить("Сейчас вы увидите прямо тут STDOUT от 1С ");
УправлениеПроцессами.ЗапуститьДочернийКомандныйПроцесс("d:\onec\1cv8.exe /DESIGNER /FD:\IbService /OutD:\Loger\log1c.txt");
УправлениеПроцессами.ЗапуститьДочернийКомандныйПроцесс("tail -f D:\Loger\log1c.txt"); 
Сообщить("Увидели ?");

Да как сделать на .net я знаю:) Тут, как ты правильно заметил сложность с пониманием того, что именно руби делает за слоем синтаксического сахара. В любом случае, спасибо, что загуглил пример на шарпе.

ИМХО у ГУИ приложения в Винде нельзя сделать вывод в стандартные потоки.
Поэтому от 1С ничего не получишь.
Такая же проблема была у @awa при разработке Tool1cd - у него ГУИ, лог пришлось выводить отдельным параметром, а не через потоки.

Стоп-стоп… Я, конечно, могу ошибаться, но стандартные потоки включены всегда и у любого приложения. Просто в GUI, по-моему, они направлены не в con, а в nul. Но сдается мне, автор приложения может их настроить на любое устройство.

Собственно, беглое гугление дает вот что:
https://support.microsoft.com/kb/105305/en-us
http://www.codeproject.com/KB/dialog/ConsoleAdapter.aspx?display=Print
http://www.codeproject.com/Articles/10073/Console-Output-from-a-GUI-program

1 Симпатия

Это код следует читать примерно так (это же функциональщина)

Процедура ПриПолученииДанныхИзКанала(_Канал)
    Сообщить(_Канал.ПолучитьДанные());
КонецПроцедуры

именованныйКаналВОтдельномПотоке = МенеджерФайловыхДескриптовор.ОткрытьИменованныйКанал("КоманднаяСтрокаВызоваCucumber", ОткрытьСДоступомНаЧтение);
именованныйКаналВОтдельномПотоке.КакТолькоВКаналеВозникнетТекстВызватьПроцедуру("ПриПолученииДанныхИзКанала");

Да, беда лишь в том, что GUI-приложение не перенаправить на текущую консоль. А в файл можно.

Файл - это просто дескриптор, именно поэтому в ruby за перенаправление отвечает класс IO, но я думаю ты это и так знаешь

то есть GUI > /dev/tempFD и Script(NonBlockRead) < /dev/tempFD

Ну так я уже показал:

  1. у меня есть главный скрипт на 1Script
  2. у меня есть другой скрипт на ruby
  3. у меня есть консольное приложение (например curl)
  4. у @pumbaE наверно будут скрипты на python

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

@lustin, @dmpas, коллеги, объясните мне, чего вы хотите? Перенаправить stdout любого GUI приложения в другой файл (консоль это тоже файл) нельзя. Просто по той причине, что GUI приложение может ничего не писать в stdout. Если, например, поставить задачу перенаправить вывод 1С в какой-то файл, то этого не получится, т.к. платформа не пишет в stdout.

Но если GUI подключило свой stdout куда-либо (см. мои ссылки выше), то прочитать этот вывод в скрипте будет можно.
Итого, возвращаюсь к своему первоначальному вопросу: мы что именно сейчас пытаемся обсудить применительно к GUI, и чего хотим добиться?

Сделаем.
И, поскольку, форум не позволяет писать короткие сообщения, то я просто оставлю это здесь.

А для кого сердечкО - этож “плюс один типа”

Концепции 2 (две):

  1. первая - это история с главным скриптом
  2. вторая - расширение первой: 1С есть параметр /OutC:\Temp\171874168371631823.txt. я хочу забрать содержимое как будто это STDOUT главного скрипта

1C.exe /OutC:\file.txt || type C:\file.txt

Процедура ПриПолученииДанныхИзКанала(_Канал)
    Сообщить(_Канал.ПолучитьДанные());
КонецПроцедуры

именованныйКаналВОтдельномПотоке = МенеджерФайловыхДескрипторов.ОткрытьИменованныйКанал("1C.exe /OutC:\file.txt || type C:\file.txt", ОткрытьСДоступомНаЧтение);
именованныйКаналВОтдельномПотоке.КакТолькоВКаналеВозникнетТекстВызватьПроцедуру("ПриПолученииДанныхИзКанала");

Мы же программно хотим на 1Script, а так меня и на ruby устраивает :wink:

Ну так большее, что мы получим в 1Script - это неявная прибавка " || type " к исходной команде. Костыль под сахарком.

1 Симпатия

Сейчас такое впечатление, что я как-то не так объясняю…

  1. Может быть /Out
  2. Может быть /СRunEpfWithLogFile

Мне главное, чтобы обычный 1С-ник когда начнет запускать консольные приложения через 1Script получил единый консольный вывод, “без магии”, с магией мы все умеем.

кстати type не будет работать под unix

В скриптах асинхрона не будет (надеюсь, пока). Предлагаю старый-добрый VBScript-way:

Set objWshScriptExec = objShell.Exec("ipconfig /all")
Set objStdOut = objWshScriptExec.StdOut

While Not objStdOut.AtEndOfStream
   strLine = objStdOut.ReadLine

   If InStr(strLine,"Physical Address") Then
       WScript.Echo strLine

   ElseIf InStr(strLine,"Adresse physique") Then
       WScript.Echo strLine    
   End If
Wend