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
  • 'Console'を使用すると、コマンドレット/関数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 に答える