假设我像这样运行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
}
}