MSEndpointMgr / IntuneAppFactory

Intune App Factory automates Win32 application packaging in Intune.
https://msendpointmgr.com/intune-app-factory
MIT License
32 stars 12 forks source link

Get-EvergreenAppItem fails when applications has no filter options #18

Open PZan opened 7 months ago

PZan commented 7 months ago

I'm trying to package GIMP, but there's only one installer available for download in Evergreen and hence has no need for filtering.

Get-EvergreenAppItem has the FilterOptions parameter set to mandatory and therefore will fail when attempting to retrieve GIMP data. Edit: Or actually when I think of it, it would rather be the ValidateNotNullOrEmpty attribute that's causing the failure, as the pipeline would actually supply an empty value for the parameter input.

Perhaps you should add some logics to the function in order to make it work in this scenario as well and allow for FilterOptions to be voluntary.

PZan commented 7 months ago

I've got it working by modifying the function Get-EvergreenAppItem (line #63-ish):

function Get-EvergreenAppItem {
    param (
        [parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [string]$AppId,

        [parameter(Mandatory = $false)]
        [ValidateNotNullOrEmpty()]
        [System.Object[]]$FilterOptions
    )
    # Construct array list to build the dynamic filter list
    if ( $FilterOptions ) {
        $FilterList = New-Object -TypeName "System.Collections.ArrayList"

        # Process known filter properties and add them to array list if present on current object
        if ( $FilterOptions.Architecture) {
            $null = $FilterList.Add("`$PSItem.Architecture -eq ""$($FilterOptions.Architecture)""")
        }
        if ( $FilterOptions.Platform) {
            $null = $FilterList.Add("`$PSItem.Platform -eq ""$($FilterOptions.Platform)""")
        }
        if ( $FilterOptions.Channel) {
            $null = $FilterList.Add("`$PSItem.Channel -eq ""$($FilterOptions.Channel)""")
        }
        if ( $FilterOptions.Type) {
            $null = $FilterList.Add("`$PSItem.Type -eq ""$($FilterOptions.Type)""")
        }
        if ( $FilterOptions.InstallerType) {
            $null = $FilterList.Add("`$PSItem.InstallerType -eq ""$($FilterOptions.InstallerType)""")
        }
        if ( $FilterOptions.Language) {
            $null = $FilterList.Add("`$PSItem.Language -eq ""$($FilterOptions.Language)""")
        }
        if ( $FilterOptions.Edition ) {
            $null = $FilterList.Add("`$PSItem.Edition -eq ""$($FilterOptions.Edition )""")
        }
        if ( $FilterOptions.Release ) {
            $null = $FilterList.Add("`$PSItem.Release -eq ""$($FilterOptions.Release )""")
        }
        if ( $FilterOptions.ImageType ) {
            $null = $FilterList.Add("`$PSItem.ImageType -eq ""$($FilterOptions.ImageType )""")
        }

        # Construct script block from filter list array
        $FilterExpression = [scriptblock]::Create(($FilterList -join " -and "))

        # Get the evergreen app based on dynamic filter list
        $EvergreenApp = Get-EvergreenApp -Name $AppId | Where-Object -FilterScript $FilterExpression
    } else {
        $EvergreenApp = Get-EvergreenApp -Name $AppId
    }
    # Handle return value
    return $EvergreenApp
}

and then on line #279-ish in Get-EvergreenAppItem.ps1:


switch ($App.AppSource) {
    "Winget" {
        $AppItem = Get-WindowsPackageManagerItem -AppId $App.AppId
    }
    "Evergreen" {
        if ( $null -ne $($App.FilterOptions) ) {
            $AppItem = Get-EvergreenAppItem -AppId $App.AppId -FilterOptions $App.FilterOptions
        } else {
            $AppItem = Get-EvergreenAppItem -AppId $App.AppId
        }
    }
    "StorageAccount" {
        $AppItem = Get-StorageAccountAppItem -StorageAccountName $App.StorageAccountName -ContainerName $App.StorageAccountContainerName
    }
}
NickolajA commented 6 months ago

Cool - good catch! This makes total sense. I'll add this to the upcoming 1.1.0 version that I've been working on in the past months. Thanks for sharing!

NickolajA commented 6 months ago

Coded into 1.1.0 now, awaiting further testing.