通过API附加到C#的$ PSModulePath

时间:2016-10-27 22:14:56

标签: .net powershell

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

1 个答案:

答案 0 :(得分:2)

显然,在Set-DnsServerRessourceRecord打开之前,环境变量PSModulePath不会使用默认PSModulePath填充。将Runspace设置为传递给PSModulePath的{​​{1}}可以抑制此自动填充。

要操纵默认InitialSessionState等到相关的RunspaceFactory.CreateRunspace()打开,然后根据需要使用PSModulePath / {获取/设置变量{1}}。

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

感谢问题Adjust PSModulePath via Runspace in .Net code帮助我解决这个问题!