1

ユーザーの Exchange メールボックスの色分けされたフォルダー階層を出力する次のスクリプトがあります。特定のしきい値 (この場合は 20 MB) を超えている場合は赤で、そうでない場合は灰色で線を出力します。

#Get Folder Size Breakdown to Table with Color Coding
get-mailbox $username |
Get-MailboxFolderStatistics |
ft @{
        Name="Name"
        Expression=
        {
            $prefix=""
            foreach($c in $_.FolderPath.ToCharArray())
            {
                if($c -eq '/'){$prefix+='-'}
            }
            if($_.FolderSize -gt 20MB)
            {
                $Host.UI.RawUI.ForegroundColor = "Red"
            } else
            { 
                $Host.UI.RawUI.ForegroundColor = "Gray"
            }
            $prefix + $_.Name
        }
    },
    FolderSize,
    FolderandSubfolderSize

このスクリプトにはいくつかの問題があります。

最後に処理されたフォルダーが 20 MB を超えると、実行後にコンソール テキストが赤色のままになります。このスクリプトは、元のコンソール テキストが灰色であると想定しています。灰色でない場合は、ユーザーのコンソール テキストを変更しました。どちらも、format-table式のコンテキストにいない場合は非常に簡単に解決できますが、この特定のケースでこれらの問題を解決できるかどうかは、一生わかりません。これが私が試したことの要点ですが、うまくいきません。(実際には、約 20 の異なるバリエーションを試しました)。

get-mailbox $username |
Get-MailboxFolderStatistics |
ft @{
        Name="Name"
        Expression=
        {
            $prefix=""
            $originalColor = $Host.UI.RawUI.ForegroundColor
            foreach($c in $_.FolderPath.ToCharArray())
            {
                if($c -eq '/'){$prefix+='-'}
            }
            if($_.FolderSize -gt 20MB)
            {
                $Host.UI.RawUI.ForegroundColor = "Red"
            }
            $prefix + $_.Name
            $Host.UI.RawUI.ForegroundColor = $originalColor
        }
    },
    FolderSize,
    FolderandSubfolderSize

注: これの目的は、最終的にこれを 1 行に圧縮することです。パイプラインを開始する前に変数を保存し、パイプラインが終了した後に色を復元できることはわかっていますが、それでは楽しさ/悪化が取り除かれます。このパイプラインの基本構造を変更せずにこれを達成できるかどうかについては、もっと興味があります。

4

1 に答える 1

1

これは不可能だと思います。基本的に、フォアグラウンド カラーFormat-Tableの Expression を読み取るたびに変更されます。Nameしかし、Format-Tableおそらくその式から値をすぐには書き出さないので、式の色をリセットすることはできません。

パイプラインをラップする必要があると思います:

$originalColor = $Host.UI.RawUI.ForegroundColor

get-mailbox $username |
Get-MailboxFolderStatistics |
ft @{
        Name="Name"
        Expression=
        {
            $prefix = " " * (($_.FolderPath -split '/').Length)
            $Host.UI.RawUI.ForegroundColor = if($_.FolderSize -gt 20MB) { "Red" } else { $originalColor }
            $prefix + $_.Name
        }
    },
    FolderSize,
    FolderandSubfolderSize

$Host.UI.RawUI.ForegroundColor = $originalColor

別のオプションは、各列の最大サイズを見つけてWrite-Hostから書き出すために使用する独自の書式設定コードを作成することです。

$stats = get-mailbox $username |
    Get-MailboxFolderStatistics |

$nameMaxWidth = 0
$sizeMaxWidth = 0
$subFolderSizeMaxWidth = 0
$stats | ForEach-Object {

    if( $_.Name.Length -gt $nameMaxWidth )
    {
        $nameMaxWidth = $_.Name.Length + (($_.FolderPath -split '/').Length - 1)
    }

    $sizeWidth = $_.FolderSize.ToString().Length
    if( $sizeWidth -gt $sizeMaxWidth )
    {
        $sizeMaxWidth = $sizeWidth
    }

    $subSizeWidth = $_.FolderAndSubFolderSize.ToString().Length
    if( $subSizeWidth -gt $subFolderSizeMaxWidth )
    {
        $subFolderSizeMaxWidth = $subSizeWidth
    }
}

$stats | ForEach-Object {
    $colorParam = @{ }
    if( $_.FolderSize -gt 20MB )
    {
        $colorParam.ForegroundColor = 'Red'
    }

    $prefix = ' ' * (($_.FolderPath -split '/').Length - 1)
    Write-Host ("{0}{1,$nameMaxWidth}" -f $prefix,$_.Name) -NoNewLine @colorParam
    Write-Host "  " -NoNewline
    Write-Host ("{0,-$sizeMaxWidth}" -f $_.FolderSize) -NoNewLine
    Write-Host "  " -NoNewLine
    Write-Host ("{0,-$subFolderSizeMaxWidth}" -f $_.FolderAndSubFolderSize)
}
于 2012-06-07T22:15:27.937 に答える