programing

Format-Table의 PowerShell 출력 색상을 지정하는 방법

yellowcard 2023. 8. 18. 22:28
반응형

Format-Table의 PowerShell 출력 색상을 지정하는 방법

값이 100MB보다 크면 열 RAM을 빨간색으로 색칠하려고 합니다.

Get-Process | Format-Table @{ Label = "PID"; Expression={$_.Id}},
            @{ Label = "Name"; Expression={$_.Name}},
            @{ Label = "RAM (MB)"; Expression={[System.Math]::Round($_.WS/1MB, 1)}},
            @{ Label = "Responding"; Expression={$_.Responding}}

Enter image description here

Write-Host-nonnewline으로 시도해 보았지만 결과가 잘못되었습니다.

Get-Process | Format-Table @{ Label = "PID"; Expression={$_.Id}},
            @{ Label = "Name"; Expression={$_.Name}},
            @{ Label = "RAM (MB)"; Expression={write-host -NoNewline $([System.Math]::Round($_.WS/1MB, 1)) -ForegroundColor red}},
            @{ Label = "Responding"; Expression={ write-host -NoNewline $_.Responding -fore red}}

Enter image description here

PowerShell 5.1 이상에서는 VT 이스케이프 시퀀스를 사용하여 단일 열에 색상을 추가할 수 있지만 콘솔이 VT 이스케이프 시퀀스를 지원하는 경우에만 가능합니다(예: Windows 10 Fall Creators Update, Linux 또는 Mac, ConEmu와 같은 콘솔 에뮬레이터가 없는 Windows 8은 지원하지 않음).

다음은 ps1xml 파일에서 동일한 형식을 사용할 수 있지만 식에 지정된 형식을 갖는 예제입니다.

dir -Exclude *.xml $pshome | Format-Table Mode,@{
    Label = "Name"
    Expression =
    {
        switch ($_.Extension)
        {
            '.exe' { $color = "93"; break }
            '.ps1xml' { $color = '32'; break }
            '.dll' { $color = "35"; break }
           default { $color = "0" }
        }
        $e = [char]27
       "$e[${color}m$($_.Name)${e}[0m"
    }
 },Length

그리고 결과적으로, 열 너비가 양호해 보이고 이스케이프 시퀀스 문자에 공백이 없습니다.

Screenshot of dir output with colored names

허용된 답변이 올바르지 않습니다. 열에 색상을 지정할 수 있습니다.조건부 열 색상을 가져오는 방법은 쓰기-PSObject를 사용하는 것입니다.

다음은 코드와 설명이 문서화된 몇 가지 멋진 예입니다.

위의 리소스에서:

Write-PSObject $servers -MatchMethod Exact -Column "Manufacture" -Value "HP" -ValueForeColor Yellow -ValueBackColor Red -RowForeColor White -RowBackColor Blue;

enter image description here

Format-Table에 색상 형식을 추가하기 위해 GitHub 문제를 통해 이를 찾았습니다. 이 기능은 PowerShell 개발자들이 언젠가 추가하고자 하는 기능인 것 같습니다.

정규식을 사용하여 에 색상을 지정할 수 있습니다.

filter colorize-row{

    Get-Process | Select-Object Id, Name, WS, Responding | foreach {

        # Print 'red' row if WS greater than 100 MB
        if([System.Math]::Round($_.WS/1MB,1) -match "^([0-9]|[0-9][0-9]|[1-9][0-9]?$|^100$)$"){
            [console]::ForegroundColor="white"; $_;
        } else {
            [console]::ForegroundColor="red"; $_;
        }
    }
}

colorize-row

출력:

Enter image description here

빠른 대답은 할 수 없다는 것입니다.쓰기 호스트를 색상과 함께 사용할 수 있지만 형식 테이블로 보낼 "출력"이 없습니다.

Write-Host의 "출력"은 표준 기능처럼 데이터를 호출자에게 반환하지 않고 콘솔로 직접 전송하는 부작용입니다.

@David Martin의 코멘트와 함께, 흥미로운 패턴 매칭 형식-색상 기능이 있는 링크가 있습니다.

PsWrite 모듈을 설치할 수 있습니다.

쓰기-색상 enter image description here

그는 또한 다른 똑똑한 기능들을 가지고 있습니다.

로그 쓰기 단계 enter image description here

쓰기-진행률 표시줄 색상 enter image description here

예, ANSI 이스케이프 색상을 사용할 수 있으며 다음 색상을 조건부로 지정할 수 있습니다.

Get-Process | Format-Table @{ Label = "PID"; Expression={$_.Id}},
        @{ Label = "Name"; Expression={$_.Name}},
        @{ Label = "RAM (MB)"; Expression={if($_.WS/1MB -gt 100){"$([char]27)[0;31m$([System.Math]::Round($_.WS/1MB, 1))$([char]27)[0m"}else{"$([char]27)[0;32m$([System.Math]::Round($_.WS/1MB, 1))$([char]27)[0m"}}},
        @{ Label = "Responding"; Expression={if($_.Responding -eq $true){"$([char]27)[0;32m$($_.Responding)$([char]27)[0m"}else{"$([char]27)[0;31m$($_.Responding)$([char]27)[0m"}}}

언급URL : https://stackoverflow.com/questions/20705102/how-to-colorise-powershell-output-of-format-table

반응형