使用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();
}
感谢问题。通过.Net代码中的Runspace调整PSModulePath可以帮助我解决这一问题!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句