您可以利用这样一个事实,即在大多数常见情况下,标准输出通常会流式传输,而且重定向不会忘记初始句柄。因此,样品溶液应
-
将所有句柄重定向到标准句柄(因为它只指向管道)
-
通过检查条目的类型找出其原始句柄
-
重新打印条目(分别在手柄上着色)
在我的测试中,这非常有效:
function Color {
param (
[Parameter(Mandatory)]
[scriptblock]$Command,
[System.ConsoleColor]$OutColor = [System.ConsoleColor]::White,
[System.ConsoleColor]$ErrColor = [System.ConsoleColor]::Red,
[System.ConsoleColor]$WrnColor = [System.ConsoleColor]::Yellow,
[System.ConsoleColor]$VrbColor = [System.ConsoleColor]::Magenta,
[System.ConsoleColor]$InfColor = [System.ConsoleColor]::Blue
)
& $command *>&1 | ForEach-Object {
$PrintColor =
if ($_ -is [System.Management.Automation.ErrorRecord]) { $ErrColor }
elseif ($_ -is [System.Management.Automation.WarningRecord]) { $WrnColor }
elseif ($_ -is [System.Management.Automation.VerboseRecord]) { $VrbColor }
elseif ($_ -is [System.Management.Automation.InformationRecord]) { $InfColor }
else {$OutColor}
Write-Host -ForegroundColor $PrintColor $_
}
}
测试:
Color {
Write-Output OUT;
Write-Error ERR;
Write-Warning WRN;
Write-Verbose VRB;
Write-Information INF;
Write-Host -ForegroundColor Black HOST;
1234
}
输出如下(色盲友好编辑):
OUT // white
ERR // red
WRN // yellow
INF // blue
HOST // blue
1234 // white
附注:
Write-Host
被强行对待为
Information
在这里,这个脚本覆盖了所有的颜色。