Có thể tô màu đầu ra grep trong powershell?


2

Tôi muốn chạy một ứng dụng java trên windows nhưng tô màu một số dòng đầu ra khác màu nền và màu nền trước dựa trên văn bản phù hợp.

Điều này có thể với Windows powershell? Làm thế nào tôi sẽ đi về làm điều đó?

Câu trả lời:


1
  • Các ngắn câu trả lời chỉ đơn giản là không có .

  • Các Dài Câu trả lời là bất cứ điều gì có thể , nhưng ...

Thật không may, bất kỳ hoạt động tô màu và chuỗi trong PowerShell là một PITA hoàng gia. Lý do là các thiết bị đầu cuối bảng điều khiển Windows bên ngoài đang sử dụng cách riêng để tô màu vào / ra và không sử dụng các chuỗi thoát để tô màu. * [Xem ghi chú!] Điều này (AFAIK) luôn yêu cầu sử dụng Write-Host. Vì vậy, bất kỳ hoạt động màu nào cũng sớm trở nên phản tác dụng vì chúng thường yêu cầu kỹ thuật Windows mở rộng , để xử lý đầu ra quá sớm và không thể dễ dàng lưu trữ màu trong một biến chuỗi.

Dù bằng cách nào, đây là một giải pháp hữu ích hơn để làm nổi bật các cài đặt không an toàn ExecutionPolicy . (Về cơ bản là một sửa đổi hoạt động của câu trả lời của Antony.) Ở đây, nó đang sử dụng một tiêu chí tìm kiếm đặt trước (dưới dạng một mảng), nhưng có lẽ có thể được sửa đổi và chuyển đổi thành một ColorGrep(<string>)chức năng phù hợp .

# To get the ExecutionPolicy List
Function Get-MyPolicy {
    $ZZ_EPOL = ((Get-ExecutionPolicy -List) | Format-Table -hideTableHeader @{Label="ExePol"; e={"        {0,-16}: {1,-20}" -f $_.Scope, $_.ExecutionPolicy}})
    $ZZ_EPOL
}

# Colorize the unsafe Execution Policies
Function ColorMatch {
    Process {
        $polkeys = @("Bypass","Unrestricted")
        foreach ($line in $_) {
            foreach ($i in $polkeys) {
                $res =''
                If ($line -match $i) {
                    $iPosition  = $line.IndexOf($i)         # start position of "grep phrase"
                    $iLength    = $i.Length                 # length of grep phrase
                    $iEnd       = $iPosition + $iLength     # end of grep phrase
                    $LineLength = $line.Length              # length of line
                    $iComplete  = $LineLength - $iEnd       # length of characters to complete the line

                    $res  = (Write-Host $line.Substring(0, $iPosition) -NoNewline)
                    $res += (Write-Host $line.Substring($iPosition, $iLength) -ForegroundColor Red -NoNewline)
                    $res += (Write-Host $line.Substring($iEnd, $iComplete) -NoNewline)
                    Write-Host $res
                    break  # There's only one match per line
                }
            } # END foreach 2
            If (($res -eq '') -and ($line -ne '')) { 
                Write-Host $line 
            } 
        } # END foreach 1
    } # END process
}

Để chạy cái này, sử dụng:
Get-MyPolicy | Out-String -stream | ColorMatch

Đầu ra là:

nhập mô tả hình ảnh ở đây

Cuối cùng, nếu bạn cần truyền vào các chuỗi khác, bạn có thể cần phân tích cú pháp $line$_đầu vào để tách các chuỗi thành các dòng. Vì kịch bản giả định rằng chỉ có một trận đấu trên mỗi dòng. Đó là lý do tại sao Out-Stringđược sử dụng.

LƯU Ý:
Gần đây Windows 10đã thêm một số khả năng màu sắc . Tuy nhiên, có hàng tá giải pháp bảng điều khiển bên thứ 3 đã thực hiện điều này.


1

Như trong ví dụ đơn giản của tôi dưới đây, bạn có thể thử kết hợp đầu ra và tô màu cho phù hợp.

$Items = @("Find","Matching","Item")
$colItem = "Matching"

foreach ($i in $Items) {

    if ($i -match $colItem){
      write-host  $i -foregroundcolor magenta -BackgroundColor yellow}
     else {write-host $i}
}

--Biên tập--

Đưa nó đi xa hơn với một ví dụ hoạt động thô (chỉ được kiểm tra bằng ps4) "grepping" đầu ra lệnh ghép ngắn Trợ giúp cho Phe PowerShell. sẽ cung cấp thông số màu cho cụm từ đầu tiên trên mỗi dòng

 Function Coloured-Output {
    Process { 
       $i = "PowerShell"
       If ($_ -match $i){
          $iPosition = $_.IndexOf($i)       # start position of "grep phrase"
          $iLength = $i.Length              # length of grep phrase
          $iEnd = $iPosition + $iLength     # end of grep phrase
          $LineLength = $_.Length           # length of line
          $iComplete = $LineLength - $iEnd  # length of characters to complete the line
          Write-Host $_.Substring(0,$iPosition) -NoNewline
          Write-Host $_.Substring($iPosition,$iLength) -Foregroundcolor Blue -BackgroundColor cyan -NoNewline
          Write-Host $_.Substring($iEnd,$iComplete)
       }
       else {write-host $_ }
    } # End of Process
} # End of Function

$SplitThis = Get-Help

   $SplitThis -split ("`n")  | Out-String -stream | Coloured-Output

########## EDITED Với giải pháp tốt nhất của người khác #############

Giải pháp tốt nhất https://ridicpered.com/2018/03/14/highlight-words-in-powershell-console/ Đây là một câu trả lời tốt hơn và toàn diện hơn cho câu hỏi ban đầu so với giải pháp làm việc của riêng tôi.

    Function Trace-Word
{
    [Cmdletbinding()]
    [Alias("Highlight")]
    Param(
            [Parameter(ValueFromPipeline=$true, Position=0)] [string[]] $content,
            [Parameter(Position=1)] 
            [ValidateNotNull()]
            [String[]] $words = $(throw "Provide word[s] to be highlighted!")
    )

Begin
{

    $Color = @{       
                0='Yellow'      
                1='Magenta'     
                2='Red'         
                3='Cyan'        
                4='Green'       
                5 ='Blue'        
                6 ='DarkGray'    
                7 ='Gray'        
                8 ='DarkYellow'    
                9 ='DarkMagenta'    
                10='DarkRed'     
                11='DarkCyan'    
                12='DarkGreen'    
                13='DarkBlue'        
    }

    $ColorLookup =@{}

    For($i=0;$i -lt $words.count ;$i++)
    {
        if($i -eq 13)
        {
            $j =0
        }
        else
        {
            $j = $i
        }

        $ColorLookup.Add($words[$i],$Color[$j])
        $j++
    }

}
Process
{
$content | ForEach-Object {

    $TotalLength = 0

    $_.split() | `
    Where-Object {-not [string]::IsNullOrWhiteSpace($_)} | ` #Filter-out whiteSpaces
    ForEach-Object{
                    if($TotalLength -lt ($Host.ui.RawUI.BufferSize.Width-10))
                    {
                        #"TotalLength : $TotalLength"
                        $Token =  $_
                        $displayed= $False

                        Foreach($Word in $Words)
                        {
                            if($Token -like "*$Word*")
                            {
                                $Before, $after = $Token -Split "$Word"


                                #"[$Before][$Word][$After]{$Token}`n"

                                Write-Host $Before -NoNewline ; 
                                Write-Host $Word -NoNewline -Fore Black -Back $ColorLookup[$Word];
                                Write-Host $after -NoNewline ; 
                                $displayed = $true                                   
                                #Start-Sleep -Seconds 1    
                                #break  
                            }

                        } 
                        If(-not $displayed)
                        {   
                            Write-Host "$Token " -NoNewline                                    
                        }
                        else
                        {
                            Write-Host " " -NoNewline  
                        }
                        $TotalLength = $TotalLength + $Token.Length  + 1
                    }
                    else
                    {                      
                        Write-Host '' #New Line  
                        $TotalLength = 0 

                    }

                        #Start-Sleep -Seconds 0.5

    }
    Write-Host '' #New Line               
}
}
end
{    }

}

#Trace-Word -content (Get-Content iis.log) -words "IIS", 's', "exe", "10", 'system'

Thật không may, chức năng đó chỉ phù hợp với lần xuất hiện đầu tiên của "PowerShell".
not2qubit

@ not2qubit đã thêm phân tách bị thiếu cho mỗi dòng, bây giờ chỉ là lần xuất hiện đầu tiên trên mỗi dòng.
Antony
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.