Powershell脚本作为Topshelf / Windows服务

时间:2019-03-08 17:31:31

标签: c# windows powershell service topshelf

我想在某些文本文件中出现特定模式时得到通知,因此我编写了一个简单的PowerShell脚本:

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

我宁愿将其作为topshelf服务运行。我已经产生了以下代码:

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;
    }
}

解决方案构建良好,我在调试模式下运行它,但由于某种原因,我在控制台上看不到预期的输出,因此我认为存在一些我试图弄清楚自己但没有效果的问题。 有什么方法可以使该程序按预期运行?如果有人可以提供一些指导甚至适当的解决方案,我将不胜感激。

0 个答案:

没有答案