How to apply colors in powershell output

前端 未结 1 1526
独厮守ぢ
独厮守ぢ 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 "<H2>The result of Get-ChildItem</H2> " -Property Directory,Name,LastWriteTime |
    ForEach-Object {
      if ($_ -like '<tr><td>*') {
        $_ -replace '^(.*?)(<td>.*?</td>)<td>(.*?)</td>(.*)','$1$2<td><font color="green">$3</font></td>$4'
      } else {
        $_
      }
    } | Set-Content "$env:TEMP\ColorDirList.html" -Force
    

    The line:

    if ($_ -like '<tr><td>*') {
    

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

    The line:

    $_ -replace '^(.*?)(<td>.*?</td>)<td>(.*?)</td>(.*)','$1$2<td><font color="green">$3</font></td>$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 "<H2>The result of gwmi win32_service</H2> " `
      -Property HostName,ServiceDisplayName,ServiceName,StartMode,ServiceAccountName,State,Status |
    ForEach-Object {
      if ($_ -like '<tr><td>*') {
        switch ($_) {
          { $_ -like '*<td>Stopped</td>*' } {$color='red'}
          { $_ -like '*<td>Running</td>*' } {$color='green'}
          Default                           {$color='white'}
        }
      $_.Replace('<tr>', "<tr bgcolor=`"$color`">")
      } else {
      $_
      }
    } | Set-Content C:\PowerSQL\service.htm -Force
    
    0 讨论(0)
提交回复
热议问题