当使用 C#/.Net 执行 PowerShell 脚本时,我想 添加 到 $PSModulePath 的路径而不覆盖默认的 $PSModulePath。
我已经弄清楚如何使用 InitialSessionState.EnvironmentVariables 将 $PSModulePath 设置为我选择的值。然而,这种方法是 不可取的 因为它替换了默认的 $PSModulePath 而不是附加到它。
var state= InitialSessionState.CreateDefault();
state.EnvironmentVariables.Add(new SessionStateVariableEntry("PSModulePath", myModuleLoadPath, "PowerShell Module Search Locations"));
var runSpace = RunspaceFactory.CreateRunspace(initialState);
using (var powershell = PowerShell.Create())
{
powershell
.AddScript(script)
.Invoke();
}
有没有办法以编程方式使用 .Net API 将 附加到 $PSModulePath?
最佳答案
显然,在 PSModulePath
打开之前,环境变量 PSModulePath
不会填充默认的 Runspace
。在传递给 PSModulePath
的 InitialSessionState
上设置 RunspaceFactory.CreateRunspace()
会抑制这种自动填充。
要操作默认的 PSModulePath
, 等到相关的 Runspace
打开 ,然后根据需要使用 SessionStateProxy.GetVariable()
/SetVariable()
获取/设置变量。
using (var runspace = RunspaceFactory.CreateRunspace())
{
runspace.Open();
var proxy = runspace.SessionStateProxy;
var psModulePath = proxy.GetVariable("env:PSModulePath");
proxy.SetVariable("env:PSModulePath", $"{psModulePath};{extraPathToAppend}");
using (var powershell = PowerShell.Create())
{
powershell.Runspace = runspace;
powershell
.AddScript(script)
.Invoke();
}
}
通过访问当前
PowerShell
实例的 Runspace
属性可以达到同样的效果。这种方法消除了显式创建和打开 Runspace
实例的需要。using (var powershell = PowerShell.Create())
{
var proxy = powershell.Runspace.SessionStateProxy;
var psModulePath = proxy.GetVariable("env:PSModulePath");
proxy.SetVariable("env:PSModulePath", $"{psModulePath};{extraPathToAppend}");
powershell
.AddScript(script)
.Invoke();
}
感谢 Adjust PSModulePath via Runspace in .Net code 问题帮助我解决了这个问题!
关于.net - 通过 API 从 C# 附加到 $PSModulePath,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40295052/