VB.Net中如何检测以指定前缀开头的进程是否正在运行
我来逐个解答你的问题:
1. 用Process.GetProcessesByName("Mozilla")能否找到MozillaFirefox.exe?
答案是不能。原因是Process.GetProcessesByName()方法是精确匹配进程的ProcessName属性——这个属性对应可执行文件去掉.exe后缀后的完整名称,比如MozillaFirefox.exe的ProcessName就是MozillaFirefox。你传入"Mozilla"的话,它只会寻找ProcessName恰好等于Mozilla的进程,不会匹配前缀包含该字符串的进程。
如果要精准找到MozillaFirefox.exe,你需要传入完整的ProcessName:
p = Process.GetProcessesByName("MozillaFirefox")
2. 检测以指定前缀开头的运行进程
如果需要匹配ProcessName以某几个字符开头的进程(比如前5个字符是Mozii),GetProcessesByName无法直接实现,你需要遍历系统中所有进程,再逐个检查名称前缀:
Imports System.Diagnostics Imports System.Linq Dim targetPrefix As String = "Mozii" ' 筛选出名称以目标前缀开头的进程,忽略大小写 Dim matchingProcesses As Process() = Process.GetProcesses() _ .Where(Function(proc) proc.ProcessName.StartsWith(targetPrefix, StringComparison.OrdinalIgnoreCase)) _ .ToArray() If matchingProcesses.Count > 0 Then ' 存在符合条件的运行进程 Console.WriteLine($"找到 {matchingProcesses.Count} 个符合条件的进程") Else ' 没有符合条件的运行进程 Console.WriteLine("未找到符合条件的进程") End If
这里用StringComparison.OrdinalIgnoreCase是为了忽略大小写差异(比如进程名是moziiXYZ.exe也能被匹配),如果需要严格区分大小写,移除这个参数即可。
3. 便捷检测带版本标识的新版进程
对于名称后缀带有1.7、1.8或2.1这类版本号的进程(比如MyApp1.7.exe、Firefox2.1.exe),可以根据场景选择两种实现方式:
方式一:前缀匹配(简单场景)
如果版本号都是跟在固定前缀后面,直接用StartsWith匹配前缀即可,不管后面的版本号是什么:
Dim appPrefix As String = "Firefox" Dim matchingProcesses As Process() = Process.GetProcesses() _ .Where(Function(proc) proc.ProcessName.StartsWith(appPrefix, StringComparison.OrdinalIgnoreCase)) _ .ToArray()
这样所有前缀为Firefox的进程(比如Firefox1.7、Firefox2.1)都会被匹配到。
方式二:正则表达式(复杂场景)
如果版本号有固定格式(比如X.X或X.X.X),可以用正则表达式做更精确的匹配。比如要匹配前缀为Firefox、后缀是数字.数字格式版本号的进程:
Imports System.Diagnostics Imports System.Linq Imports System.Text.RegularExpressions ' 正则规则:以Firefox开头,后面跟至少一个数字+点+至少一个数字,直到结尾 Dim pattern As String = "^Firefox\d+\.\d+$" Dim regex As New Regex(pattern, RegexOptions.IgnoreCase) Dim matchingProcesses As Process() = Process.GetProcesses() _ .Where(Function(proc) regex.IsMatch(proc.ProcessName)) _ .ToArray()
这个正则表达式可以精准匹配Firefox1.7、Firefox2.1这类进程,不会误匹配不带版本号的Firefox或格式不符的Firefoxabc。
整合后的完整示例代码
把前缀检测的逻辑整合到你的CheckIfRunning方法中:
Imports System.Diagnostics Imports System.Linq Dim p() As Process Private Sub CheckIfRunning() Dim targetPrefix As String = "Mozii" ' 筛选出名称以目标前缀开头的进程 p = Process.GetProcesses() _ .Where(Function(proc) proc.ProcessName.StartsWith(targetPrefix, StringComparison.OrdinalIgnoreCase)) _ .ToArray() If p.Count > 0 Then ' 进程正在运行 MessageBox.Show($"检测到 {p.Count} 个符合条件的运行进程!") Else ' 进程未运行 MessageBox.Show("未检测到符合条件的运行进程!") End If End Sub
内容的提问来源于stack exchange,提问作者user11605008

