tech.guitarrapc.cóm

Technical updates

PowerShellのパイプライン遊び

Hey, Script Guy! Blog にある記事があります。

簡単にいうと、こういうことが PowerShell のワンライナーでできるよー。というものです。

https://dougfinke.com/powershellfordevelopers/NumberOne.png

ただこのワンライナーでは画像のようにはなりません。

どうせなので、画像のようにやってみましょう。

目次

なにが違うの

例はこのようなワンライナーです。

1..8 | ForEach {$n="1" * $_;"{0,9} x {0,9} = {1}" -f $n, ("$n * $n" |iex)};

実際はこのように出力されます。

        1 x         1 = 1
       11 x        11 = 121
      111 x       111 = 12321
     1111 x      1111 = 1234321
    11111 x     11111 = 123454321
   111111 x    111111 = 12345654321
  1111111 x   1111111 = 1234567654321
 11111111 x  11111111 = 123456787654321

f:id:guitarrapc_tech:20140923064014p:plain

赤くなくてさみしいのです。

わんらいなー(棒)

い、いちおうパイプラインで繋ぎ続けてるんだからねっ!

画像通りですね。

f:id:guitarrapc_tech:20140923071627p:plain

色の反転だって簡単ですね。

f:id:guitarrapc_tech:20140923072412p:plain

まとめ

下手に赤くするとこういうことになります。

こわい。*1

1..8 `
| % {
    $n="1" * $_; 
    Write-Host ("{0,9} x {0,9} = " -f $n) -n;
    $x=("$n * $n" | iex) 
    $x `
    | %{
        $n=$_;
        $l=$_ -split "";
        [int]$z=($l.length-1)/2;
        $l `
        | where {$_} `
        | %{$i=1}{
            if($l.length -2 -eq 1)
            {
                Write-Host $_ -Fo Red
            }
            elseif($i -eq $l.length - 2)
            {
                Write-Host $_
            }
            elseif($i -eq $z)
            {
                Write-Host $_ -n -Fo Red
            }
            elseif($i -lt $z)
            {
                Write-Host $_ -n
            }
            elseif($i -gt $z)
            {
                Write-Host $_ -n
            };
            $i++
        }
    }
}

*1:PowerShellで頭の体操