1

Тема: 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