如何通过C#调用PowerShell获取包含空格的进程名?
解决C#调用PowerShell获取带空格进程名的问题
哈哈,这个问题我之前踩过坑!当进程名称包含空格时,直接拼接PowerShell命令会被解析成多个参数,导致根本匹配不到目标进程。下面是几个靠谱的解决方案,优先推荐第二种:
方法1:给进程名添加引号包裹
手动给带空格的进程名加上单引号或双引号,让PowerShell把它当成一个整体。注意如果进程名里本身包含单引号,要替换成两个单引号(PowerShell的转义规则):
using System.Management.Automation; var targetProcess = "My Test App.exe"; // 用单引号包裹,同时转义内部的单引号 var psCommand = $"Get-Process -Name '{targetProcess.Replace("'", "''")}'"; using (var powerShell = PowerShell.Create()) { powerShell.AddScript(psCommand); var processResults = powerShell.Invoke(); foreach (var result in processResults) { Console.WriteLine($"找到进程:{result.Properties["ProcessName"].Value}"); } }
如果用双引号的话,在C#里要记得转义双引号(用\"),不过单引号的方式在处理特殊字符时更省心一点。
方法2:使用参数绑定(推荐!)
直接拼接字符串不仅容易出问题,还存在PowerShell注入的风险。更好的方式是用PowerShell的参数绑定功能,把进程名作为参数传递,系统会自动处理空格和特殊字符:
using System.Management.Automation; var targetProcess = "My Test App.exe"; using (var powerShell = PowerShell.Create()) { // 直接添加命令和参数,无需手动处理引号 powerShell.AddCommand("Get-Process") .AddParameter("Name", targetProcess); var processResults = powerShell.Invoke(); foreach (var result in processResults) { Console.WriteLine($"找到进程:{result.Properties["ProcessName"].Value}"); } }
这种方式既安全又省心,完全不用考虑字符串转义的各种情况,是最规范的写法。
方法3:通过进程路径过滤(可选)
如果你知道进程的完整可执行文件路径,也可以通过路径来过滤进程,同样用参数绑定:
using System.Management.Automation; var processPath = @"C:\Program Files\MyApp\My Test App.exe"; using (var powerShell = PowerShell.Create()) { powerShell.AddCommand("Get-Process") .AddParameter("FilePath", processPath); var processResults = powerShell.Invoke(); foreach (var result in processResults) { Console.WriteLine($"找到进程:{result.Properties["ProcessName"].Value}"); } }
总结一下,优先用方法2,既解决了空格问题,又避免了潜在的安全风险,代码也更简洁易维护。
内容的提问来源于stack exchange,提问作者oops
相关产品推荐
相关产品推荐

