source/Private/Common.ps1
|
function Get-ConflictingModuleList { [CmdletBinding()] [OutputType([PSCustomObject[]])] param ( [Parameter(Mandatory = $true)] [hashtable]$RequiredModules ) $conflicts = @() foreach ($moduleName in $RequiredModules.Keys) { $requiredVersion = $RequiredModules[$moduleName] $loadedModules = Get-Module -Name $moduleName -ErrorAction SilentlyContinue if ($loadedModules) { $conflictingVersions = $loadedModules | Where-Object { $_.Version -ne $requiredVersion } if ($conflictingVersions) { $conflicts += [PSCustomObject]@{ ModuleName = $moduleName LoadedVersions = $conflictingVersions.Version RequiredVersion = $requiredVersion } } } } return $conflicts } function Show-ModuleConflictInstructions { <# .SYNOPSIS Shows user-friendly instructions to resolve module version conflicts. .PARAMETER ConflictingModules Array of conflicting module information from Get-ConflictingModuleList. #> [CmdletBinding()] [OutputType([void])] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseSingularNouns', 'Show-ModuleConflictInstructions')] param ( [Parameter(Mandatory = $true)] [PSCustomObject[]]$ConflictingModules ) Write-Host "Module version conflicts detected - initialization cannot proceed in current session" -ForegroundColor Red Write-Host "" Write-Host "PowerShell cannot unload assemblies from the current session." -ForegroundColor Yellow Write-Host "To resolve this issue, please follow these steps:" -ForegroundColor Yellow Write-Host "" Write-Host "1. Close this PowerShell session" -ForegroundColor Cyan Write-Host "2. Open a new PowerShell session" -ForegroundColor Cyan Write-Host "3. Re-run your command" -ForegroundColor Cyan Write-Host "" Write-Host "Module version conflicts:" -ForegroundColor Yellow foreach ($conflict in $ConflictingModules) { $loadedVersions = $conflict.LoadedVersions -join ', ' Write-Host " - $($conflict.ModuleName): Loaded=$loadedVersions, Required=$($conflict.RequiredVersion)" -ForegroundColor Yellow } Write-Host "" } function Initialize-RequiredModule { <# .SYNOPSIS Initializes required Microsoft Graph PowerShell modules. .DESCRIPTION Checks for module version conflicts, installs missing modules, and imports required modules. If version conflicts are detected, provides user instructions and returns false. .OUTPUTS [bool] True if initialization succeeded, False if conflicts prevent initialization. #> [CmdletBinding()] [OutputType([bool])] param() Write-Verbose "Initializing required Microsoft Graph PowerShell modules..." # Check for module version conflicts $conflictingModules = Get-ConflictingModuleList -RequiredModules $RequiredGraphModules if ($conflictingModules.Count -gt 0) { Show-ModuleConflictInstructions -ConflictingModules $conflictingModules return $false } # Install missing modules and import all required modules foreach ($moduleName in $RequiredGraphModules.Keys) { $requiredVersion = $RequiredGraphModules[$moduleName] Write-Verbose "Processing module: $moduleName (version $requiredVersion)" # Check if the correct version is already loaded $loadedModule = Get-Module -Name $moduleName | Where-Object { $_.Version -eq $requiredVersion } if ($loadedModule) { Write-Verbose "Module $moduleName version $requiredVersion is already loaded" continue } # Check if the required version is installed $installedModule = Get-Module -FullyQualifiedName @{ ModuleName = $moduleName RequiredVersion = $requiredVersion } -ListAvailable -ErrorAction SilentlyContinue if (-not $installedModule) { Write-Verbose "Installing module $moduleName version $requiredVersion..." try { Install-Module -Name $moduleName -RequiredVersion $requiredVersion -Force -AllowClobber -Scope CurrentUser -ErrorAction Stop Write-Information "Successfully installed $moduleName version $requiredVersion" } catch { $errorMessage = "Failed to install required module $moduleName version $requiredVersion. Error: $($_.Exception.Message)" Write-Error $errorMessage return $false } } # Import the required version Write-Verbose "Importing module $moduleName version $requiredVersion..." try { Import-Module -Name $moduleName -RequiredVersion $requiredVersion -Force -ErrorAction Stop Write-Verbose "Successfully imported $moduleName version $requiredVersion" } catch { $errorMessage = "Failed to import required module $moduleName version $requiredVersion. Error: $($_.Exception.Message)" Write-Error $errorMessage return $false } } Write-Verbose "All required Microsoft Graph PowerShell modules are initialized and ready to use" return $true } |