Improve the logic to detect PSHome module path derived from a different powershell core instance.
This commit is contained in:
parent
9179cecd01
commit
fdd514108c
1 changed files with 16 additions and 8 deletions
|
@ -760,7 +760,7 @@ namespace System.Management.Automation
|
||||||
/// show up in current process module path. It doesn't make sense for B to load modules from
|
/// show up in current process module path. It doesn't make sense for B to load modules from
|
||||||
/// A's pshome module path, so remove it in such case.
|
/// A's pshome module path, so remove it in such case.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private static string RemoveSxSPsHomeModulePath(string currentProcessModulePath)
|
private static string RemoveSxSPsHomeModulePath(string currentProcessModulePath, string personalModulePath, string sharedModulePath, string psHomeModulePath)
|
||||||
{
|
{
|
||||||
#if UNIX
|
#if UNIX
|
||||||
const string powershellExeName = "powershell";
|
const string powershellExeName = "powershell";
|
||||||
|
@ -773,18 +773,26 @@ namespace System.Management.Automation
|
||||||
foreach (var path in currentProcessModulePath.Split(Utils.Separators.PathSeparator, StringSplitOptions.RemoveEmptyEntries))
|
foreach (var path in currentProcessModulePath.Split(Utils.Separators.PathSeparator, StringSplitOptions.RemoveEmptyEntries))
|
||||||
{
|
{
|
||||||
string trimedPath = path.Trim().TrimEnd(Path.DirectorySeparatorChar);
|
string trimedPath = path.Trim().TrimEnd(Path.DirectorySeparatorChar);
|
||||||
if (trimedPath == string.Empty || trimedPath.IndexOfAny(invalidPathChars) != -1)
|
if (trimedPath.IndexOfAny(invalidPathChars) != -1 || !Path.IsPathRooted(trimedPath))
|
||||||
{
|
{
|
||||||
// Path contains invalid characters. Ignore it.
|
// Path contains invalid characters or it's not an absolute path. Ignore it.
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
string psExePath = Path.Combine(Path.GetDirectoryName(trimedPath), powershellExeName);
|
if (!trimedPath.Equals(personalModulePath, StringComparison.OrdinalIgnoreCase) &&
|
||||||
if (File.Exists(psExePath))
|
!trimedPath.Equals(sharedModulePath, StringComparison.OrdinalIgnoreCase) &&
|
||||||
|
!trimedPath.Equals(psHomeModulePath, StringComparison.OrdinalIgnoreCase) &&
|
||||||
|
trimedPath.EndsWith("Modules", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
// Path is a PSHome module path. Ignore it.
|
string parentDir = Path.GetDirectoryName(trimedPath);
|
||||||
|
string psExePath = Path.Combine(parentDir, powershellExeName);
|
||||||
|
string psDepsPath = Path.Combine(parentDir, "powershell.deps.json");
|
||||||
|
if (File.Exists(psExePath) && File.Exists(psDepsPath))
|
||||||
|
{
|
||||||
|
// Path is a PSHome module path from a different powershell core instance. Ignore it.
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (modulePathString.Length > 0)
|
if (modulePathString.Length > 0)
|
||||||
{
|
{
|
||||||
|
@ -852,7 +860,7 @@ namespace System.Management.Automation
|
||||||
else if (runningSxS) // The running powershell is an SxS PS instance
|
else if (runningSxS) // The running powershell is an SxS PS instance
|
||||||
{
|
{
|
||||||
// When SxS PS instance A starts SxS PS instance B, A's PSHome module path might be inherited by B. We need to remove that path from B
|
// When SxS PS instance A starts SxS PS instance B, A's PSHome module path might be inherited by B. We need to remove that path from B
|
||||||
currentProcessModulePath = RemoveSxSPsHomeModulePath(currentProcessModulePath);
|
currentProcessModulePath = RemoveSxSPsHomeModulePath(currentProcessModulePath, personalModulePath, sharedModulePath, psHomeModulePath);
|
||||||
|
|
||||||
string personalModulePathToUse = string.IsNullOrEmpty(hkcuUserModulePath) ? personalModulePath : hkcuUserModulePath;
|
string personalModulePathToUse = string.IsNullOrEmpty(hkcuUserModulePath) ? personalModulePath : hkcuUserModulePath;
|
||||||
string systemModulePathToUse = string.IsNullOrEmpty(hklmMachineModulePath) ? psHomeModulePath : hklmMachineModulePath;
|
string systemModulePathToUse = string.IsNullOrEmpty(hklmMachineModulePath) ? psHomeModulePath : hklmMachineModulePath;
|
||||||
|
|
Loading…
Reference in a new issue