🔋
[PowerShell]: 文字列を複数の色で出力する
はじめに
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次元配列がよくわからない場合は、自分の記事ですが以下をご覧ください。
環境
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"`
などとします。
ForegroundColor
とBackgroundColor
に設定できる色は、
- "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
) : 明示的に背景色を指定されていない文字列に適応される背景色を渡す。指定されなかった場合は、コンソールの値になる。
-data
)について
第1引数(第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