所以我目前正在做一个项目,需要时间,当某些进程正在运行。 我试图找出最有效的方法来扫描进程列表,然后检查进程列表的可执行文件名称与支持的程序列表。
问题本质上是两个部分:
如何在windows命令行中从tasklist的输出中提取特定的字段
在Windows批处理中查找打开的进程
奇怪的batch file编程错误:无效的参数/选项: – 'eq'
任务列表不会列出64个系统中的所有模块
如何确定一个正在运行的进程,因为在Windows操作系统上,它的PID是在python上?
对于(1),其他开发人员之一正在使用tasklist命令并parsing出可执行文件名称。 我也发现,C#有一个System.Diagnostic进程列表,将自动执行此操作。 我们仍然试图在Java和C#之间做出决定,所以我可能会倾向于语言中立的解决scheme,但这可能是C#的一个决定性因素。
对于(2),支持的进程列表可能平均很小(1-10个进程名称)。 我们可以通过列表来运行每个进程,但是我们认为这对于更旧的PC来说可能太多了,所以我们在应用程序启动时使用包含初始进程列表的字母平衡的AVL树,并检查所有内容然后再检查我们支持的进程名称列表,如果它不在树中。
任何build议,非常感谢。
编辑:显然你可以过滤任务列表的进程可执行文件的名称,所以我们可以只为被支持的进程列表上的每个进程。
编辑2:是否有一个相当于Windows XP Home的任务列表?
任务列表显示所有窗口
查看进程树 – tlist / tasklist
如果尚未启动,则使用Bat文件启动Java应用程序
windows批处理命令来确定进程的工作目录
Inno安装Pascal脚本来search正在运行的进程
如果你使用tasklist,只需运行一次命令并取回所有结果,而不是为每个可执行文件名运行,实际上可能会更快。 执行一个进程有一些开销,并得到输出。 (当你得到结果时,你必须在代码中循环遍历它们,但是这可能会更快,通常不会有超过100个进程同时运行,所以不会太糟糕。应该写一个测试,并检查是否是真的。
在C#中,Process.GetProcesses()是最好的方法。
在Java中,没有真正的等同的类/方法。 获取进程列表非常适合操作系统,因此Java设计人员必须决定不将这个功能集成/抽象到基类java类中。 您可能必须使用Runtime.getRuntime()。exec(“tasklist.exe”)来获得Windows上的结果,或者在Unix / Linux上使用exec(“ps”)。
希望我正确理解你的问题。 你只是试图比较进程列表与在Windows上运行的活动进程? C#
static void Main(string[] args) { // Approved processes. List<string> approvedProcesses = new List<string>(); approvedProcesses.Add("chrome"); approvedProcesses.Add("svchost"); // LINQ query for processes that match your approved processes. var processes = from p in System.Diagnostics.Process.GetProcesses() where approvedProcesses.Contains(p.ProcessName) select p; // Output matching processes to console. foreach (var process in processes) Console.WriteLine(process.ProcessName + " " + process.Id.ToString()); Console.ReadLine(); }
你多久检查一次? 除非基本不变,否则我不会担心过早优化(SO上的一个共同主题)。
一个系统通常只有不到100个进程在运行,即使有几千个进程,优化你的数据结构和设计最高效的算法也不会节省你很多时间。
话虽如此,我建议您获取所有正在运行的进程,并将该列表与内存中的已批准列表进行比较。 任何瓶颈都可能与Windows调用过程中的问题有关,因此一次而不是重复执行将会是有益的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。