Public/Get-ComplianceReport.ps1

# Creates scafolding for checks
function Get-ComplianceReport {
    [CmdletBinding()]
    Param (
        # Name of the report
        [Parameter(
            Mandatory = $true,
            Position = 1
        )]
        [System.String] $Name,
        # Set of checks to evaluate
        [Parameter(
            Mandatory = $true,
            Position = 2
        )]
        [IAComplianceCheck[]] $Checks,
        # Defines if you want to get the IAComplianceReport object
        [Parameter(
            Mandatory = $false
        )]
        [switch] $PassThru = $false,
        # Defines if you want to get the IAComplianceReport object
        [Parameter(
            Mandatory = $false
        )]
        [switch] $Silent = $false
    )
    Begin {
    }
    Process {
        if(!$Silent){
            Write-Host $Name -ForegroundColor Yellow
        }
        $Results = @()
        foreach ($check in $Checks) {
            if(!$Silent){
                Write-Host (" " + $check.Name) -ForegroundColor Yellow
            }
            Invoke-Command -ScriptBlock $check.InputScript | Where-Object {$_ -ne $null} | ForEach-Object {
                if(!$Silent){
                    Write-Host (" " + $_.ToString()) -ForegroundColor Green
                }
                foreach ($rule in $check.Rules) {
                    if($rule.ShouldBeChecked($_)){
                        $RuleCheckResult = [IAComplianceRuleCheckResult]::New($check, $rule, $_, $rule.Check($_))
                        $Results += $RuleCheckResult
                        if ($RuleCheckResult.IsCompliant) {
                            if(!$Silent){
                                Write-Host (" " + $rule.Name) -ForegroundColor DarkGreen
                            }
                        } else {
                            if(!$Silent){
                                Write-Host (" " + $rule.Name) -ForegroundColor DarkRed
                            }
                        }
                    }
                }
            }
        }
        if($PassThru){
            [IAComplianceReport]::New($Name,$Results)
        }
    }
    End {
    }
}