如果我在日志文件中发现错误并重新启动它,则需要杀死exe。这里的主要问题是,我不能只删除基于名称的exe,因为我有从不同文件夹运行的相同exe,例如D:\ A \ A1.exe和D:\ B \ A1.exe。我只想从“A”文件夹中删除exe。
我试图遵循Dirk Vollmar的解决方案(https://stackoverflow.com/a/2238316/5159431)。
这个问题 - C# Process Killing
但是,当我调试他的解决方案时,我发现hModuleSnap变量无效。
更新 - 1
正如Micky所说,我使用过Simon的答案。它确实杀了exe(谢谢你)。但是,我收到一条错误消息“System.ComponentModel.Win32Exception:只完成了ReadProcessMemory或WriterocessMemory请求的一部分”。
以下是示例代码。
string path1 = @"F:\Software\Application\Runner.exe";
try
{
Process[] runningProcesses = Process.GetProcesses();
foreach (Process process in runningProcesses)
{
// now check the modules of the process
foreach (ProcessModule module in process.Modules)
{
if (module.FileName.Equals(path1))
{
process.Kill();
}
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
Console.ReadLine();
}
答案 0 :(得分:3)
根据Simon's answer使用ProcessModule.FileName
。注意FileName
返回完整路径,这在帖子中并不明显。
MSDN:
获取模块的完整路径。 More...
OP:
但是,当我调试他的解决方案时,我发现hModuleSnap Variable无效。
你不应该这样做。虽然Dirk's answer很好,但它相当冗长,我觉得过度使用本机电话。
或者你可以使用我的简化版Simon的答案(再次没有本地电话):
注意:您必须运行以下代码提升
string targetProcessPath = @"c:\windows\system32\notepad.exe";
string targetProcessName = "notepad";
Process[] runningProcesses = Process.GetProcesses();
foreach (Process process in runningProcesses)
{
if (process.ProcessName == targetProcessName &&
process.MainModule != null &&
string.Compare(process.MainModule.FileName, targetProcessPath, StringComparison.InvariantCultureIgnoreCase)==0)
{
process.Kill();
}
}
上面的示例并没有围绕子模块循环比较路径,因为Process
已经有一个很好的MainModule
属性,我们可以检查。
现在上面的示例并不令人兴奋,但它确实允许您在计算机硬盘驱动器的各个部分中运行名为 kitty 的进程。您可能有 c:\ a \ kitty.exe 和 d:\ b \ kitty.exe