2012-06-07 2 views
1

사용자의 Exchange 사서함에 색으로 구분 된 폴더 계층 구조를 출력하는 다음 스크립트가 있습니다. 특정 임계 값 (이 경우 20MB) 이상이면 빨간색을 출력하고 그렇지 않으면 회색을 출력합니다.Format-Table에서 PowerShell Expression을 표현하는 방법은 무엇입니까?

#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 

이 스크립트에는 몇 가지 문제가 있습니다.

처리 된 마지막 폴더가 20MB보다 큰 경우 콘솔이 실행 된 후 콘솔 텍스트가 빨간색으로 유지됩니다. 이 스크립트는 원래 콘솔 텍스트가 회색 인 것으로 가정합니다. 회색이 아니라면 사용자의 콘솔 텍스트를 변경했습니다. 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-TableName에 대한 표현식을 읽을 때마다 전경색이 변경됩니다. 그러나 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

감사합니다. 제 원래 표현을 정리 해줘서 고맙습니다. 지금은 훨씬 더 간결합니다. –

관련 문제