C#调用带参数的Get-WmiObject PowerShell命令失效如何解决
问题原因
代码无法正常返回结果的核心是脚本字符串构造存在两个错误:
- 你在WQL的匹配通配符和关键词之间加了多余空格,把
%Java%写成% Java %、%accessToken%写成% accessToken %,直接导致查询条件无法匹配目标进程。 - 多层双引号转义逻辑混乱,实际传入PowerShell执行的语句存在语法错误,查询根本没有正常执行。
- 额外说明:
Get-WmiObject是PowerShell遗留命令,已被官方弃用,新环境推荐使用Get-CimInstance替代,兼容性和执行效率更好。
修复代码
WQL语法本身支持单引号作为字符串边界,用单引号包裹查询内的匹配值可以彻底避免多层双引号转义的问题,修正后的完整实现如下:
using System.Collections.ObjectModel; using System.Management.Automation; using System.Management.Automation.Runspaces; using System.Text; // 构造可正常执行的PowerShell脚本,C#逐字字符串内用两个双引号表示一个实际传入的双引号 string script = @"Get-CimInstance -Query ""SELECT CommandLine FROM Win32_Process WHERE Name LIKE '%Java%' AND CommandLine LIKE '%accessToken%'"""; Console.WriteLine(GetToken(script)); private string GetToken(string script) { // 用using包裹Runspace确保资源正确释放 using Runspace runspace = RunspaceFactory.CreateRunspace(); runspace.Open(); Pipeline pipeline = runspace.CreatePipeline(); pipeline.Commands.AddScript(script); pipeline.Commands.Add("Out-String"); Collection<PSObject> results = pipeline.Invoke(); // 读取执行错误,方便后续排查问题 if (pipeline.Error.Count > 0) { StringBuilder errorLog = new StringBuilder(); foreach (var errorItem in pipeline.Error.ReadToEnd()) { errorLog.AppendLine(errorItem.ToString()); } throw new InvalidOperationException($"脚本执行失败:{errorLog}"); } StringBuilder resultBuilder = new StringBuilder(); foreach (PSObject obj in results) { resultBuilder.AppendLine(obj.ToString()); } return resultBuilder.ToString(); }
其他注意事项
- 如果必须兼容极旧版本PowerShell需要使用
Get-WmiObject,直接替换脚本中的命令名即可,查询语句部分不需要修改。 - 不要在WQL的通配符
%和匹配关键词之间加无意义空格,%是通配符,加空格后会匹配带空格的字符串,和预期逻辑不符。
内容的提问来源于stack exchange,提问作者Henktorius
相关产品推荐
相关产品推荐

