我可以在Powershell中转义颜色代码,这样我就不需要使用-ForeGroundColor了吗?

时间:2016-04-05 13:46:35

标签: powershell

是否可以使用一些颜色代码转义字符,以便我不需要提及-ForeGroundColor参数?

所以而不是:

write-Host "Hello World!" -ForegroundColor:Blue

我可以这样做:

write-Host "Hello \{somethinghere to denote from this point it will be in BLUE color} World!" 

4 个答案:

答案 0 :(得分:4)

这是一个解决PowerShell不支持ANSI转义码的解决方案。

这应该允许您指定用作分隔符的字符

function Write-Colored {
    param(
        [Parameter(Mandatory=$True, Position=1)]
        [string]$text,
        [Parameter(Mandatory=$True, Position=2)]
        [string]$delimiter
    )


    $i = $text.Split($delimiter)

    function pr ([string]$item, [System.ConsoleColor]$color){
        Write-Host $item.Substring(1) -fore $color -NoNewline
    }

    foreach ($item in $i){
        $colorcode = $item.ToCharArray()[0]

        switch($colorcode){
            "b" { pr $item Blue }
            "r" { pr $item Red }
            "g" { pr $item Green }
            "y" { pr $item Yellow }
            default { Write-Host $item -NoNewline }
        }
    }
}

在切换块中,添加您想要与某种颜色对应的简写代码。我选择了单个字符,因为它更容易验证,结果如下:

输入:

$text = "#rmy #gname #yis #bchris"

输出类似

的内容

image

请记住,在使用此辅助函数时,您需要使用

`n

用于在文字中添加换行符,或根据需要在函数底部添加write-host ""

编辑:修改后的代码更可靠

答案 1 :(得分:3)

我将采取的一个非常基本的方法是创建一个专用函数来查找包含颜色信息的特殊字符串。这在验证方面没有多少,但它可以作为概念的证明,假设我知道你想要做什么。

Function Write-HostFormatted{
    param(
        [parameter(Mandatory=$true)]
        $text,
        [parameter(Mandatory=$true)]
        [alias("DefaultColour")]
        [System.ConsoleColor]$Colour
    )

    $text -split "({[^}]+})" | ForEach-Object{
        If($_ -match "({[^}]+})"){
            # We need to change the colour
            $Colour = $_.Trim("{}")
        } else {
            # Output text using the current colour
            Write-Host -NoNewline $_ -ForegroundColor $Colour
        }
    }
    # Add the trailing newline
    Write-Host ""
}

然后你可以这样称呼它:

Write-HostFormatted "This text is{Blue} Blue!{Red} Now this text is Red" White

Output example

如果这是你真正感兴趣的东西,我会重写它,因为我认为还有很大的改进空间。重点是你必须创建一个自定义函数来做你想要的。

答案 2 :(得分:0)

您可以使用$ PSDefaultParameterValues设置默认颜色。

$PSDefaultParameterValues['Write-Host:ForegroundColor'] = 'Blue'

答案 3 :(得分:0)

实际上(至少现在),不需要任何解决方法,因为Powershell 支持ANSI转义代码。

所以这可以解决问题:

svcs ftp

如果您不打算使用转义序列,则可以定义一些变量来简化生活:

Write-Host "Hello $([char]27)[34mWorld"

出色的post显示更多内容,并包括最常用的颜色代码列表。

我可以补充一下,在旧版本的Windows(Windows Server 2016)中,会忽略某些扩展代码,例如粗体,而颜色仍然可以正常工作。