假设我像这样运行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
Redirect-AccordingToRedirectionVariable
应该输出msbuild消息,其颜色与输出未通过管道输出的方式相同。换句话说 - 它应该保持输出不变。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调用,那就不太理想了。
不要害羞地告诉我任何新的建议如何应对它;)
欢迎任何有关redirections / coloring / outpu的背景信息。
(问题不是msbuild特定的,问题涉及任何写入彩色输出的应用程序)
答案 0 :(得分:2)
是的,我会避免使用彩色输出。那时,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
}
}