C #: перенаправить стандартный вывод процесса, который уже запущен - PullRequest
13 голосов
/ 19 января 2010

Мне было трудно получить выходные данные "подпроцесса" (который запускается внутренне процессом черного ящика, который я отслеживаю через c # System.Diagnostics.Process)

Я воспользовался советом, данным ответом моего предыдущего поста: здесь . И там вы можете найти детали того, через что я прошел.

На данный момент, хотя я могу найти процесс ssh, созданный process1.exe, я наблюдаю. Я не могу перенаправить вывод в мою программу на c #, потому что это «уже запущенный процесс», и он не был запущен непосредственно из C #.

Кажется, что все свойства, которые вы устанавливаете для объекта System.Diagnostics.Process, вступают в силу только в том случае, если вы явно запускаете этот процесс из своего приложения на c #; если какой-то другой «неуправляемый процесс» запустил процесс, установка этого перенаправления не имеет никакого эффекта, потому что процесс уже был запущен чем-то, что не указало нужное перенаправление.

Есть ли способ перенаправить вывод процесса, который уже был запущен (процесс, запущенный программой, для которой у меня нет возможности предварительно указать перенаправление до запуска этого процесса)?

Ответы [ 4 ]

2 голосов
/ 19 января 2010

Предполагая, что более простого решения не существует, вы можете попробовать запустить фрагмент кода в другом процессе через CreateRemoteThread (), объяснено здесь .

1 голос
/ 27 апреля 2018

У меня такая же загадка. Я не могу вызывать что-либо внутреннее в подчиненном процессе. Он уже запущен, какой код находится вне моего контроля. Но я точно знаю, что он выдает Стандартный вывод , который я хочу отслеживать, обрабатывать и т. Д. Это одна вещь, которую я запускаю, я могу настроить перенаправление, но в этом случае процесс запущен во вторую очередь, чтобы я начал основной процесс. Так что у меня нет такой возможности. Я не нашел способ для .NET Process работать в этих условиях. Может быть, есть другой путь, может быть, C ++ это путь сюда? Это было бы незначительно приемлемо, но я хотел бы подойти к нему с точки зрения .NET C #, если это возможно.

1 голос
/ 19 января 2010

Возможно, вы можете посмотреть на этот код .Я нашел это при поиске решения, чтобы сделать то же самое;однако это не был действительно межпроцессный процесс.

Если это не помогло, вы могли бы взглянуть на P / Invoking SetStdHandle и GetStdHandle, которые должны использоваться при перенаправлении стандартного вывода.Я думаю, это то, что пример кода, с которым связано, делает перенаправление.

Примечание : Я только что посмотрел на этот материал и фактически не заставил его работать должным образом.(У меня было лучшее решение, доступное для меня, потому что у меня был доступ к исходному коду, выводимому на консоль)

1 голос
/ 19 января 2010

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

...