Scripts/Get-OctopusRelease.ps1

<#
.Synopsis
   Gets information about Octopus Releases
.DESCRIPTION
   Gets information about Octopus Releases
.EXAMPLE
   Get-OctopusRelease -ProjectName "MyProject"

   Get all the realeases of the project "MyProject"
.EXAMPLE
   Get-OctopusRelease -ProjectName "MyProject" -version 1.0.1,1.0.2

   Get the release realeases 1.0.1 & 1.0.2 of the project "MyProject"
.EXAMPLE
   Get-OctopusRelease -ProjectName "MyProject" -Latest 10

   Get the latest 10 releases of a project. The values allowed for this parameter are 1-30
.LINK
   Github project: https://github.com/Dalmirog/Octoposh
   Wiki: https://github.com/Dalmirog/OctoPosh/wiki
   QA and Cmdlet request: https://gitter.im/Dalmirog/OctoPosh#initial
#>

function Get-OctopusRelease{
    [CmdletBinding(DefaultParameterSetName='none')]    
    Param
    (
        # Release version number
        [Parameter(ValueFromPipelineByPropertyName = $true,ParameterSetName ="ByVersion")]
        [alias("Version")]
        [string[]]$ReleaseVersion = $null,

        # Project Name. Only one Project can be passed to this parameter at a time
        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [alias("Project")]
        [String]$ProjectName,

        # Get latest X releases. The highest number allowed by this parameter is 30
        [ValidateRange(1,30)] 
        [Parameter(ParameterSetName ="Latest")]        
        [int]$Latest,
        
        # When used the cmdlet will only return the plain Octopus resource object
        [switch]$ResourceOnly
    )

    Begin
    {
        $c = New-OctopusConnection        
        $list = @()
        $releases = @()
        $i = 1         
    }
    Process
    {

        Write-Verbose "[$($MyInvocation.MyCommand)] Getting releases [$ReleaseVersion] of project [$ProjectName]"
        
        $Project = Get-OctopusProject -Name $ProjectName -ResourceOnly

            If ($Project){
            If($ReleaseVersion -ne $null){                
                foreach ($V in $ReleaseVersion){                
                    
                    Write-Verbose "[$($MyInvocation.MyCommand)] Getting release: $V"

                    Try{       
                        $r = $c.repository.Projects.GetReleaseByVersion($Project,$v)
                    }

                    #Catch [Octopus.Client.Exceptions.OctopusResourceNotFoundException]{
                    Catch {
                        Write-Error "No releases found for project $($Project.name) with the version number $v"
                        $r = $null
                    }
                
                    If ($r -ne $null){
                        $releases += $r
                    }                                
                }
            }

            Else{
                $releases += ($c.repository.Projects.GetReleases($Project)).items
                If($Latest){
                    Write-Verbose "[$($MyInvocation.MyCommand)] Getting latest $Latest releases of project $($Project.name)"
                    $releases = $releases[0..($Latest -1)]
                }
            }
            
            Write-Verbose "[$($MyInvocation.MyCommand)] Releases found for project $($Project.name): $($releases.count)"     

            If($ResourceOnly){
                $list += $releases
            }

            Else{
                Foreach($release in $releases){

                    Write-Verbose "[$($MyInvocation.MyCommand)] Getting info from release: $($release.version)"

                    Write-Progress -Activity "Getting info from release: $($release.id)" -status "$i of $($releases.count)" -percentComplete ($i / $releases.count * 100)                       
                       
                    $rev = (Invoke-WebRequest -Uri "$env:OctopusURL/api/events?regarding=$($release.Id)" -Method Get -Headers $c.header -Verbose:$false| ConvertFrom-Json).items | ? {$_.category -eq "Created"}
        
                    $obj = [PSCustomObject]@{
                            ProjectName = $Project.name
                            ReleaseVersion = $release.Version
                            ReleaseNotes = $release.ReleaseNotes
                            CreationDate = ($release.assembled).datetime
                            CreatedBy = $rev.Username
                            LastModifiedOn = ($release.LastModifiedOn).datetime
                            LastModifiedBy = $release.LastModifiedBy                
                            Resource = $release                
                        }            

                    $list += $obj       
            
                    $i++
                }
            }

        }        

    }
    End
    {
        If($list.count -eq 0){
            $list = $null
        }
        return $List
    }
}