如何在 C# 的 cmd 中跟踪和停止 运行 应用程序(Windows 服务)

How to keep track and stop a running application in cmd from C# (Windows Services)

我正在使用 Topshelf 库开发 windows 服务... 我想启动 cmd 并从我的网络映射一个文件夹,并从中映射一个控制台应用程序 运行。

这是我的全部class:

class ClientService
{
    private Scheduler ServiceScheduler { get; set; }
    private Process MyApp{ get; set; }
    private Config ConfigFile { get; set; }
    public void Start()
    {
        ServiceScheduler = new Scheduler(6000) { Enabled = true };
        ServiceScheduler.Elapsed += Scheduler_Elapsed;
        ConfigFile =Config.get();
        ConfigMyApp();
    }
    private void ConfigMyApp() => ConfigMyApp= new Process
    {
        StartInfo =
        {
            CreateNoWindow = false,
            ErrorDialog = false,
            UseShellExecute = false,
            RedirectStandardInput = true,
            FileName = "CMD.exe",
        }
    };
    private void Scheduler_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        if (Network.CurrentHourMin == ConfigFile.StartTime)
        {
            MyApp.Start();
            using (var sw = MyApp.StandardInput)
            {
                if (sw.BaseStream.CanWrite)
                {
                    //Map My Folder Network
                    sw.WriteLine("pushd \\MyNetwork\General\");
                    //Run MyApp with Args
                    sw.WriteLine(MyApp -run -args -others);
                }
            }
        }
        else if (Network.CurrentHourMin == ConfigFile.EndTime)
        {
         //////////
         How To stop running MyApp.exe
         //////////
        }
    }
    public void Stop()
    {

    }
}

问题是我无法关闭之前 运行 来自 cmd.exe 的 MyApp.exe 并且执行 MyApp.Close 不会停止 运行 应用程序完全没有影响。

即使从 Topshelf 服务调用 Stop 方法(或停止服务)也不会停止 运行ning MyApp 在这种情况下退出或终止控制台应用程序的最佳做法是什么?

除非必须,否则不要创建进程。下面是一些映射网络驱动器的代码:

public void mapDrive(string driveLetter, string networkPath, bool isPersistent)
{

    private WshNetwork _networkShell = new WshNetwork();
    object persistent = isPersistent;
    _networkShell.MapNetworkDrive(driveLetter, networkPath, ref persistent) ; 

}

您需要引用 Windows 脚本主机对象模型。

如果将异常处理保持在进程中,您将更好地控制异常处理。