Script: *list-calendar.ps1*
========================

Lists calendar elements, either a single month or an entire year.

Parameters
----------
```powershell
PS> ./list-calendar.ps1 [[-Month] <Int32>] [[-Year] <Int32>] [<CommonParameters>]

-Month <Int32>
    If specified, will limit output to a single month with this numeral value.
    
    Required?                    false
    Position?                    1
    Default value                (Get-Date).Month
    Accept pipeline input?       false
    Accept wildcard characters?  false

-Year <Int32>
    If specified, will output an entire year.
    
    Required?                    false
    Position?                    2
    Default value                (Get-Date).Year
    Accept pipeline input?       false
    Accept wildcard characters?  false

[<CommonParameters>]
    This script supports the common parameters: Verbose, Debug, ErrorAction, ErrorVariable, WarningAction, 
    WarningVariable, OutBuffer, PipelineVariable, and OutVariable.
```

Example
-------
```powershell
PS> ./list-calendar
Lists the calendar for current month.

```

Example
-------
```powershell
PS> ./list-calendar 2013
Lists the calendar for 2013.

```

Example
-------
```powershell
PS> ./list-calendar 04 2011
Lists the calendar for April, 2011.

```

Example
-------
```powershell
PS> ./list-calendar 7
Lists the calendar for July of this year.

```

Notes
-----
Author: Markus Fleschutz | License: CC0

Related Links
-------------
https://github.com/fleschutz/PowerShell

Script Content
--------------
```powershell
<#
.SYNOPSIS
	Lists the calendar 
.DESCRIPTION
	Lists calendar elements, either a single month or an entire year.
.PARAMETER Month
	If specified, will limit output to a single month with this numeral value.
.PARAMETER Year
	If specified, will output an entire year.
.EXAMPLE
	PS> ./list-calendar
	Lists the calendar for current month.
.EXAMPLE
	PS> ./list-calendar 2013
	Lists the calendar for 2013.
.EXAMPLE
	PS> ./list-calendar 04 2011
	Lists the calendar for April, 2011.
.EXAMPLE
	PS> ./list-calendar 7
	Lists the calendar for July of this year.
.LINK
	https://github.com/fleschutz/PowerShell
.NOTES
	Author: Markus Fleschutz | License: CC0
#>

param([int]$Month = (Get-Date).Month, [int]$Year = (Get-Date).Year)

function Print-Month ($month, $year) {
    $firstDayOfMonth = Get-Date -month $month -day 1 -year $year
    $lastDayOfMonth = (Get-Date -month $firstDayOfMonth.AddMonths(1).Month -day 1 -year $firstDayOfMonth.AddMonths(1).Year).AddDays(-1)
    
    $header = (Get-Date $firstDayOfMonth -Format MMMM) + " " + $firstDayOfMonth.Year
    Write-Host
    Write-Host ((" " * (($daysLine.Length - $header.Length) / 2)) + $header)
    Write-Host $daysLine
    
    for ($day = $firstDayOfMonth; $day -le $lastDayOfMonth; $day = $day.AddDays(1)) {
        if ($day.day -eq 1) {
            Write-Host (" " * 3 * [int](Get-Date $day -uformat %u)) -NoNewLine
        }
        
        Write-Host ((Get-Date $day -Format dd).ToString()) -NoNewLine 
        Write-Host " " -NoNewLine
        
        if ($day.DayOfWeek -eq "Saturday") {
            Write-Host
        }
    }
    
    if ($lastDayOfMonth.DayOfWeek -ne "Saturday") {
        Write-Host
    }

    Write-Host
}

function Print-Year($year) {

    Write-Host
    
    for($month = 1; $month -le 12; $month += 3) {
        $header = ""
        
        for ($i = $month; $i -lt $month + 3; $i++) {
            $tempHeader = (Get-Date -month $i -Format MMMM) + " " + $year.ToString()
            $header += ((" " * (($daysLine.Length - $tempHeader.Length) / 2)) + $tempHeader + (" " * (($daysLine.Length - $tempHeader.Length) / 2)))
            $header += "  "
        }
        
        Write-Host $header
        Write-Host (($daysLine + "  ") * 3)
        
        $dayCounts = (1, 1, 1)
        $i = 0

        while ($dayCounts[0] -le (Get-Date -day 1 -month ($month + 1) -year $year).AddDays(-1).day -or `
               $dayCounts[1] -le (Get-Date -day 1 -month ($month + 2) -year $year).AddDays(-1).day -or `
               $dayCounts[2] -le (Get-Date -day 1 -month (($month + 3) % 12) -year $year).AddDays(-1).day) {

            $dayOfMonth = $dayCounts[$i]
            $dayCounts[$i]++
            $dayOffset = [int](Get-Date -day 1 -month ($month + $i) -year $year -uformat %u)
            
            if ($dayOfMonth -eq 1) {
                Write-Host (" " * 3 * $dayOffSet) -NoNewLine
            }
                
            if ($dayOfMonth -le (Get-Date -day 1 -month ((($i + $month) % 12) + 1) -year $year).AddDays(-1).day) {
                $currentDay = (Get-Date -day $dayOfMonth -month ((($i + $month - 1) % 12) + 1) -year $year)

                Write-Host ((Get-Date -month ($i + $month) -day $dayOfMonth -year $year -Format dd).ToString()) -NoNewLine 
                Write-Host " " -NoNewLine
            }
            else {
                Write-Host "   " -NoNewLine
            }
            
            if ((($dayOfMonth + $dayOffset) % 7) -eq 0) {
                $i = ($i + 1) % 3
                Write-Host "  " -NoNewLine
                
                if ($i -eq 0) {
                    Write-Host
                }
            }
        }
        
        Write-Host
        $dayCounts = (1, 1, 1)
    }
}

function Find-WeekDayMultiple ($year, $month, $dayOfWeek, $multiple) {
    $result = Get-Date -Year $year -Month $month -Day 1
    $multipleCount = 0

    do {
        if ($result.DayOfWeek -eq $dayOfWeek) {
            $multipleCount++
        }

        $result = $result.AddDays(1)

        if ($result.Month -ne $month) {
            throw "Could not find weekday multiple."
        }
    }
    while ($multipleCount -lt $multiple)

    return $result.AddDays(-1)
}

function Find-LastWeekDay ($year, $month, $dayOfWeek) {
    $result = $dayCounter = Get-Date -Year $year -Month $month -Day 1

    while ($dayCounter.Month -eq $month) {
        if ($dayCounter.DayOfWeek -eq $dayOfWeek) {
            $result = $dayCounter
        }
        $dayCounter = $dayCounter.AddDays(1)
    }
    return $result
}

try {
	Set-Variable -name daysLine -option Constant -value "Su Mo Tu We Th Fr Sa "

	if ($year -lt 0) { throw "Year parameter must be greater than 0" }
	if ($month -lt 0) { throw "Month parameter must be between 1 and 12" }

	if (($month -gt 12) -and ($year -eq (Get-Date).Year)) {
	    $year = $month
	    $month = 0
	} elseif (($month -gt 12) -and ($year -ne (Get-Date).Year)) {
	    throw "Month parameter must be between 1 and 12"
	}
	if ($month -ne 0) {
	    Print-Month $month $year
	} else {
	    Print-Year $year
	}
	exit 0 # success
} catch {
	"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
	exit 1
}
```

*(generated by convert-ps2md.ps1 using the comment-based help of list-calendar.ps1 as of 08/15/2024 09:50:49)*
