powershell 在ScriptBlock中未正确设置前景色

qmelpv7a  于 2023-10-18  发布在  Shell
关注(0)|答案(1)|浏览(139)

编辑:我面临的问题来自ADO管道,我有一个并行执行的ps1脚本。我想将前景色设置为绿色,但当我在ScriptBlock中设置时,代码无法工作

$color=[System.ConsoleColor]"Green"
$MainScriptblock = {
    Param($Repo,$CloningPath,$GitURL,$SourceBranch,$DestinationBranch,$ReleaseTag,$modulepath,$color)       
Write-Host "*****************************************************************" -ForegroundColor $color

}

foreach ($Repository in $ReposToBranch) {           
$job = Start-Job -Name $Repository -InitializationScript $InitScriptblock -ScriptBlock $MainScriptblock -ArgumentList $Repository,$Global:CloningPath,$GitURL, $SourceBranch, $DestinationBranch,$ReleaseTag,$modulepath,$color;
}

我尝试使用Microsoft.PowerShell.Utility\Write-Host,但没有任何区别
我看到了这篇文章,它的实现与我的相似。How to use a variable ForegroundColor with write-host onto Start-job
我的方法有什么问题吗

3yhwsihp

3yhwsihp1#

问题

您的问题与 * 作业 * 无关,它与 *CI/CD环境 *(您的情况下是Azure DevOps管道)中PowerShell的使用相关,或者更一般地说,与调用 *PowerShell CLI *(Windows PowerShell为powershell.exe,PowerShell(Core)7+为pwsh)**和 * 捕获其输出 * 相关。
在这种情况下,所有输出都是不变的 * 字符串化 *,在此期间,Write-Host的着色当前(从PowerShell(Core)7.3.x开始)总是 * 丢失 *。
一个简单的方法来说明PowerShell内部的问题:

# Due to capturing the output (piping to another command), the
# coloring is lost.
powershell.exe -c 'Write-Host -ForegroundColor Green green!' | Write-Output

GitHub issue #20171建议 * 保留 * 颜色,这将需要 * 自动 * 嵌入ANSI/VT escape sequences,对应于输出文本中的-Foreground/-Background参数,如下所示 * 手动 *。

解决方法

正如Santiago所指出的,你必须自己嵌入ANSI/VT转义序列,而不是使用Write-Host-ForegroundColor/-BackgroundColor参数**:
Windows PowerShell 中:

Write-Host "$([char] 27)[32m******$([char] 27)[m"

PowerShell (Core) 7+中,您可以更方便地使用$PSStyle首选项变量:

# PS v7.2+ only
Write-Host "$($PSStyle.Foreground.Green)******$($PSStyle.Reset)"

相关问题