Make GetWindowsPowerShellModulePath compatible with multiple PS installations (#12280)

Add additional check for each component of PSModulePath (that is set for WinPS process) - if it is has pwsh.exe in the parent directory, then it is considered another PS Core installation and this location is also filtered out.
This commit is contained in:
Andrew
2020-04-14 11:08:01 +05:00
committed by GitHub
parent 9a92c62d30
commit 14487bf85d
2 changed files with 22 additions and 3 deletions
@@ -1234,7 +1234,7 @@ namespace System.Management.Automation
#if !UNIX
/// <summary>
/// Returns a PSModulePath suiteable for Windows PowerShell by removing this PowerShell's specific
/// Returns a PSModulePath suiteable for Windows PowerShell by removing PowerShell's specific
/// paths from current PSModulePath.
/// </summary>
/// <returns>
@@ -1261,9 +1261,24 @@ namespace System.Management.Automation
var modulePathList = new List<string>();
foreach (var path in currentModulePath.Split(';'))
{
if (!excludeModulePaths.Contains(path))
var trimmedPath = path.Trim();
if (!excludeModulePaths.Contains(trimmedPath))
{
modulePathList.Add(path);
// make sure this module path is Not part of other PS Core installation
var possiblePwshDir = Path.GetDirectoryName(trimmedPath);
if (string.IsNullOrEmpty(possiblePwshDir))
{
// i.e. module dir is in the drive root
modulePathList.Add(trimmedPath);
}
else
{
if (!File.Exists(Path.Combine(possiblePwshDir, "pwsh.dll")))
{
modulePathList.Add(trimmedPath);
}
}
}
}
@@ -646,6 +646,10 @@ Describe "PSModulePath changes interacting with other PowerShell processes" -Tag
$errors | Should -Be $null
}
It "Allows Windows PowerShell subprocesses to load WinPS version of `$PSHOME modules" {
powershell.exe -Command "Get-ChildItem | Out-Null;(Get-Module Microsoft.PowerShell.Management).Path" | Should -BeLike "*system32*"
}
It "Allows PowerShell subprocesses to call core modules" {
$errors = & $pwsh -Command "Get-ChildItem" 2>&1 | Where-Object { $_ -is [System.Management.Automation.ErrorRecord] }
$errors | Should -Be $null