PowerShellでクリスマスツリー!

この記事はPowerShell Advent Calendar 2013の20日目の記事です!


▼ PSAC2013.ps1

function Twinkle-Star {
    [CmdletBinding(DefaultParameterSetName="p1")]
    param(
        [Parameter(Position=1,Mandatory=$true,ParameterSetName="p1")]
        [string]$Aa,
        [Parameter(Position=2,ParameterSetName="p1")]
        [int]$Interval=1,
        [Parameter(Position=3,ParameterSetName="p1")]
        [int]$Twinkle=10,
        [Parameter()]
        [Alias("V")]
        [char]$Value="★"
    )
    begin {
        if ($Host.Name -ne 'ConsoleHost') {
            Write-Host -ForegroundColor Red "$($Host.Name) では実行できません><"

            $path = &{ $myInvocation.ScriptName}
            $param = "-Aa `"`"`"$Aa`"`"`" -Interval $Interval -Twinkle $Twinkle -Value $Value"
            Start-Process powershell -ArgumentList "Import-Module $path; Twinkle-Star $param; Read-Host"        
            exit -1
        }
        Clear-Host
    }
    process {
     #▼ $Value(★)の位置を取得
        $Aa.ToCharArray() | 
            ForEach-Object -Begin {$obj = @()} -Process {
                Write-Host -NoNewline $_
                if ($_ -eq $Value) { 
                    $x = $Host.UI.RawUI.CursorPosition.X-2
                    $y = $Host.UI.RawUI.CursorPosition.Y
                    $obj += [pscustomobject]@{x=$x; y=$y}    
                } elseif ($_ -eq "☆") {
                    Write-Host -NoNewline `b`b$_ -ForegroundColor Yellow #☆の色
                }
        }

        #▼ カーソルの移動
        function Move-Cursor([int]$x, [int]$y) {
            $coordinate = New-Object System.Management.Automation.Host.Coordinates($x, $y)
            $Host.UI.RawUI.CursorPosition = $coordinate
        }

        #▼ $Value(★)の色を変更
        function Change-Color() {
            $obj | 
                ForEach-Object {
                    $random = $(Get-Random -Minimum 0 -Maximum 15)
                    $color = [ConsoleColor]::GetNames([System.ConsoleColor])[$random]
                    Move-Cursor $_.x $_.y
                    Write-Host -NoNewline $Value -ForegroundColor $color
                }

            Move-Cursor 0 19
            Start-Sleep $interval
        }

        #▼ $Twinkle(10)回キラキラ><
        1..$Twinkle | ForEach-Object { Change-Color }    
    }
    end {
        Write-Host "`t`tMerry Chirstmas!!`t`t`n" -ForegroundColor Red -BackgroundColor DarkGreen
        Start-Sleep 5
    }
}

<#
#▼ コマンド構文
Twinkle-Star [-Aa]  [[-Interval]  [-Twinkle] ] [-Value ]

#▼ パラメータ
-Aa:アスキーアート。
-Interval:キラキラの間隔秒数。デフォルト1秒。
-Twinkle:キラキラする回数。デフォルト10回。
-Value:キラキラする文字。デフォルト★。
#>

▼ powershell.exe

Import-Module .\PSAC2013.ps1 -Force

$christmasTree = @"
`t
        +  ・  +
          ゚。:。゚  +
      *  ・‥☆‥・
        + 。゚▲゚。  *
       +  ▲▲
          ▲▲★ +
        * ▲★彡▲  *
      十  ★彡▲▲★
        彡▲▲★∴▲ 十
        ▲▲★∴▲▲★
       ▲★∴▲▲★彡▲
       ★∴▲▲★彡▲▲★
      ▲▲▲★彡▲▲★∴▲
          ┃┃
         ■■■■
          ■■■
          ■■■
`t
"@
Twinkle-Star -Aa $christmasTree #-Interval 1 -Twinkle 10 -Value ★

▼ 参考サイト様

「もう~いくつ寝ると~♪クリスマス~♪」ですね!
クリスマスは、朝から晩まで大好きなPowerShellタンとイチャイチャしたいと思います><
それはもう1日中イチャイチャです><とっても楽しみです><><><。
ではでは皆様、よいクリスマスを!

ご清覧ありがとうございました!!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>