Skip to content

Instantly share code, notes, and snippets.

@akirco
Created August 18, 2023 15:48
Show Gist options
  • Save akirco/5a4f996bebf363a3102131d56ae2b074 to your computer and use it in GitHub Desktop.
Save akirco/5a4f996bebf363a3102131d56ae2b074 to your computer and use it in GitHub Desktop.
how to parse cron exp with powershell
tags categories cover
PowerShell
development
function Parse-CronExpression {
    param (
        [Parameter(Mandatory=$true)]
        [string]$cronExpression
    )

    $cronParts = $cronExpression -split ' '

    if ($cronParts.Length -ne 5) {
        Write-Host "无效的cron表达式。"
        return
    }

    $minute = Parse-CronPart $cronParts[0] 0 59
    $hour = Parse-CronPart $cronParts[1] 0 23
    $dayOfMonth = Parse-CronPart $cronParts[2] 1 31
    $month = Parse-CronPart $cronParts[3] 1 12
    $dayOfWeek = Parse-CronPart $cronParts[4] 0 7

    $parsedExpression = @{
        Minute = $minute
        Hour = $hour
        DayOfMonth = $dayOfMonth
        Month = $month
        DayOfWeek = $dayOfWeek
    }

    return $parsedExpression
}

function Parse-CronPart {
    param (
        [Parameter(Mandatory=$true)]
        [string]$part,
        [Parameter(Mandatory=$true)]
        [int]$minValue,
        [Parameter(Mandatory=$true)]
        [int]$maxValue
    )

    $parsedPart = @()

    if ($part -eq '*') {
        $parsedPart = $minValue..$maxValue
    }
    elseif ($part -match '^\d+$') {
        $parsedPart = $part -as [int]
    }
    elseif ($part -match '^\*/(\d+)$') {
        $step = $Matches[1] -as [int]
        $parsedPart = $minValue..$maxValue | Where-Object { $_ % $step -eq 0 }
    }
    elseif ($part -match '^(\d+)-(\d+)$') {
        $start = $Matches[1] -as [int]
        $end = $Matches[2] -as [int]
        $parsedPart = $start..$end
    }
    elseif ($part -match '^(\d+),(\d+)(,\d+)*$') {
        $parsedPart = $part -split ',' | ForEach-Object { $_ -as [int] }
    }
    else {
        Write-Host "无效的cron部分: $part"
    }

    return $parsedPart
}

# 使用示例
$cronExpression = "0 0 * * *"
$parsedExpression = Parse-CronExpression $cronExpression

# 输出结果
$parsedExpression
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment