internal static List <string> GetDefaultAvailableModuleFiles(bool force, bool preferSystemModulePath, System.Management.Automation.ExecutionContext context) { Pipeline currentlyRunningPipeline = context.CurrentRunspace.GetCurrentlyRunningPipeline(); if (!force && (currentlyRunningPipeline != null)) { lock (cachedAvailableModuleFiles) { if ((currentlyRunningPipeline.InstanceId == pipelineInstanceIdForModuleFileCache) && (cachedAvailableModuleFiles.Count > 0)) { return(cachedAvailableModuleFiles); } } } List <string> availableModuleFiles = new List <string>(); List <string> modulePaths = new List <string>(); foreach (string str in ModuleIntrinsics.GetModulePath(preferSystemModulePath, context)) { if (Directory.Exists(str)) { GetDefaultAvailableModuleFiles(str, availableModuleFiles, modulePaths); } } if (currentlyRunningPipeline != null) { lock (cachedAvailableModuleFiles) { pipelineInstanceIdForModuleFileCache = currentlyRunningPipeline.InstanceId; cachedAvailableModuleFiles = availableModuleFiles; } } return(availableModuleFiles); }
/// <summary> /// Get valid module files from module paths. /// </summary> private IEnumerable <string> GetValidModuleFiles(HashSet <string> moduleNamesToFind) { var modulePaths = new HashSet <string>(StringComparer.OrdinalIgnoreCase); foreach (string path in ModuleIntrinsics.GetModulePath(includeSystemModulePath: false, Context)) { string uniquePath = path.TrimEnd(Utils.Separators.Directory); if (!modulePaths.Add(uniquePath)) { continue; } foreach (string moduleFile in ModuleUtils.GetDefaultAvailableModuleFiles(uniquePath)) { // We only care about module manifest files because that's where experimental features are declared. if (!moduleFile.EndsWith(StringLiterals.PowerShellDataFileExtension, StringComparison.OrdinalIgnoreCase)) { continue; } if (moduleNamesToFind != null) { string currentModuleName = ModuleIntrinsics.GetModuleName(moduleFile); if (!moduleNamesToFind.Contains(currentModuleName)) { continue; } } yield return(moduleFile); } } }
internal static IEnumerable <string> GetDefaultAvailableModuleFiles(bool isForAutoDiscovery, ExecutionContext context) { HashSet <string> uniqueModuleFiles = new HashSet <string>(StringComparer.OrdinalIgnoreCase); foreach (string directory in ModuleIntrinsics.GetModulePath(isForAutoDiscovery, context)) { var needWriteProgressCompleted = false; ProgressRecord analysisProgress = null; // Write a progress message for UNC paths, so that users know what is happening try { if ((context.CurrentCommandProcessor != null) && Utils.PathIsUnc(directory)) { analysisProgress = new ProgressRecord(0, Modules.DeterminingAvailableModules, string.Format(CultureInfo.InvariantCulture, Modules.SearchingUncShare, directory)) { RecordType = ProgressRecordType.Processing }; context.CurrentCommandProcessor.CommandRuntime.WriteProgress(analysisProgress); needWriteProgressCompleted = true; } } catch (InvalidOperationException) { // This may be called when we are not allowed to write progress, // So eat the invalid operation } try { foreach (string moduleFile in ModuleUtils.GetDefaultAvailableModuleFiles(directory)) { if (uniqueModuleFiles.Add(moduleFile)) { yield return(moduleFile); } } } finally { if (needWriteProgressCompleted) { analysisProgress.RecordType = ProgressRecordType.Completed; context.CurrentCommandProcessor.CommandRuntime.WriteProgress(analysisProgress); } } } }