从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
相关产品推荐
相关产品推荐

