Public/Get-ISComponent.ps1

<#
.SYNOPSIS
    Gets all installed IntelliSearch components
.DESCRIPTION
    The Get-ISComponent cmdlet will list out all installed components, optionally matching the supplied name
.EXAMPLE
    C:\PS> Get-ISComponent
 
    ComponentName ComponentVersion
    ------------- ----------------
    IntelliSearch.Client.ENT.Search.ASPNET.6.0.0-Be... 6.0.0-Beta.13
    IntelliSearch.Connector.Dropbox.1.0.0 1.0.0
    IntelliSearch.Connector.Exchange.7.0.7 7.0.7
    IntelliSearch.Connector.File.7.0.12 7.0.12
    IntelliSearch.Connector.File.7.0.8 7.0.8
    IntelliSearch.Connector.GDrive.1.0.0 1.0.0
 
    Lists all installed components on the system.
.EXAMPLE
    C:\PS> Get-ISComponent -Name "IntelliSearch.Server.CrawlerManager*"
 
    ComponentName ComponentVersion
    ------------- ----------------
    IntelliSearch.Server.CrawlerManager.6.0.0-Beta.13 6.0.0-Beta.13
    IntelliSearch.Server.CrawlerManager.6.0.0-Beta.14 6.0.0-Beta.14
 
    Finds the components starting with the supplied name.
.EXAMPLE
    C:\PS> Get-ISComponent -Name "*Connector*"
 
    ComponentName ComponentVersion
    ------------- ----------------
    IntelliSearch.Connector.Dropbox.1.0.0 1.0.0
    IntelliSearch.Connector.Exchange.7.0.7 7.0.7
    IntelliSearch.Connector.File.7.0.12 7.0.12
    IntelliSearch.Connector.File.7.0.8 7.0.8
    IntelliSearch.Connector.GDrive.1.0.0 1.0.0
    IntelliSearch.Connector.Websak.7.1.2-BETA 7.1.2-BETA
 
    This will match all components where the name contains "Connector"
.PARAMETER Name
    The name of the component to search for.
    Accepts wildcards.
.PARAMETER InstallDirectory
    The directory to search for components in.
    Default value from ComponentStore in module settings. Usually C:\Program Files\IntelliSearch
.INPUTS
    System.String
.OUTPUTS
    IntelliSearch.Component.Detail
        An object representing an IntelliSearch component.
#>

function Get-ISComponent
{
    [CmdletBinding(ConfirmImpact = 'None')]
    [OutputType()]
    param(
        [Parameter(
            Mandatory = $false,
            Position = 0,
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true
        )]
        [Alias()]
        [String] $Name,

        [Parameter(
            Mandatory = $false,
            Position = 1,
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true
        )]
        [ValidateScript( { Test-Path $_ -PathType Container -IsValid})]
        [Alias()]
        [String] $InstallDirectory = $IS_Settings.ComponentStore
    )

    begin
    {
        $ComponentDetailRegex = "^((?:IntelliSearch|Haive)(?:\.\w+)+)(?:\.)(((?:0|(?:[1-9]\d*)))\.((?:0|(?:[1-9]\d*)))\.((?:0|(?:[1-9]\d*)))(?:-([0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*))?(?:\+([0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*))?)$"
    }

    process
    {   
        Write-Verbose "InstallDirectory: $($InstallDirectory)"

        if (!(Test-Path $InstallDirectory))
        {
            Return
        }

        $InstallDirectoryContents = Get-ChildItem -Path $InstallDirectory -Directory

        foreach ($ComponentDirectory in $InstallDirectoryContents)
        {   
            Write-Verbose "Current component directory: $($ComponentDirectory.FullName)"
            $ComponentDetails = [Regex]::Match($ComponentDirectory.BaseName, $ComponentDetailRegex)
            if ($ComponentDetails.Success -eq $false)
            {
                Write-Verbose "Skipping directory $($ComponentDirectory.FullName) as directory name is not valid"
                continue
            }

            if ($Name -and $ComponentDetails.Value -notlike $Name)
            {
                Write-Verbose "Skipping directory $($ComponentDirectory.FullName) as directory name does not match -Name"
                continue
            }

            $ComponentNupkg = Get-ChildItem -Path $ComponentDirectory.FullName -Recurse | Where-Object {$_.Extension -eq ".nupkg"}
            Write-Verbose "Nupkg count: $($ComponentNupkg.Count)"

            if ($ComponentNupkg.Count -eq 0)
            {
                Write-Verbose "Skipping directory $($ComponentDirectory.FullName) due to it not having a valid nupkg file"
                continue
            }

            [PSCustomObject]@{
                PSTypeName         = "IntelliSearch.Component.Detail"
                ComponentName      = $ComponentDetails.Value
                ComponentType      = $ComponentDetails.Groups[1].Value
                ComponentVersion   = $ComponentDetails.Groups[2].Value
                ComponentDirectory = $ComponentDirectory.FullName
            }
        }


    }

    end
    {

    }
}