Тема: PowerShell: календарь
Пример консольного календаря на указанный месяц (для текущего месяца подсвечивается дата).
#requires -version 7
Set-Alias -Name cal -Value Get-Calendar
function Get-Calendar {
[CmdletBinding()]
param(
[Parameter(DontShow)]
[ValidateNotNullOrEmpty()]
[DateTime]$Dummy = (Get-Date),
[Parameter()]
[ValidateRange(1, 12)]
[Alias('m')]
[Int32]$Month = $Dummy.Month,
[Parameter()]
[ValidateRange(1970, 3000)]
[Alias('y')]
[Int32]$Year = $Dummy.Year,
[Parameter()][Alias('i')][Switch]$Invert,
[Parameter()][Alias('v')][Switch]$Vertical
)
begin {
$dfi = (Get-Culture en-US).DateTimeFormat
$arr, $cal = ($dfi.AbbreviatedDayNames -replace '.$'), $dfi.Calendar
$dow = [Int32]$cal.GetDayOfWeek("$Month.1.$Year")
if ($Invert) {
$arr = $arr[1..$arr.Length] + $arr[0]
if (($dow = --$dow) -lt 0) { $dow += 7 }
}
$cap = "`e[35;4m$($dfi.MonthNames[$Month - 1]) $Year`e[0m"
if ($dow -ne 0) {
for ($i = 0; $i -lt $dow; $i++) { $arr += "$([Char]32)" * 2 }
}
$arr += (1..$cal.GetDaysInMonth($Year, $Month)).ForEach{ "$_".PadLeft(2, [Char]32) }
if ($Month -eq $Dummy.Month -and $Year -eq $Dummy.Year) {
$arr[$arr.IndexOf($Dummy.Day)] = "`e[39;7m$($Dummy.Day)`e[0m"
}
}
process {}
end {
$Vertical ? $(
"$([Char]32)" * [Math]::Round((28 - $cap.Length) / 2) + $cap
$i = 0
$seq = (,7 * 6).ForEach{$_ * (++$i)}
for ($i = 0; $i -lt 7; $i++) {
$arr[,$i + $seq] -join [Char]32
$seq = $seq.ForEach{$_ + 1}
}
) : $(
"$([Char]32)" * [Math]::Round((30 - $cap.Length) / 2) + $cap
for ($i = 0; $i -lt $arr.Length; $i += 6) {
$arr[$i..($i + 6)] -join [Char]32
$i++
}
)
}
}
Примеры использования:
cal # календарь на текущий месяц
cal -i # то же, но за начало недели брать понедельник
cal -i -v # что и предыдущее, но календарь отображать вертикально
cal -m 5 -y 2022 -i -v