Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment appliquer des couleurs dans la sortie powershell

Voir ma réponse à une question similaire à celle-ci.

Communary.ConsoleExtensions [lien] pourrait vous aider

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

La commande ci-dessus coloriera les types de fichiers et mettra en surbrillance les fichiers de vidage.

Pour enregistrer une sortie couleur, vous devez enregistrer dans un format qui préserve la couleur, comme RTF ou HTML. Txt (fichier texte brut) ne stocke que du texte.

Le code ci-dessous enregistrera votre sortie sous forme de fichier html.

$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

La ligne :

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

...vérifie la ligne dans la sortie html qui est une ligne de tableau.

La ligne :

$_ -replace '^(.*?)(<td>.*?</td>)<td>(.*?)</td>(.*)','$1$2<td><font color="green">$3</font></td>$4'

... utilise un RegEx pour remplacer le contenu de la deuxième cellule du tableau par une balise de police de couleur verte. Il s'agit d'une recherche et d'un remplacement RegEx très simples qui ne coloreront que la 2e colonne .

Et voici une autre implémentation de console uniquement coloration, basée sur ce lien

$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][email protected]{}
    , [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

MODIFIER. pour répondre à la demande des OP

$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