通过API从C#附加到$ PSModulePath

本·格里博多(Ben Gribaudo)

使用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?

本·格里博多(Ben Gribaudo)

显然,环境变量PSModulePath不填充了默认PSModulePath,直到Runspace打开。PSModulePath通过在上设置InitialSessionStateRunspaceFactory.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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章