4

假设我像这样运行 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
  • 如果我使用“控制台”,则 cmdlet/函数Redirect-AccordingToRedirectionVariable应该以与未通过管道输出相同的方式输出带有颜色的 msbuild 消息。换句话说 - 它应该保持输出不变。
  • 如果我使用“TempFile”,Redirect-AccordingToRedirectionVariable会将输出存储在临时文件中。

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

可能的解决方案:

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

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

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


也欢迎任何有关重定向/着色/输出的背景信息。
(问题不是特定于 msbuild,问题涉及任何编写彩色​​输出的应用程序)

4

1 回答 1

3

是的,我会避免管道彩色输出。那时,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 
    }
}
于 2010-05-07T04:22:44.020 回答