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

从C#调用PowerShell的Select-Object cmdlet时遇错误求解决

解决C#中调用PowerShell Select-Object自定义属性的错误

错误根源是你把Select-Object连同它的参数整个作为命令名传给了AddCommand方法,而AddCommand只能接收单纯的cmdlet/命令名称,不能带参数。以下是两种可行的解决方式:


方式一:分步构建命令链(推荐,更规范安全)

通过AddCommand单独添加Select-Object,再用哈希表传递自定义属性参数:

using (PowerShell ps = PowerShell.Create())
{
    ps.Runspace = Runspace;
    // 添加Get-RemoteMailbox命令及身份参数
    ps.AddCommand("Get-RemoteMailbox")
      .AddParameter("Identity", identity);
    
    // 添加Select-Object命令
    ps.AddCommand("Select-Object");
    // 构建自定义属性的哈希表
    var customEmailProp = new Hashtable
    {
        ["Name"] = "EmailAddresses",
        ["Expression"] = ScriptBlock.Create(@"($_.EmailAddresses | Where-Object {$_ -clike 'dir*'} | ForEach-Object {$_ -replace 'dir:',''}) -join ','")
    };
    // 将自定义属性作为参数传入
    ps.AddArgument(customEmailProp);
    
    // 执行命令并获取结果
    var results = ps.Invoke();
    // 后续结果处理逻辑...
}

方式二:使用AddScript执行完整脚本字符串

直接拼接完整的PowerShell命令,通过AddScript执行:

using (PowerShell ps = PowerShell.Create())
{
    ps.Runspace = Runspace;
    // 拼接完整命令,注意转义引号
    string fullScript = $"Get-RemoteMailbox -Identity \"{identity}\" | Select-Object @{{Name='EmailAddresses';Expression={{($_.EmailAddresses | Where-Object {{$_ -clike 'dir*'}} | ForEach-Object {{$_ -replace 'dir:',''}}) -join ','}}}}";
    ps.AddScript(fullScript);
    
    // 执行命令并获取结果
    var results = ps.Invoke();
    // 后续结果处理逻辑...
}

补充说明

  • 方式一避免了字符串拼接的注入风险,代码结构更清晰,便于维护。
  • 方式二更贴近你原本在PowerShell中执行的命令形式,但要注意对identity变量中的特殊字符做转义处理,防止命令执行异常。

内容的提问来源于stack exchange,提问作者Giorginho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:13:10