当使用 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。在传递给 PSModulePathInitialSessionState 上设置 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/

10-12 19:58