Есть ли способ перенаправить стандартный вывод процесса в консоли Win32 на именованный канал ? Именованные каналы встроены в Windows, и хотя они были бы полезны, я никогда не видел, чтобы они использовались из командной строки.
То есть. как example.exe >\\.\mypipe
. (Этот синтаксис может быть неправильным, но вы понимаете, в чем дело.) Я хотел бы иметь возможность перенаправлять stdout и stderr на разные каналы одновременно.
Я хотел бы избежать использования физических файлов в качестве замены, избегая работы с медлительностью ввода-вывода, буферами ввода-вывода, блокировками файлов, правами доступа, доступным пространством на жестком диске, решением о перезаписи, постоянным сохранением и т. Д.
Другая причина заключается в том, что традиционный набор инструментов для Windows не основан на философии, основанной на текстовых файлах, а на Unix . Кроме того, именованные каналы не могли быть легко установлены в Windows, если вообще.
Наконец, есть любопытство, если хорошая концепция может быть использована в хорошем смысле.
источник
Ответы:
Я не уверен, почему вы не хотите перенаправить в файл. Здесь я приведу два метода. Один метод - перенаправление и чтение из файла, другой - набор программ.
Именованные трубы
Я написал две программы для .NET 4. Одна отправляет вывод в именованный канал, другая читает из этого канала и выводит на консоль. Использование довольно просто:
В другом окне консоли:
К сожалению, это может только перенаправить
stdout
(илиstdin
, или объединить), но неstderr
само по себе, из-за ограничений в трубе оператора (|
) в командной строке Windows. Если вы выясните, как отправитьstderr
через этого оператора трубопровода, это должно работать. Кроме того, сервер может быть изменен для запуска вашей программы и, в частности, для перенаправленияstderr
. Если это необходимо, дайте мне знать в комментарии (или сделайте это самостоятельно); это не так уж сложно, если у вас есть знания по библиотекам C # и .NET "Process".Вы можете скачать сервер и клиент .
Если вы закроете сервер после подключения, клиент закроется немедленно. Если вы закроете клиент после подключения, сервер закроется, как только вы попытаетесь что-то отправить через него. Невозможно восстановить сломанную трубу, главным образом потому, что я не могу быть обеспокоен тем, чтобы сделать что-то настолько сложное прямо сейчас. Это также ограничено одним клиентом на сервер .
Исходный код
Они написаны на C #. Нет особого смысла пытаться это объяснить. Они используют .NET NamedPipeServerStream и NamedPipeClientStream .
Сервер:
Клиент:
Перенаправление в файл
stderr
вывод в этот файлЭто обеспечивает желаемый эффект одного окна консоли для просмотра
stdout
(и предоставленияstdin
), а другого - для просмотраstderr
.Все, что имитирует,
tail
будет работать. Метод PowerShell изначально работает в Windows, но может быть немного медленным (то есть существует некоторая задержка между записью в файл и отображением на экране). Посмотрите этот вопрос StackOverflow для другихtail
альтернатив.Единственная проблема - временный файл может стать довольно большим. Возможный обходной путь - запустить цикл, который печатает только в том случае, если в файле есть содержимое, и сразу же очищать файл, но это может вызвать состояние гонки.
источник
Я удивлен, что на этот вопрос уже не ответили правильно. В действительности существует UNC-путь, назначенный именованным каналам системой, доступный на любом компьютере в сети, который можно использовать как обычный файл:
Предполагая, что каналы с именами «StdOutPipe» и «StdErrPipe» существуют на этом компьютере, это попытается соединиться и записать их.
pipe
Часть того, что определяет , что вы хотите именованный канал.источник
Не со стандартной оболочкой (CMD.EXE). Для программистов это довольно просто . Просто возьмите две трубы процесса, который вы начали.
источник
Ваши предпочтения для канала передачи данных Windows от сервера к клиентскому окну сразу или позже могут быть удовлетворены небольшим ОЗУ. Эта же память выделяется для данных, записываемых / читаемых с именем, похожим на файловую систему. Клиент либо удаляет использованный файл и ждет другого, либо оставляет его исчезнуть при выключении компьютера.
источник