Public/Install-ISComponent.ps1

function ModuleRoot
{
    $MyInvocation.ScriptName | Split-Path -Parent
}

$PublicCmdlets = Join-Path (ModuleRoot | Split-Path -Parent) "Public"
$PrivateCmdlets = Join-Path (ModuleRoot | Split-Path -Parent) "Private"
. $PublicCmdlets\Get-ISComponent.ps1
. $PublicCmdlets\Invoke-ISNuGetCommand.ps1

<#
.SYNOPSIS
    Installs a component from nuget based on name
.DESCRIPTION
    The Install-ISComponent cmdlet will install a nuget package by package name.
.PARAMETER Name
    List of package names to install.
.PARAMETER InstallDirectory
    The directory to install the package to.
    Defaults to the ComponentStore setting. Usually C:\Program Files\IntelliSearch.
.PARAMETER PreRelease
    Flag to allow pre-release packages.
.PARAMETER Version
    Specifies version of package to install.
.PARAMETER Source
    Specifies NuGet source to install from. All enabled sources will be checked if not set.
.EXAMPLE
    C:\PS> Install-ISComponent -Name "IntelliSearch.Server.CrawlerManager"
 
    ComponentName ComponentVersion
    ------------- ----------------
    IntelliSearch.Server.CrawlerManager.6.0.0 6.0.0
 
    This will install the latest version of the IntelliSearch.Server.CrawlerManager component.
.EXAMPLE
    C:\PS> Install-ISComponent -Name "IntelliSearch.Server.CrawlerManager" -Version "7.1.9" -Source "IntelliSearch"
 
    ComponentName ComponentVersion
    ------------- ----------------
    IntelliSearch.Server.CrawlerManager.7.1.9 7.1.9
 
    This will install the 7.1.9 version of the IntelliSearch.Server.CrawlerManager component from IntelliSearch nuget sources.
.EXAMPLE
    C:\PS> Install-ISComponent -Name "IntelliSearch.Server.CrawlerManager" -PreRelease
 
    ComponentName ComponentVersion
    ------------- ----------------
    IntelliSearch.Server.CrawlerManager.6.0.0-Beta.13 6.0.0-Beta.13
 
    This will install the latest pre-release version of the IntelliSearch.Server.CrawlerManager component.
.INPUTS
    System.String
.OUTPUTS
    IntelliSearch.Component.Detail
        An object representing an IntelliSearch component.
#>

function Install-ISComponent
{
    [CmdletBinding(ConfirmImpact = 'Medium')]
    [OutputType()]
    param(
        [Parameter(
            Mandatory = $true,
            Position = 0,
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true
        )]
        [ValidateNotNull()]
        [ValidateNotNullOrEmpty()]
        [Alias()]
        [String[]] $Name,

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

        [Parameter(
            Mandatory = $false,
            Position = 2,            
            ValueFromPipelineByPropertyName = $true
        )]
        [ValidateNotNull()]
        [ValidateNotNullOrEmpty()]
        [Alias()]
        [String] $Version,

        [Parameter(
            Mandatory = $false,
            Position = 3,            
            ValueFromPipelineByPropertyName = $true
        )]
        [ValidateNotNull()]
        [ValidateNotNullOrEmpty()]
        [Alias()]
        [String] $Source,

        [Parameter(
            Mandatory = $false,
            ValueFromPipelineByPropertyName = $true
        )]
        [Alias()]
        [switch] $PreRelease
    )

    begin
    {
        #region Set up NuGet
        if ($Source)
        {
            $NugetSources = Invoke-ISNuGetCommand -Action "sources" -Arguments @{ 'Format' = "Short"; '-NonInteractive' = $null}
            if ($NugetSources | Select-String -Pattern $Source)
            {
                $NuGetArguments = @{
                    'enable'          = $null
                    'Name'            = $Source
                    '-NonInteractive' = $null
                }
                Invoke-ISNuGetCommand -Action "sources" -Arguments $NugetArguments | Out-Null
            }
        }
        #endregion Set up NuGet
    }

    process
    {
        foreach ($aName in $Name)
        {
            $NuGetArguments = @{
                $aName            = $null
                '-NonInteractive' = $null
                'OutputDirectory' = $InstallDirectory                
            }
            
            if ($Prerelease)
            {
                $NugetArguments.Add("-PreRelease", $null)
            }

            if ($Version)
            {
                $NugetArguments.Add("Version", $Version)
            }

            if ($Source)
            {
                $NugetArguments.Add("Source", $Source)
            }
    
            # Execute the built command
            Write-Verbose -Message ("Attempting to install {0} with NuGet" -f $aName)
            $NugetResult = Invoke-ISNuGetCommand -Action "install" -Arguments $NuGetArguments -ErrorAction:Stop

            foreach ($nugetLine in $NugetResult)
            {
                Write-Verbose $nugetLine
            }

            switch -regex ($NugetResult)
            {
                "(?:Added package ')(?<InstalledName>.*)(?:' to folder)"
                {
                    Write-Verbose "Package installed"
                    $InstalledName = $Matches.InstalledName
                }
                '(?:Package \")(?<InstalledName>.*)(?:\" is already installed.)'
                {
                    Write-Verbose "Package already installed."
                    $InstalledName = $Matches.InstalledName
                }
                Default
                {
                    Write-Error "NuGet output unknown. Could not find the installed package." -ErrorAction:Stop
                }
            }

            Write-Verbose "Found package name: $($InstalledName)"
            Get-ISComponent -Name $InstalledName
        }
    }

    end
    {
    }
}