You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 06:15:35