🔋

[PowerShell]: 文字列を複数の色で出力する

2022/04/29に公開

はじめに

PowerShellでコンソールに色付きで出力する場合は、Write-Hostで簡単に出来ます。
ただ、1行で複数の色を表示しようとすると少し面倒です。
そこで、簡単に出来そうな関数を考えてみます。

結論

ソース

PowerShell
function getData {
  param (
    [Parameter(Mandatory)][AllowNull()] $data,
    [Parameter(Mandatory)] $default
  )
  if ([string]::IsNullOrEmpty($data)) {
    return $default
  }
  return $data
}

# WriteHostColor data f b
# data: @(@("string", "foregroundColor", "backgroundColor"), @{str="string"; f="foregroundColor"; b="backgroundColor"})
# color: Black, DarkBlue, DarkGreen, DarkCyan, DarkRed, DarkMagenta, DarkYellow, Gray, DarkGray, Blue, Green, Cyan, Red, Magenta, Yellow, White
function WriteHostColor {
  param (
    [Parameter(Mandatory)][Array] $data, # Must Array. no String[].
    [Parameter()][Alias("f")][String] $foregroundColor,
    [Parameter()][Alias("b")][String] $backgroundColor,
    [Alias("n")][switch] $noLineBreak
  )
  # Write-Host ("data={0}({1}), f={2}, b={3}" -f $data, $data.Length, $foregroundColor, $backgroundColor)
  if ([string]::IsNullOrEmpty($foregroundColor)) {
    $foregroundColor = (Get-Host).UI.RawUI.ForegroundColor
  }
  if ([string]::IsNullOrEmpty($backgroundColor)) {
    $backgroundColor = (Get-Host).UI.RawUI.BackgroundColor
  }

  foreach ($item in $data) {
    if ($item.GetType().Name -eq "Hashtable") {
      $s = getData $item.str ""
      $f = getData $item.f $foregroundColor
      $b = getData $item.b $backgroundColor
    }
    elseif ($item.GetType().BaseType.Name -eq "Array") {
      $s = getData $item[0] ""
      $f = getData $item[1] $foregroundColor
      $b = getData $item[2] $backgroundColor
    }
    else {
      $s = getData $item ""
      $f = $foregroundColor
      $b = $backgroundColor
    }
    Write-Host $s -ForegroundColor $f -BackgroundColor $b -NoNewline
  }
  if ($noLineBreak) {
    Write-Host
  }
  else {
    Write-Host ([char]0xA0)
  }
}

使用例

PowerShell
WriteHostColor @(@("first", "red", "blue"), " -> ", @("second", "blue", "red"))
WriteHostColor @(@{str="first"; f="yellow"; b="green"}, " -> ", @{str="second"; f="green"; b="yellow"})
WriteHostColor @("| ", @{str="first"; f="green"; b="yellow"}, " -> ", @("second", "yellow", "green"), " |")
WriteHostColor @("| ", @{str="first"; f="green"; b="yellow"}, " -> ", @("second", "yellow", "green"), " |") "red" "blue"
WriteHostColor @(,@("first", "blue", "red"))
WriteHostColor @(,@("first", "", "red"))
WriteHostColor @(,@("first", "blue", ""))
WriteHostColor @(,@("first", "red"))

要素が1つの2次元配列がよくわからない場合は、自分の記事ですが以下をご覧ください。
https://zenn.dev/bluesilvercat/articles/3f3018bff42a7a

環境

Console
Windows ターミナル
バージョン: 1.12.10983.0
PowerShell
> $PSVersionTable
Name                           Value
----                           -----
PSVersion                      7.2.3
PSEdition                      Core
GitCommitId                    7.2.3
OS                             Microsoft Windows 10.0.22000
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

解説

Write-Host

Write-Hostで色付きの出力する場合は、

PowerShell
Write-Host "string" -ForegroundColor "red" -BackgroundColor "blue"`

などとします。

ForegroundColorBackgroundColorに設定できる色は、

  • "Black"
  • "DarkBlue"
  • "DarkGreen"
  • "DarkCyan"
  • "DarkRed"
  • "DarkMagenta"
  • "DarkYellow"
  • "Gray"
  • "DarkGray"
  • "Blue"
  • "Green"
  • "Cyan"
  • "Red"
  • "Magenta"
  • "Yellow"
  • "White"

です。

コンソールの色を取得する

  • 前景色は、(Get-Host).UI.RawUI.ForegroundColorで取得できる。
  • 背景色は、(Get-Host).UI.RawUI.BackgroundColorで取得できる。

WriteHostColor

引数について

作成したWriteHostColorについて簡単に解説します。

  • 第1引数(-data) : 文字列とその文字列に設定する色を配列に入れて渡す。
  • 第2引数(-foregroundColor or -f) : 明示的に前景色を指定されていない文字列に適応される前景色を渡す。指定されなかった場合は、コンソールの値になる。
  • 第3引数(-backgroundColor or -b) : 明示的に背景色を指定されていない文字列に適応される背景色を渡す。指定されなかった場合は、コンソールの値になる。

第1引数(-data)について

第1引数について詳しく解説します。

  • 第1引数自体は、配列。
  • 配列の要素は、配列, ハッシュテーブル, 文字列のいずれか。
  • 要素を配列にした場合は、@("文字列", "前景色", "背景色")と指定する。
    空文字列を渡すと、前景色の場合は、第2引数の値に、背景色の場合は、第3引数の値になる。
  • 要素をハッシュテーブルにした場合は、@{str="文字列"; f="前景色"; b="背景色"}と指定する。
    空文字列もしくはキーを指定しない場合は、前景色の場合は、第2引数の値に、背景色の場合は、第3引数の値になる。
  • 要素を文字列にした場合は、第2引数と第3引数で指定した色が適用される。

使用例

WriteHostColor @(@("string1", "red", "blue"), @("string2", "blue", "red"))
WriteHostColor @(@{str="string1"; f="red"; b="blue"}, @{str="string2"; f="blue"; b="red"})
WriteHostColor @("string3") "green" "yellow"
WriteHostColor @(@("string1", "red", "blue"), @{str="string2"; f="blue"; b="red"}, "string3") "green" "yellow"
WriteHostColor @(@("string1", "red", "blue"), @{str="string2"; f="blue"; b="red"}, "string3")
WriteHostColor @(@("string1", "", "blue"), @{str="string2"; f="blue"}, "string3") "green" "yellow"

Discussion