2016-10-27 63 views
1

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

顯然,環境變量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屬性來實現。這種方法消除了明確創建和打開實例的需要。

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幫我解決這個問題!