我可以使用格式表中的PowerShell表达式获得多大的表现力



我有以下脚本,用于输出用户 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

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

我认为这是不可能的。 本质上,每次Format-Table读取表达式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)
}

最新更新