How to apply colors in powershell output

前端 未结 1 1537
独厮守ぢ
独厮守ぢ 2020-12-22 07:59

Requirement :

I am beginner in powershell. Below ps script is giving the details about services are in started state or in stopped state but my requirement is I need

1条回答
  •  春和景丽
    2020-12-22 08:16

    See my answer to similar question to this.

    Communary.ConsoleExtensions [link] might help you

    Invoke-ColorizedFileListing C:\Windows -m *.dmp
    

    The above command will colorise file types and highlight dump files.

    To save a color output, you would have to save to a format that preserves color, like RTF, or HTML. Txt (plain text file) only stores text.

    The code below will save your output as an html file.

    $time = (Get-Date).AddYears(-2)
    Get-ChildItem -Recurse | Where-Object {$_.LastWriteTime -lt $time} |
    Select Directory,Name,LastWriteTime |
    ConvertTo-Html -Title "Services" -Body "

    The result of Get-ChildItem

    " -Property Directory,Name,LastWriteTime | ForEach-Object { if ($_ -like '*') { $_ -replace '^(.*?)(.*?)(.*?)(.*)','$1$2$3$4' } else { $_ } } | Set-Content "$env:TEMP\ColorDirList.html" -Force

    The line:

    if ($_ -like '*') {
    

    ...checks for line in the html output that is a table row.

    The line:

    $_ -replace '^(.*?)(.*?)(.*?)(.*)','$1$2$3$4'
    

    ...uses a RegEx to replace the 2nd table cell contents with a font tag with the color green. This is a very simple RegEx search & replace that will only color the 2nd column.

    And here's another implementation of console only coloring, based on this link

    $linestocolor = @(
    'CSName         Version        OSArchitecture'
    '------         -------        --------------'
    'BENDER         6.1.7601       64-bit        '
    'LEELA          6.1.7601       64-bit        '
    'FRY            6.1.7600       64-bit        '
    'FARNSWORTH     6.1.7601       32-bit        '
    )
    
    
    # http://www.bgreco.net/powershell/format-color/
    function Format-Color {
        [CmdletBinding()]
        param(
          [Parameter(ValueFromPipeline=$true,Mandatory=$true)]
          $ToColorize
        , [hashtable]$Colors=@{}
        , [switch]$SimpleMatch
        , [switch]$FullLine
        )
      Process {
        $lines = ($ToColorize | Out-String).Trim() -replace "`r", "" -split "`n"
        foreach($line in $lines) {
          $color = ''
          foreach($pattern in $Colors.Keys){
            if     (!$SimpleMatch -and !$FullLine -and $line -match "([\s\S]*?)($pattern)([\s\S]*)") { $color = $Colors[$pattern] }
            elseif (!$SimpleMatch -and $line -match $pattern) { $color = $Colors[$pattern] }
            elseif ($SimpleMatch -and $line -like $pattern) { $color = $Colors[$pattern] }
          }
          if ($color -eq '') { Write-Host $line }
            elseif ($FullLine -or $SimpleMatch) { Write-Host $line -ForegroundColor $color }
            else {
            Write-Host $Matches[1] -NoNewline
            Write-Host $Matches[2] -NoNewline -ForegroundColor $color
            Write-Host $Matches[3]
          }
        }
      }
    }
    
    $linestocolor | Format-Color -Colors @{'6.1.7600' = 'Red'; '32-bit' = 'Green'}
    
    # doesn't work...
    # (Get-ChildItem | Format-Table -AutoSize) | Format-Color -Colors @{'sql' = 'Red'; '08/07/2016' = 'Green'}
    # does work...
    Format-Color -ToColorize (Get-ChildItem | Format-Table -AutoSize) -Colors @{'sql' = 'Red'; '08/07/2016' = 'Green'}
    
    return
    

    EDIT. to answer the OPs request

    $Result = @()
    foreach($server in Get-Content C:\PowerSQL\List.txt)
    {
      $Services=gwmi win32_service -computername $server | where {$_.Name -like ‘*SQL*’}
      if(!(Test-Connection -Cn $server -BufferSize 16 -Count 1 -ea 0 -quiet))
        {“Problem still exists in connecting to $server”}
      else {
        $services | ForEach {
          If ($_)
            { $Result += New-Object PSObject -Property @{
            HostName = $_.Systemname
            ServiceDisplayName = $_.Displayname
            ServiceName = $_.Name
            StartMode = $_.Startmode
            ServiceAccountName = $_.Startname
            State = $_.State
            Status = $_.Status
            }
          }
        }
      }
    } 
    
    $Result | ConvertTo-HTML `
      -Title "Services" `
      -Body "

    The result of gwmi win32_service

    " ` -Property HostName,ServiceDisplayName,ServiceName,StartMode,ServiceAccountName,State,Status | ForEach-Object { if ($_ -like '*') { switch ($_) { { $_ -like '*Stopped*' } {$color='red'} { $_ -like '*Running*' } {$color='green'} Default {$color='white'} } $_.Replace('', "") } else { $_ } } | Set-Content C:\PowerSQL\service.htm -Force

    0 讨论(0)
提交回复
热议问题