Public/Register-DirkScheduledTask.ps1

function Register-DirkScheduledTask {
    [CmdletBinding()]
    Param (
        [Parameter(Mandatory = $true)]
        [System.Management.Automation.PSCredential]
        [System.Management.Automation.Credential()]
        $ScheduledTaskCredential,

        [Parameter(Mandatory = $false)]
        [string]$JobName,

        [Parameter(ParameterSetName = "daily", Mandatory = $false)]
        [switch]$Daily,

        [Parameter(ParameterSetName = "hourly", Mandatory = $false)]
        [switch]$Hourly,

        [Parameter(ParameterSetName = "5min", Mandatory = $false)]
        [switch]$Every5Minutes
    )

    BEGIN {
        $VerbosePrefix = "Install-Dirk:"
    }

    PROCESS {
        ###########################################################################
        # Setup Scheduled Task
        # TODO: make this compatible for cron?

        # Verify $env:DirkRoot
        try {
            $ToddPath = Join-Path -Path $env:DirkRoot -ChildPath 'Todd'
            $ToddPathExists = Test-Path -Path $ToddPath
        } catch {
            $PSCmdlet.ThrowTerminatingError([HelperProcessError]::throwCustomError(1001, $env:DirkRoot))
        }

        $ActionParams = @{}
        $ActionParams.Execute = 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe'
        $ActionParams.Argument = '-ExecutionPolicy Bypass -Command "& ' + (Join-Path -Path $ToddPath -ChildPath "Todd.ps1")
        if ($JobName) {
            $ActionParams.Argument += " -JobName $JobName"
        }
        $ActionParams.Argument += '"'

        $Action = New-ScheduledTaskAction @ActionParams

        $TriggerParams = @{}
        switch ($PsCmdlet.ParameterSetName) {
            'daily' {
                $TriggerParams.Daily = $true
                $TriggerParams.At = '1am'
            }
            'hourly' {
                $TriggerParams.Once = $true
                $TriggerParams.RepetitionInterval = New-TimeSpan -Hours 1
                #$TriggerParams.RepetitionDuration = ([System.TimeSpan]::MaxValue)
                $CurrentDateTime = Get-Date
                $TriggerParams.At = $CurrentDateTime.AddMinutes( - ($CurrentDateTime.Minute % 60) + 60).AddSeconds( - ($CurrentDateTime.Second % 60))
            }
            '5min' {
                $TriggerParams.Once = $true
                $TriggerParams.RepetitionInterval = New-TimeSpan -Minutes 5
                #$TriggerParams.RepetitionDuration = ([System.TimeSpan]::MaxValue)
                $CurrentDateTime = Get-Date
                $TriggerParams.At = $CurrentDateTime.AddMinutes( - ($CurrentDateTime.Minute % 5) + 5).AddSeconds( - ($CurrentDateTime.Second % 60))
            }
        }

        $Trigger = New-ScheduledTaskTrigger @TriggerParams

        $TaskParams = @{}
        $TaskParams.Action = $Action
        $TaskParams.Trigger = $Trigger
        $Task = New-ScheduledTask @TaskParams

        $RegisterParams = @{}
        $RegisterParams.TaskName = 'Dirk'
        if ($JobName) {
            # did this so that we can create multiple tasks with different schedules
            $RegisterParams.TaskName += ' - ' + $JobName
        }
        $RegisterParams.InputObject = $Task
        $RegisterParams.User = $ScheduledTaskCredential.UserName
        $RegisterParams.Password = $ScheduledTaskCredential.GetNetworkCredential().Password
        $RegisterParams.TaskPath = 'Lockstep'
        Register-ScheduledTask @RegisterParams
    }

    END {
    }
}