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

注意:这样做的目的是最终将其压缩为单线。我知道我可以在启动管道之前存储变量并在管道完成后恢复颜色,但这会带来乐趣/恶化。我更好奇是否可以在不改变此管道的基本结构的情况下完成此操作。

4

1 回答 1

1

我不认为这是可能的。本质上,每次读取前景色Format-Table的表达式都会改变。NameFormat-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 回答