C# Добавить команды в длительный размещенный сеанс PowerShell после вызова Invoke()

Я пытаюсь (в конце концов) написать служебную оболочку C# для долго работающих приложений .exe, таких как криптоузлы или игровые серверы. До сих пор я написал небольшой хост PowerShell, который выводит вывод .exe (в настоящее время на консоль, в конечном итоге он перейдет в другое место) и небольшой пример приложения, которое выводит время каждую секунду и находится в ищет «стоп», чтобы остановить казнь. В настоящее время я могу разместить образец приложения и правильно направить вывод (на консоль), но мне нужно знать, как добавлять команды после называется.

Такие программы, как игровые серверы, часто имеют доступные команды, такие как «сохранить» или «выйти», для управления сервером. После того, как программа будет запущена в размещенном сеансе PowerShell, я хотел бы добавить команду «stop», чтобы остановить пример приложения, но я не могу понять, как это сделать.

Я нацеливаюсь и используя упаковка

Ниже мой код

Хостинговая программа

Обратите внимание, что строка 15, , будет выполняться, но следующие операторы (включая и после ) не будет выполняться или, по крайней мере, не перейдет в консоль.

      using System;
using System.Management.Automation;

namespace ServiceWrapper
{
    class Program
    {
        static void Main(string[] args)
        {
            // Create the hosting session
            var ps = PowerShell.Create();
            ps.AddScript("& C:\\Code\\SimpleServiceWrapper\\TestApplication\\SampleApp.exe");

            // Hook the output
            var output = new PSDataCollection<PSObject>();
            output.DataAdded += new EventHandler<DataAddedEventArgs>(InformationEventHandler);
            ps.Invoke(null, output);
            Console.WriteLine("Started");

            // This code is not run
            Console.WriteLine("Attempting stop");
            ps.AddStatement().AddCommand("stop");
            ps.Invoke();
        }

        // Write output live to the console
        static void InformationEventHandler(object sender, DataAddedEventArgs e)
        {
            var myp = (PSDataCollection<PSObject>)sender;
            var results = myp.ReadAll();

            foreach (PSObject result in results)
            {
                Console.WriteLine(result.ToString());
            }
        }
    }
}

Образец заявки

Цель этого небольшого приложения - смоделировать программу, которая работает в течение длительного времени (например, игровой сервер) и требует некоторого ввода (например, «стоп») для правильного выхода из программы. Это предусмотрено в основном для полноты

      using System;
using System.Timers;

namespace SampleApp
{
    class SampleApp
    {
        static void Main(string[] args)
        {
            // Setup a simple 1 second timer
            var timer = new Timer(1000) { AutoReset = true };
            timer.Elapsed += TimerElapsedEventHandler;
            timer.Start();

            // loop until told to stop
            var loop = true;
            while (loop)
            {
                var stop = Console.ReadLine();
                if (stop.ToLower() == "stop")
                {
                    loop = false;
                    Console.WriteLine("Stopping");
                }
            }
        }

        // Every 1 second, write the time
        private static void TimerElapsedEventHandler(object sender, ElapsedEventArgs e)
        {
            Console.WriteLine(DateTime.Now);
        }
    }
}

Поскольку в программе-примере для правильной остановки необходимо прочитать слово «стоп», как мне отправить это программно после уже был вызван на размещающем объекте PowerShell? По сути, для репликации пользователя, сидящего за консолью, но вместо пользователя есть программа.

0 ответов

Другие вопросы по тегам