function Get-ModuleInventory { <# .SYNOPSIS Returns an OrderedDictionary that Represents the Module Inventory. #> [CmdletBinding()] Param() $logLead = (Get-LogLeadName); $providerStopWatch = [System.Diagnostics.StopWatch]::StartNew() $moduleDictionary = New-Object System.Collections.Specialized.OrderedDictionary $moduleDetails = New-Object System.Collections.Specialized.OrderedDictionary try { Write-Verbose "$logLead : [$($providerStopWatch.Elapsed)] : Getting Available Modules" $localModules = Get-Module -ListAvailable -Verbose:$false | Select-Object ModuleType, Name, Version, ExportedCommands, ModuleBase, Description Write-Verbose "$logLead : [$($providerStopWatch.Elapsed)] : Module Inventory Complete" foreach ($module in $localModules) { $moduleDetails[$module.Name] = New-Object System.Collections.Specialized.OrderedDictionary $moduleDetails[$module.Name]["ModuleType"] = $module.ModuleType $moduleDetails[$module.Name]["Name"] = $module.Name $moduleDetails[$module.Name]["Version"] = $module.Version $moduleDetails[$module.Name]["ExportedCommands"] = ($module.ExportedCommands.Values | Select-Object -ExpandProperty Name) $moduleDetails[$module.Name]["ModuleBase"] = $module.ModuleBase $moduleDetails[$module.Name]["Description"] = $module.Description } } catch { $moduleDetails["Error"] = $_.Exception.ToString() } $moduleDictionary.Add("Modules", $moduleDetails) Write-Verbose "$logLead : [$($providerStopWatch.Elapsed)] : Provider Complete" $providerStopWatch.Stop() return $moduleDictionary }