DSCResources/PowerPlans/PowerPlans.schema.psm1

configuration PowerPlans
{
    param
    (
        [Parameter()]
        [ValidateSet('On','Off')]
        [string]
        $Hibernate,

        [Parameter()]
        [hashtable[]]
        $Plans,

        [Parameter()]
        [hashtable[]]
        $Settings
    )

    Import-DscResource -ModuleName PSDesiredStateConfiguration
    Import-DscResource -ModuleName DSCR_PowerPlan

    if( -not [string]::IsNullOrWhiteSpace($Hibernate) )
    {
        Script 'pwrplan_hibernate'
        {
            TestScript = {
                $val = Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Power' -Name 'HibernateEnabled' -ErrorAction SilentlyContinue

                Write-Verbose "Expected hibernate mode: $using:Hibernate"

                if ($null -ne $val -and $null -ne $val.HibernateEnabled )
                {
                    Write-Verbose "Current hibernate mode: $($val.HibernateEnabled)"
                    
                    if( ($using:Hibernate -eq 'On' -and $val.HibernateEnabled -gt 0) -or 
                        ($using:Hibernate -eq 'Off' -and $val.HibernateEnabled -eq 0) )
                    { 
                        return $true
                    }
                }
                return $false
            }
            SetScript = {
                Write-Verbose "Set Hibernate mode: $using:Hibernate"
                powercfg /HIBERNATE $using:Hibernate          
            }
            GetScript = { return @{result = 'N/A'}}
        }        
    }

    foreach ($pwrPlan in $Plans)
    {
        # Remove Case Sensitivity of ordered Dictionary or Hashtables
        $pwrPlan = @{}+$pwrPlan

        if (-not $pwrPlan.ContainsKey('Ensure'))
        {
            $pwrPlan.Ensure = 'Present'
        }

        $executionName = "pwrplan_$($pwrPlan.GUID -replace '[{}\-\s]','')"

        (Get-DscSplattedResource -ResourceName cPowerPlan -ExecutionName $executionName -Properties $pwrPlan -NoInvoke).Invoke($pwrPlan)
    }

    foreach ($pwrSetting in $Settings)
    {
        # Remove Case Sensitivity of ordered Dictionary or Hashtables
        $pwrSetting = @{}+$pwrSetting

        $executionName = "pwrsetting_$($pwrSetting.PlanGuid -replace '[{}\-\s]','')_$($pwrSetting.SettingGuid -replace '[{}\-\s]','')"

        (Get-DscSplattedResource -ResourceName cPowerPlanSetting -ExecutionName $executionName -Properties $pwrSetting -NoInvoke).Invoke($pwrSetting)
    }
}