一点色盲问题:
[ConsoleColor]::DarkRed
(还有红色)对我来说几乎是看不见的。我必须选择文本才能阅读它。
我一直在 PowerShell 中配置一些东西以使内容更具可读性:
$host.PrivateData.ErrorForegroundColor = 'Yellow'
非常酷,但是当然有些应用程序、库、工具等会做这样的事情:
Write-Host "Error!" -ForegroundColor DarkRed
所以基本上我想用其他东西覆盖
[ConsoleColor]::DarkRed
。我一直在研究反射,但似乎不可能。
有什么办法可以实现这个目标吗?
您可以利用 PowerShell 的 命令优先级 并定义一个名为 Write-Host
的自定义
函数,它会隐藏内置 cmdlet,并使用修改后的参数调用后者。
$PROFILE
文件中,则对 Write-Host
的所有(非模块限定)调用将有效地将 -ForegroundColor Red
和 -ForegroundColor DarkRed
转换为 -ForegroundColor Yellow
- 根据需要进行调整。
注:
function global:Write-Host {
<#
.ForwardHelpTargetName Write-Host
.ForwardHelpCategory Cmdlet
#>
[CmdletBinding(HelpUri = 'https://go.microsoft.com/fwlink/?LinkID=2097137', RemotingCapability = 'None')]
param(
[Parameter(Position = 0, ValueFromPipeline = $true, ValueFromRemainingArguments = $true)]
[Alias('Msg', 'Message')]
[System.Object]
${Object},
[switch]
${NoNewline},
[System.Object]
${Separator},
[System.ConsoleColor]
${ForegroundColor},
[System.ConsoleColor]
${BackgroundColor})
begin {
# Translate -ForegroundColor Red / DarkRed to a different color of choice.
if (($fgColor = $PSBoundParameters.ForegroundColor) -and $fgColor -in 'Red', 'DarkRed') {
$PSBoundParameters.ForegroundColor = 'Yellow'
}
$wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Microsoft.PowerShell.Utility\Write-Host', [System.Management.Automation.CommandTypes]::Cmdlet)
$scriptCmd = { & $wrappedCmd @PSBoundParameters }
$steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin)
$steppablePipeline.Begin($PSCmdlet)
}
process {
try {
$steppablePipeline.Process($_)
}
catch {
$PSCmdlet.ThrowTerminatingError($_)
}
}
end {
try {
$steppablePipeline.End()
}
catch {
$PSCmdlet.ThrowTerminatingError($_)
}
}
}