在.Net代码中通过Runspace调整PSModulePath

时间:2015-03-11 23:46:08

标签: .net powershell

我正在尝试在运行某些脚本之前设置环境。这个环境由两部分组成。

  • 我想要预先加载的几个模块
  • 一个目录,其中包含可通过简单的“导入模块”
  • 加载的特定模块

我可以指定正在“预加载”的模块的绝对路径。

我正在创建一个InitialSessionState对象并调用ImportPSModule,并且该方面工作得很好。我正在努力的地方是设置模块加载路径。我的目标不是替换该变量,而是添加它。

我尝试打开运行空间,通过runspace.SessionStateProxy.GetVariable和runspace.SessionStateProxy.SetVariable调整env:PSModulePath。问题是这需要我打开运行空间。如果我在完成后尝试关闭它,当我尝试重新打开它时会出现异常。我可以把它打开,但我不想在我的代码中那个时候。

有没有办法在不打开运行空间并在那里设置变量的情况下操作模块加载路径?

1 个答案:

答案 0 :(得分:0)

我只是在我的开发vm上仔细检查了它,它确实有效。您可以将模块的完整路径指定为ImportPSModule的参数,而不是尝试修改$ PSModulePath变量以指向自定义位置。

static void Main(string[] args)
{
    InitialSessionState iss = InitialSessionState.CreateDefault();
    iss.ImportPSModule(new[]{@"C:\Users\username\Desktop\Module1\Module1.psd1"});
    using(RunspacePool rsp = RunspaceFactory.CreateRunspacePool(iss))
    {
        rsp.Open();
        PowerShell ps = PowerShell.Create();
        ps.RunspacePool = rsp;
        ps.AddScript("get-command -Module 'Module1'");
        foreach(PSObject item in ps.Invoke())
        {
            Console.WriteLine(item);
        }
    }
}