TypeName.psm1
<#
.SYNOPSIS Get a data-type information about a object. .DESCRIPTION Get a data-type information about a object. If the variable is a COM object, this function returns a interface name. .PARAMETER InputObject Any object. .PARAMETER ProgId ProgID you wants to get a interface name. .OUTPUTS System.String .EXAMPLE Get-TypeName 1.0 System.Double .EXAMPLE Get-TypeName (New-Object -ComObject Scripting.Dictionary) IDictionary .EXAMPLE Get-TypeName -ProgId WbemScripting.SWbemLocator ISWbemLocator #> function Get-TypeName { [CmdletBinding(DefaultParameterSetName = 'InputObject')] [OutputType([string])] param ( [Parameter(ParameterSetName = 'InputObject', Mandatory, Position = 0)][AllowNull()] [Object]$InputObject, [Parameter(ParameterSetName = 'ProgId', Mandatory)][ValidateNotNullOrEmpty()] [string]$ProgId ) if ($PSCmdlet.ParameterSetName -eq 'ProgId') { $comObject = New-Object -ComObject $ProgId if ($comObject) { return Get-TypeName $comObject } else { return } } if ($null -eq $InputObject) { return 'Null' } if ($InputObject -is [__ComObject]) { Write-Verbose 'Type: ComObject' if ($PSVersionTable['PSVersion'] -ge '6.0') { $pstypename = $InputObject.pstypenames[0] $interfaceKey = "Registry::HKEY_CLASSES_ROOT\Interface\$(($pstypename -split '#')[1])" if (Test-Path $interfaceKey) { return (Get-Item $interfaceKey).GetValue('') } else { return $pstypename } } else { Add-Type -AssemblyName Microsoft.VisualBasic return [Microsoft.VisualBasic.Information]::TypeName($InputObject) } } if ($InputObject -is [ciminstance]) { Write-Verbose 'Type: CimInstance' return $InputObject.CimClass.ToString() } if ($InputObject -is [wmi]) { Write-Verbose 'Type: WmiObject' $classPath = $InputObject.ClassPath return "$($classPath.NamespacePath):$($classPath.ClassName)" } if ($InputObject.GetType().FullName -eq 'System.Management.Automation.PSCustomObject') { $pstypename = $InputObject.pstypenames[0] if ($pstypename -ne 'System.Management.Automation.PSCustomObject') { Write-Verbose 'Type: PSCustomObject' return $pstypename } } Write-Verbose 'Type: .NetObject' return $InputObject.GetType().ToString() } |