C#用PSCommand.AddCommand替代AddScript调用Exchange PowerShell报错求助
问题根因
你遇到的报错核心是AddCommand的执行逻辑和AddScript不同:
AddScript传入的是完整脚本,PowerShell会逐行执行,先完成Add-PSSnapin加载Exchange组件后,再执行后续的Get-MailUser命令,不会提前校验未执行的命令是否存在- 你当前的写法把
Add-PSSnapin和Get-MailUser放在了同一个管道序列中,PowerShell在预处理整个管道时,会先检查所有命令是否存在,此时Exchange的snapin还没完成加载,自然识别不到Get-MailUser命令
其他已知错误
- 拼写错误:代码里的
proxyadressstring少了字母d,正确写法是proxyaddressstring - 参数冗余:你原来的逻辑是展开
EmailAddresses属性后取对应的ProxyAddressString,不需要在第一个Select-Object里同时加ExpandProperty和Property参数 - 无效占位符:旧代码里的
String.Format传入了settings.ExchangeServerUri,但脚本字符串里没有对应的{0}占位符,该参数实际未生效,如果你是要连接远程Exchange服务器,需要额外补充远程会话创建逻辑
修复后代码
使用AddStatement()方法分隔两条独立命令,告诉PowerShell先完成snapin加载,再执行后续查询逻辑:
PSCommand script = new PSCommand(); // 加载Exchange Snapin,执行完成后再运行后续命令 script.AddCommand("Add-PSSnapin") .AddArgument("Microsoft.Exchange.Management.PowerShell.SnapIn") .AddStatement(); // 执行查询管道 script.AddCommand("Get-MailUser") .AddCommand("Select-Object") .AddParameter("ExpandProperty", "EmailAddresses") .AddCommand("Select-Object") .AddParameter("Property", "ProxyAddressString");
补充说明
如果你的代码运行环境没有本地安装Exchange管理工具,无法通过本地加载snapin的方式调用Exchange命令,可以改为创建远程PSSession连接Exchange服务器的方式执行查询,就能用到你代码里预留的settings.ExchangeServerUri参数。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

