Posted in: Základy PowerShellu

Hodiny do PowerShellu

Dnes je to jen malý kousek kódu, který se ovšem může hodit. Na liště OS máme běžně hodiny, ale někdy se může stát, že potřebujeme promítnout někam aktuální čas, ne z nějakého jiného důvodu chceme v konzoli vidět běžící čas. Nyní přidám jednoduché jádro, digitální hodiny. Jednoduchý kód využívající nekonečného cyklu while:

while($true)
{
    cls #vyčištění konzole
    $cas = Get-Date | select Hour, Minute, Second #uložení času do proměnné
    Write-Host $cas.Hour ":" $cas.Minute ":" $cas.Second #výpis času v obvyklém formátu
    Start-Sleep -Seconds 1 #uspání procesu na 1 sekundu
}

Ručičkové hodiny do konzole

Vykreslení ručičkových hodin s pomocí grafických knihoven .NET už na internetu a jde vytvořit v libovolném jazyce s využitím trochy goniometrie. Osobně jsem chtěl simulovat ručičkové hodiny přímo v konzole pomocí vykreslování znaků. Hodiny vykreslují polohu konců ručiček, které se pohybují spíše po nějakém kosém čtverci, nežli po kruhu, protože k vykreslení dochází vypsáním pole 30 x 30 znaků. Stejně jako digitálky výše, čtou čas z operačního systému, ze kterého následně vypočítají x a y souřadnici konce ručičky každé ručičky. Problémem je relativně pomalé překreslování příkazové řádky, takže běh nevypadá úplně hezky, ale jdou a přečíst se nechají 😉

  • kolečko je hodinová ručička
  • + je minutová ručička
  • * je sekundová ručička
function get-sekunda{
    param (
        $s
    )
    #výpočet polohy sekund
    if($s -le 15)
    {
        $y = $s + 15
        $x = $s
        $plocha[$x, $y] = '*'
    }
    elseif(($s -gt 15) -and ($s -le 30))
    {
        $y = 30 - ($s - 15)
        $x = $s
        $plocha[$x, $y] = '*'
    }
    elseif(($s -gt 30) -and ($s -le 45))
    {
        $y = 15 - ($s - 30)
        $x = 30 - ($s - 30)
        $plocha[$x, $y] = '*'
    }
    elseif(($s -gt 45) -and ($s -le 60))
    {
        $y = $s - 45
        $x = 30 - ($s - 30)
        $plocha[$x, $y] = '*'
    }
}

function get-minuta{
    param (
        $m
    )
    #výpočet polohy minut
    if($m -le 15)
    {
        $y = $m + 15
        $x = $m
        $plocha[$x, $y] = '+'
    }
    elseif(($m -gt 15) -and ($m -le 30))
    {
        $y = 30 - ($m - 15)
        $x = $m
        $plocha[$x, $y] = '+'
    }
    elseif(($m -gt 30) -and ($m -le 45))
    {
        $y = 15 - ($m - 30)
        $x = 30 - ($m - 30)
        $plocha[$x, $y] = '+'
    }
    elseif(($m -gt 45) -and ($m -le 60))
    {
        $y = $m - 45
        $x = 30 - ($m - 30)
        $plocha[$x, $y] = '+'
    }
}

function get-hodina{
    param (
        $h
    )
    #převedení na 12 hodin režim
    $h = $h % 12
    #výpočet polohy hodin
    switch($h)
    {
        0 {$plocha[0, 15] = 'o'}
        1 {$plocha[5, 20] = 'o'}
        2 {$plocha[10, 25] = 'o'}
        3 {$plocha[15, 30] = 'o'}
        4 {$plocha[20, 25] = 'o'}
        5 {$plocha[25, 20] = 'o'}
        6 {$plocha[30, 15] = 'o'}
        7 {$plocha[25, 10] = 'o'}
        8 {$plocha[20, 5] = 'o'}
        9 {$plocha[15, 0] = 'o'}
        10 {$plocha[10, 5] = 'o'}
        11 {$plocha[5, 10] = 'o'}
        12 {$plocha[0, 15] = 'o'}
    }
}

$plocha = New-Object 'object[,]' 31,31

while($true)
{
    cls #vyčištění konzole
    $cas = Get-Date | select Hour, Minute, Second #uložení času do proměnné
    #Write-Host $cas.Hour ":" $cas.Minute ":" $cas.Second #výpis času v obvyklém formátu
    #inicialoizace plochy
    for($i = 0; $i -le 30; $i++)
    {
        for($j = 0; $j -le 30; $j++)
        {
            $plocha[$i,$j] = ' ' #uložení mezery do pole plochy
        }
    }
    #nastavení ciferníku
    $plocha[0,15] = '12'
    $plocha[15,30] = '3'
    $plocha[30,15] = '6'
    $plocha[15,0] = '9'
    $plocha[15,15] = '*'
    #výpočet polohy konců ručiček
    get-hodina -h ($cas.Hour) #ručička zobrazená kolečkem
    get-minuta -m $cas.Minute #ručička zobrazení plusem
    get-sekunda -s $cas.Second #ručička zobrazená hvězdičkou
    #vykreslení plochy
    for($i = 0; $i -le 30; $i++)
    {
        for($j = 0; $j -le 30; $j++)
        {
            Write-Host $plocha[$i,$j] -NoNewline
        }
        Write-Host ""
    }
    
    Start-Sleep -Seconds 1 #uspání procesu na 1 sekundu
}
Back to Top