如何从TaskScheduler运行时查找/关闭进程?
问题描述:
我有两个程序相互冲突。其中一个是由Task Scheduler(Program1)在半夜启动的C#控制台应用程序,另一个(Program2)是一个通常由用户在白天运行的C#WPF程序。我尝试使用以下方法来从PROGRAM1关闭Program2中:如何从TaskScheduler运行时查找/关闭进程?
public static void CloseProgram2()
{
var process = System.Diagnostics.Process.GetProcessesByName("Program2").FirstOrDefault();
if (process != null)
{
if (process.CloseMainWindow())
{
SpinWait.SpinUntil(() => null == System.Diagnostics.Process.GetProcessesByName("Program2").FirstOrDefault(),
TimeSpan.FromSeconds(30));
}
}
}
出于某种原因,当PROGRAM1从运行的TaskScheduler Program2中不会关闭。但是,如果我手动运行Program1,它总是关闭Program2。我有任务计划程序设置为提供凭据,以便Program1运行,无论是否有人登录到计算机。我注意到Program1的输出窗口在从Task Scheduler运行时不显示,但它确实成功运行。我想知道是否Task Scheduler正在运行Program1,使得它看不到Task Scheduler未启动的进程,这就是为什么Program2没有关闭的原因。
当使用TaskScheduler运行Program1时,任何想法或解决方案都可以帮助我关闭Program1中的Program2,这将不胜感激。
答
找到了另一种使用方法。除了使用proccess.CloseMainWindow的(),我创建了如下的批处理文件:
taskkill /F /IM Program2.exe
然后就是跑从任务计划该批处理文件。
奇怪的是,我需要在bat文件中的taskkill命令之前放一个空行。没有它,我会得到一堆乱码,它说它不知道如何运行该命令。几乎就像在taskkill命令之前插入了垃圾一样。非常奇怪...
没有一个好的[mcve]来回答你的问题是不可能的,它可以可靠地重现问题。这将包括有关如何设置Task Scheduler任务的详细_详细信息(最好是安装该任务的_code_)。但似乎几乎可以肯定的是,问题与运行控制台程序的用户帐户以及该程序能够看到和/或终止的进程有关。 –
如果您将日志记录添加到控制台和WPF程序中,则可以更有效地进行调试,以便每个人都可以报告与其操作相关的事情(返回哪些进程,是否收到“WM_CLOSE”消息等) –