С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/56: Рейтинг темы: голосов - 56, средняя оценка - 4.79
 Аватар для SuLLeN
23 / 23 / 12
Регистрация: 27.12.2011
Сообщений: 855

Перехват вывода из CMD (консоли) в RichTextBox

06.02.2014, 07:19. Показов 12222. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер!

Нужно запустить test.bat в скрытом режиме, перехватывать и выводить в RichTextBox каждую строку с той же скоростью (или приблизительно) как они появляются в консоли.
Или какой нибудь другой способ с той же сутью.

Вот наброски, которые удалось запилить:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using System;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
 
namespace ServerLaunch
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            Process p = new Process();
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.FileName = @"C:\test.bat";
            p.StartInfo.CreateNoWindow = false;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.StandardOutputEncoding = Encoding.GetEncoding(866);
 
            p.Start();
 
            StreamReader outputWriter = p.StandardOutput;
            String errorReader = p.StandardError.ReadToEnd();
            String line = outputWriter.ReadLine();
            while (line != null)
            {
 
                byte[] cp866bytes = Encoding.GetEncoding(866).GetBytes(line);
                byte[] convertedbytes = Encoding.Convert(Encoding.GetEncoding(866), Encoding.Default, cp866bytes);
                string convertedline = Encoding.Default.GetString(convertedbytes);
 
                if (line != "")
                {
                    richTextBox1.Text = richTextBox1.Text + "\n" + convertedline;
                }
 
                line = outputWriter.ReadLine();
            }
 
            p.WaitForExit();
 
            richTextBox1.SelectionStart = richTextBox1.Text.Length;
            richTextBox1.ScrollToCaret();
            richTextBox1.Focus();
        }
    }
}
Но тут при запуске, появляется консоль и пока её не закроешь, не будет никакого вывода в RichTextBox.

Добавлено через 11 часов 36 минут
Висит программа наверно из за того, что командная строка все время ждет ввода, я попробовал из батника убрать "pause" в конце и по выполнению команды, консоль отключилась и весь вывод попал в TextBox.

Надо попробовать вывод в отдельный документ сделать и из него уже тянуть в TextBox.

Добавлено через 21 час 45 минут
Ау.... есть кто живой?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.02.2014, 07:19
Ответы с готовыми решениями:

Перехват вывода консоли
Добрый день форумчане выручайте.Перехватываю вывод консоли.Все работает вывод перехватывается,но консоль перестает реагировать на...

Перехват вывода консоли
Подскажите, как можно реализовать следующую задачу? По ShellExecute запускается консольная программа Она в своем выводе выдает...

Перенаправление вывода с консоли в richTextBox
Здравствуйте, столкнулся с проблемой. Нужно, чтобы вывод с консоли перенаправлялся в richTextBox, но, чтобы это происходило мгновенно, а не...

8
5 / 5 / 1
Регистрация: 05.11.2013
Сообщений: 58
06.02.2014, 11:01
У Вас синхронное чтение потока ввода это во-первых, и CreateNoWindow выставлено в false.
Поэтому и окно консоли появляется, и в GUI ничего не приходит до завершения порожденного процесса.

Поэтому надо читать из stdout асинхронно, например так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
                    Process ps = new Process();
                    ps.StartInfo.FileName = psname;
                    ps.StartInfo.Arguments = arguments;
                    ps.StartInfo.UseShellExecute = false;
                    ps.StartInfo.CreateNoWindow = true;
                    ps.StartInfo.RedirectStandardOutput = true;
                    ps.StartInfo.RedirectStandardError = true;
                    ps.OutputDataReceived += (s, e) =>  //здесь подписываемся на событие "что-то появилось в выводе консоли"
                    {
                        if (!string.IsNullOrEmpty(e.Data))
                        {
                            if (ChildProcessEventHandler != null)
                            {
                                ChildProcessEventHandler(s, e.Data); //генерируем событие для отрисовки в RichTextBox
                            }
                        }
                    };
                    ps.BeginOutputReadLine();
                    ps.WaitForExit();
Также необходимо объявить делегат
C#
1
public delegate void MyDelegate(object o, EventArgs e)
и событие
C#
1
public event MyDelegate ChildProcessEventHandler;
1
 Аватар для SuLLeN
23 / 23 / 12
Регистрация: 27.12.2011
Сообщений: 855
06.02.2014, 20:51  [ТС]
Не понимаю, как совместить свой код с вашим?
0
5 / 5 / 1
Регистрация: 05.11.2013
Сообщений: 58
06.02.2014, 21:06
Самое простое (с моей т.з.) - создаете второй класс (назовем его PSRunner) , который ответственнен только за создание процесса, в него помещаете код создания процесса (свой, с учетом моих поправок), в методе button1_Click создаете экземпляр класса:
C#
1
PSRunner psr = new PSRunner(args)
И подписываетесь на события
C#
1
psr.ChildProcessEventHandler += (o, e) => richTextBox1.Text = e.Data;
0
 Аватар для SuLLeN
23 / 23 / 12
Регистрация: 27.12.2011
Сообщений: 855
07.02.2014, 12:47  [ТС]
Дайте пример, как внутри класса расположить код с созданием процесса.
Пробую, но внутри целая куча ошибок выходит.
0
5 / 5 / 1
Регистрация: 05.11.2013
Сообщений: 58
07.02.2014, 14:04
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Class PSRunner
{
   public delegate void MyDelegate(object o, EventArgs e);
   public event MyDelegate ChildProcessEventHandler;
 
   public PSRunner()
   {  }
   
   public void Run(string psname, string arguments)
   {
       Process ps = new Process();
       //далее здесь следует код создания процесса, что выше перечислен
       ps.OutputDataReceived += (s,  e) => 
       if (!string.IsNullOrEmpty(e.Data))
                        {
                            if (ChildProcessEventHandler != null)
                            {
                                ChildProcessEventHandler(s, e.Data);                             
                             }
                        }
    ps.Start();
    ps.BeginOutputReadLine();
    ps.WaitForExit();  
    }
}
Это пример класса PSRunner.
В классе окна инициализируете инстанс PSRunner psr = new PSRunner();
Подписываетесь на событие psr.ChildProcessEventHandler += (o, e) => richTextBox1.Text = e.Data;
Вызываете метод Run psr.Run();
0
 Аватар для SuLLeN
23 / 23 / 12
Регистрация: 27.12.2011
Сообщений: 855
08.02.2014, 12:32  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
using System;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
 
namespace ServerLaunch
{
    class PSRunner
    {
        public delegate void MyDelegate(object o, EventArgs e);
        public event MyDelegate ChildProcessEventHandler;
 
        public PSRunner()
        { }
 
        public void Run(string psname, string arguments)
        {
            Process p = new Process();
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.FileName = @"C:\test.bat";
            p.StartInfo.CreateNoWindow = false;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.StandardOutputEncoding = Encoding.GetEncoding(866);
            p.Start();
            p.OutputDataReceived += (s,  e) => 
            if (!string.IsNullOrEmpty(e.Data))
            {
                if (ChildProcessEventHandler != null)
                {
                    ChildProcessEventHandler(s, e.Data);                             
                }
            }
            p.Start();
            p.BeginOutputReadLine();
            p.WaitForExit();  
        }
    }
 
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            PSRunner psr = new PSRunner();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            PSRunner psr = new PSRunner();
            psr.ChildProcessEventHandler += (o, e) => richTextBox1.Text = e.Data;
            Run psr.Run();
        }
    }
}
Ошибка1Недопустимый элемент "." в выраженииC:\Users\SulleN\documents\visual studio 2010\Projects\ServerLaunch\ServerLaunch\Form1.cs5420ServerLaunch
Ошибка2Требуется ";"C:\Users\SulleN\documents\visual studio 2010\Projects\ServerLaunch\ServerLaunch\Form1.cs5420ServerLaunch
Ошибка3Требуется ";"C:\Users\SulleN\documents\visual studio 2010\Projects\ServerLaunch\ServerLaunch\Form1.cs5421ServerLaunch
Ошибка4В качестве оператора могут использоваться только выражения присваивания, вызова, инкремента, декремента и создания нового объектаC:\Users\SulleN\documents\visual studio 2010\Projects\ServerLaunch\ServerLaunch\Form1.cs2845ServerLaunch
Ошибка5Элемент "e" не существует в текущем контексте.C:\Users\SulleN\documents\visual studio 2010\Projects\ServerLaunch\ServerLaunch\Form1.cs2939ServerLaunch
Ошибка6Элемент "s" не существует в текущем контексте.C:\Users\SulleN\documents\visual studio 2010\Projects\ServerLaunch\ServerLaunch\Form1.cs3346ServerLaunch
Ошибка7Элемент "e" не существует в текущем контексте.C:\Users\SulleN\documents\visual studio 2010\Projects\ServerLaunch\ServerLaunch\Form1.cs3349ServerLaunch
Ошибка8Невозможно объявить локальную переменную с именем "e" в этой области видимости, т.к. она придаст другое значение "e", которая уже используется в области видимости "родительский или текущий" для обозначения чего-то другогоC:\Users\SulleN\documents\visual studio 2010\Projects\ServerLaunch\ServerLaunch\Form1.cs5349ServerLaunch
Ошибка9"System.EventArgs" не содержит определения для "Data" и не был найден метод расширения "Data", принимающий тип "System.EventArgs" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку)C:\Users\SulleN\documents\visual studio 2010\Projects\ServerLaunch\ServerLaunch\Form1.cs5377ServerLaunch
Ошибка10Не удалось найти имя типа или пространства имен "Run" (пропущена директива using или ссылка на сборку?)C:\Users\SulleN\documents\visual studio 2010\Projects\ServerLaunch\ServerLaunch\Form1.cs5413ServerLaunch
Ошибка11В этой области видимости уже определена локальная переменная с именем "psr"C:\Users\SulleN\documents\visual studio 2010\Projects\ServerLaunch\ServerLaunch\Form1.cs5417ServerLaunch
Ошибка12В качестве оператора могут использоваться только выражения присваивания, вызова, инкремента, декремента и создания нового объектаC:\Users\SulleN\documents\visual studio 2010\Projects\ServerLaunch\ServerLaunch\Form1.cs5417ServerLaunch
Ошибка13Элемент "Run" не существует в текущем контексте.C:\Users\SulleN\documents\visual studio 2010\Projects\ServerLaunch\ServerLaunch\Form1.cs5421ServerLaunch
Ошибка14Недопустимый элемент "if" в выраженииC:\Users\SulleN\documents\visual studio 2010\Projects\ServerLaunch\ServerLaunch\Form1.cs2913ServerLaunch
0
5 / 5 / 1
Регистрация: 05.11.2013
Сообщений: 58
10.02.2014, 10:04
Коллега, ну даже если Вы готовый код копируете, не запускайте его сразу, а попробуйте проанализировать, это не только моего примера касается, а в целом.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 public partial class Form1 : Form
    {
        PSRunner psr = new PSRunner();
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {         
            psr.ChildProcessEventHandler += (o, e) => richTextBox1.Text = e.Data;
            psr.Run("test.bat", "здесь_аргументы_если_их_передаете_в_батник или String.Empty");
        }
    }
И выставьте p.StartInfo.RedirectStandardInput в false,
а p.StartInfo.CreateNoWindow в true
1
0 / 0 / 0
Регистрация: 16.05.2013
Сообщений: 30
11.10.2014, 23:09
C#
1
2
3
4
5
6
7
8
9
10
ps.OutputDataReceived += (s, e) =>  //здесь подписываемся на событие "что-то появилось в выводе консоли"
                    {
                        if (!string.IsNullOrEmpty(e.Data))
                        {
                            if (ChildProcessEventHandler != null)
                            {
                                ChildProcessEventHandler(s, e.Data); //вот здесь ругается: Несколько аргументов делегата являются недопустимыми
                            }
                        }
                    };
Mif помоги разобраться, почему возникает ошибка, из-за чего,

спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.10.2014, 23:09
Помогаю со студенческими работами здесь

Перенаправление вывода с консоли в RichTextBox
Читающему доброе время суток. Когда то пришлось столкнуться с консолью, теперь столкнулся с такой задачей как перенаправляемый вывод с...

Запретить перехват окна cmd
Возвращаясь к этой теме https://www.cyberforum.ru/csharp-net/thread557283.html У меня есть консольное приложение, которое с...

Перехват сообщений из консоли
Подскажите как вывести значение маски подсети не в консоль, а в отдельный текстбокс по нажатию кнопки public partial class Form1 : Form ...

Перехват информации в консоли
С помощью console.log и ему подобным в консоль выводится разная инфа. Как ее перехватывать, чтобы, например, записывать в файл? Все что...

Перехват сообщений с консоли
скажите можно ли сообщения что выводит командная строка вывести в код если да то как


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru