在PowerShell中仍然使用颜色输出重定向

假设我像这样运行msbuild:

function Clean-Sln {
    param($sln)
    MSBuild.exe $sln /target:Clean
}
Clean-Sln c:\temp\SO.sln

在Posh控制台中,输出为彩色.这非常方便 – 只需观察输出即可发现颜色.例如,不重要的消息是灰色的.

我想添加能力将它重定向到这样的地方(简化示例):

function Clean-Sln {
    param($sln)
    MSBuild.exe $sln /target:Clean | Redirect-AccordingToRedirectionVariable
}
$global:Redirection = 'Console'
Clean-Sln c:\temp\SO.sln
$global:Redirection = 'TempFile'
Clean-Sln c:\temp\Another.sln

>如果我使用’Console’,cmdlet / function Redirect-BasedToRedirectionVariable应该输出msbuild消息,其颜色与输出未通过管道输出的方式相同.换句话说 – 它应该保持输出不变.
>如果我使用’TempFile’,Redirect-BasedToRedirectionVariable会将输出存储在临时文件中.

它甚至可能吗?我猜它不是:|
或者您对如何实现目标有任何建议?

可能的方法:

if ($Redirection -eq 'Console) {
  MSBuild.exe $sln /target:Clean | Redirect-AccordingToRedirectionVariable
} else {
  MSBuild.exe $sln /target:Clean | Out-File c:\temp.txt  
}

但是如果你想象可以有很多msbuild调用,那就不太理想了.

不要害羞地告诉我任何新的建议如何应对它;)

任何有关重定向/着色/ outpu的背景信息也是受欢迎的.

(问题不是msbuild特定的,问题涉及任何写入彩色输出的应用程序)

最佳答案 是的,我会避免管道彩色输出.那时,AFAICT,所有颜色信息都丢失了.

我建议在MSBuild上使用/ filelogger和/ noconsolelogger参数,例如:

function Invoke-MSBuild($project, [string[]]$targets, [switch]$logToFile) {
    $OFS = ';'
    $targetArg = if ($targets) {"/t:$targets"} else {''}
    if ($logToFile) {
        msbuild.exe $project $targetArg  /filelogger /noconsolelogger
    }
    else {
        msbuild.exe $project $targetArg 
    }
}

或者你可以做一些更简单的事情:

function Invoke-MSBuild($project, [string[]]$targets, $logFile) {
    $OFS = ';'
    $targetArg = if ($targets) {"/t:$targets"} else {''}
    if ($logFile) {
        msbuild.exe $project $targetArg > $logFile
    }
    else {
        msbuild.exe $project $targetArg 
    }
}
点赞