PowerShell/Docs/list-calendar.md
2023-08-06 21:36:33 +02:00

248 lines
6.7 KiB
Markdown

*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/06/2023 21:36:12)*