如何用C#执行PowerShell脚本并设置执行策略,遇Session参数空异常如何解决
异常诱因
这个报错的根本原因是初始化的PowerShell会话上下文不完整:
你使用的InitialSessionState.CreateDefault()方法是针对Windows PowerShell 5.1及更早版本设计的,如果你在.NET Core/.NET 5+环境下调用高版本PowerShell SDK,这个方法不会自动加载会话必需的核心模块和基础配置,导致Runspace打开后内部Session对象为空,执行脚本时参数校验失败。
修复方案
方案1:替换初始会话状态的创建方法
将第一行的InitialSessionState.CreateDefault()替换为InitialSessionState.CreateDefault2(),这个方法是为跨平台PowerShell(PowerShell 7+)和.NET Core环境设计的,会自动加载所有会话必需的核心配置,修改后原有逻辑即可正常运行。
方案2:改用更稳定的PowerShell实例调用方式
手动管理Runspace和Pipeline更容易出现上下文兼容问题,推荐直接用PowerShell类封装的方法调用脚本,完整修复代码如下:
InitialSessionState iss = InitialSessionState.CreateDefault2(); // 原有执行策略修改逻辑保留 PropertyInfo execPolProp = iss.GetType().GetProperty("ExecutionPolicy"); if (execPolProp != null && execPolProp.CanWrite) { execPolProp.SetValue(iss, ExecutionPolicy.Bypass, null); } // 用using自动释放资源 using (PowerShell ps = PowerShell.Create(iss)) { ps.AddCommand(scriptfile); ps.AddParameter("key", "value"); // 执行脚本 var results = ps.Invoke(); // 可选:捕获执行过程中的错误 if (ps.Streams.Error.Any()) { foreach (var err in ps.Streams.Error) { Console.WriteLine($"执行错误:{err.Exception.Message}"); } } }
额外注意项
- 确认你安装的
System.Management.AutomationNuGet包版本和目标运行环境匹配:目标为Windows PowerShell 5.1时选择6.x版本包,目标为PowerShell 7+时选择对应大版本的包即可。 - 建议给
scriptfile传入绝对路径,避免相对路径受程序工作目录影响找不到脚本文件。
内容的提问来源于stack exchange,提问作者3r1c
相关产品推荐
相关产品推荐

