Commands/PSAdapter/Get-PSAdapter.ps1
|
function Get-PSAdapter { <# .SYNOPSIS Gets PSAdapter types and modules. .DESCRIPTION Gets PSAdapter CmdletAdapter types and the modules that use them. CmdletAdapters can be used to create custom cmdlets that adapt to different data sources. .EXAMPLE Get-PSAdapter .EXAMPLE Get-PSAdapter -PSAdapterType Type .EXAMPLE Get-PSAdapter -PSAdapterType Module .EXAMPLE Get-PSAdapter -PSAdapterType File #> [CmdletBinding(PositionalBinding=$false)] param( # The type of PSAdapter to get. Can be file, module, or type. [Parameter(ValueFromPipelineByPropertyName)] [ValidateSet("File","Module","Type")] [string[]] $PSAdapterType = @('File','Module','Type') ) begin { $psAdapterTypes = if ($PSAdapterType -contains 'Type') { @(foreach ($loadedAssembly in [AppDomain]::CurrentDomain.GetAssemblies()) { try { :nextType foreach ($loadedType in $loadedAssembly.GetTypes()) { if (-not $loadedType.IsPublic) { continue } if ($loadedType.IsInterface -or $loadedType.IsAbstract) { continue } $processRecordExists = $loadedType.GetMember("ProcessRecord") if ($processRecordExists -and $processRecordExists -join ';' -match 'Cmdletization') { $loadedType } } } catch { } }) } $psAdaptedModules = if ($PSAdapterType -contains 'Module') { @(foreach ($loadedModule in Get-Module) { if ($loadedModule.ModuleType -eq 'CIM') { $loadedModule } elseif ($loadedModule.NestedModules.ModuleType -match 'CIM') { foreach ($nestedModule in $loadedModule.NestedModules) { if ($nestedModule.ModuleType -eq 'CIM') { $nestedModule } } } }) } $psAdaptersLocal = if ($PSAdapterType -contains 'File') { (Get-Item $pwd).EnumerateFiles("*.*", 'AllDirectories') -match '\.cdxml$' } } process { foreach ($adapterTypeOrModule in @( $psAdapterTypes $psAdaptedModules $psAdaptersLocal )) { if ($null -eq $adapterTypeOrModule) { continue } if ($adapterTypeOrModule.pstypenames -notcontains 'PSAdapter') { $adapterTypeOrModule.pstypenames.insert(0, 'PSAdapter') } $adapterTypeOrModule } } } |