Helpers/Invoke-AutonanceContainer.ps1


function Invoke-AutonanceContainer
{
    [CmdletBinding()]
    param
    (
        # Autonance container to execute.
        [Parameter(Mandatory = $true)]
        [PSTypeName('Autonance.Container')]
        $Container
    )

    $repeat      = $Container.Repeat
    $repeatCount = 1

    do
    {
        # Block info
        if ($repeat)
        {
            Write-Autonance '' -Type Info
            Write-Autonance "$($Container.Type) $($Container.Name) (Repeat: $repeatCount)" -Type Container
        }
        else
        {
            Write-Autonance '' -Type Info
            Write-Autonance "$($Container.Type) $($Container.Name)" -Type Container
        }

        # It's a container, so increment the level
        $Script:AutonanceLevel++

        # Get all items to execute
        $items = & $Container.ScriptBlock

        # Invoke all
        foreach ($item in $items)
        {
            # Inherit the credentials to all sub items
            if ($null -eq $item.Credential -and $null -ne $Container.Credential)
            {
                $item.Credential = $Container.Credential
            }

            if ($item.PSTypeNames -contains 'Autonance.Task')
            {
                Invoke-AutonanceTask -Task $item
            }
            elseif ($item.PSTypeNames -contains 'Autonance.Container')
            {
                Invoke-AutonanceContainer -Container $item
            }
            else
            {
                Write-Warning "Unexpected Autonance task or container object: [$($item.GetType().FullName)] $item"
            }
        }

        # Check repeat
        if ($repeat)
        {
            if ($Container.RepeatCount -ne 0)
            {
                if ($repeatCount -ge $Container.RepeatCount)
                {
                    $repeat = $false
                }
            }

            if ($null -ne $Container.RepeatCondition)
            {
                $repeatCondition = & $Container.RepeatCondition

                if (!$repeatCondition)
                {
                    $repeat = $false
                }
            }

            if ($Container.RepeatInquire)
            {
                # Prepare the choices
                $repeatInquireChoices = New-Object -TypeName 'Collections.ObjectModel.Collection[Management.Automation.Host.ChoiceDescription]'
                $repeatInquireChoices.Add((New-Object Management.Automation.Host.ChoiceDescription -ArgumentList '&Repeat', 'Repeat all child tasks'))
                $repeatInquireChoices.Add((New-Object Management.Automation.Host.ChoiceDescription -ArgumentList '&Continue', 'Continue with next task'))

                # Query the desired choice from the user
                do
                {
                    $repeatInquireResult = $Host.UI.PromptForChoice('Repeat', "Do you want to repeat $($Container.Type) $($Container.Name)?", $repeatInquireChoices, -1)
                }
                while ($repeatInquireResult -eq -1)

                # Check the result and quit the execution, if necessary
                if ($repeatInquireResult -eq 1)
                {
                    $repeat = $false
                }
            }
        }

        # Increment repeat count
        $repeatCount++

        # Container has finished, decrement the level
        $Script:AutonanceLevel--
    }
    while ($repeat)
}