Скрипт Powershell как служба Topshelf / Windows - PullRequest
0 голосов
/ 08 марта 2019

Я хотел бы получать уведомления, когда в каком-то текстовом файле встречается определенный шаблон, поэтому я написал простой скрипт PowerShell:

Get-Content 'C:\\testfile.txt' -Wait -Tail 50 | Select-String -Pattern 'Sample pattern'

Я бы предпочел запустить его как службу верхнего полка.Я уже произвел следующий код:

public class MyService
{
    private string doWork;

    public string Path
    {
        get
        {
            return @"C:\\testfile.txt";
        }
    }

    public void Start()
    {
        while (this.doWork)
        {
            var script = $"Get-Content '{Path}' -Wait -Tail 50 | Select-String -Pattern 'Sample pattern'";
            using (PowerShell PowerShellInstance = PowerShell.Create())
            {
                PowerShellInstance.AddScript(script);
                var PSOutput = PowerShellInstance.Invoke();
                foreach (PSObject outputItem in PSOutput)
                {
                    if (outputItem != null)
                    {
                        Console.WriteLine(outputItem.BaseObject + "\n");
                    }
                }

                if (PowerShellInstance.Streams.Error.Count > 0)
                {
                    Console.Write.Write("Error");
                }
            }
        }
    }

    public void Stop()
    {
        this.doWork = false;
    }

}


public class Program
{
    static void Main(string[] args)
    {
        var rc = HostFactory.Run(
            x =>
                {
                    x.Service<MyService>(
                        s =>
                            {
                                s.ConstructUsing(name => new MyService());
                                s.WhenStarted(tc => tc.Start());
                                s.WhenStopped(tc => tc.Stop());
                            });
                    x.RunAsLocalSystem();
                    x.StartAutomatically();
                    x.SetDescription("Sample Topshelf Host");
                    x.SetDisplayName("Sample display name");
                    x.SetServiceName("Sample service name");
                });

        var exitCode = (int)Convert.ChangeType(rc, rc.GetTypeCode());
        Environment.ExitCode = exitCode;
    }
}

Решения работают нормально. Я запустил его в режиме отладки, но по какой-то причине я не вижу ожидаемого вывода на консоли, поэтому я предполагаю, чтоесть некоторая проблема, которую я пытался решить сам, но безрезультатно.Есть ли способ заставить эту программу работать как положено?Если бы кто-нибудь мог дать какое-то руководство или даже правильное решение, я был бы признателен.

...