如何在 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 脚本主机对象模型。
如果将异常处理保持在进程中,您将更好地控制异常处理。
我正在使用 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 脚本主机对象模型。
如果将异常处理保持在进程中,您将更好地控制异常处理。