2012-06-07 2 views
1

У меня есть следующий скрипт, который выводит иерархию папок с цветовой кодировкой почтового ящика Exchange пользователя. Он выводит линию красным цветом, если он превышает определенный порог (в этом случае 20 МБ) и серый, если нет.Как выразительно я могу получить выражение PowerShell в формате таблицы?

#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 МБ, мой текст консоли остается красным после его запуска. Этот сценарий предполагает, что исходный текст консоли был Gray. Если это не серый, я изменил текст консоли пользователя. Оба эти параметра очень легко разрешить, если вы не находитесь в контексте выражения 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

Я не думаю, что это возможно. По существу, каждый раз, когда 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) 
} 
+0

Спасибо. Я ценю, что вы очищаете свое оригинальное выражение - теперь это намного более красноречиво. –

Смежные вопросы