2016-09-16 56 views
0

要求:如何在PowerShell輸出中應用顏色

我是PowerShell的初學者。 ps腳本給出的服務細節處於啓動狀態或處於停止狀態,但我的要求是我需要在「天藍色」中將此視爲背景顏色,如果服務正在運行,則以綠色突出顯示,以紅色停止服務顏色。我如何實現它。

對此的幫助非常感謝。

$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 @{ 

‘Host Name’ = $_.Systemname 
‘Service Display Name’ = $_.Displayname 
‘Service Name’ = $_.Name 
‘Start Mode’ = $_.Startmode 
‘Service Account Name’ = $_.Startname 
‘State’ = $_.State 
‘Status’= $_.Status 
} 
} 
} 
} 
} 

$Result | ConvertTo-HTML | Out-File C:\PowerSQL\service.htm 

回答

1

請參閱my answer對此類似的問題。

Communary.ConsoleExtensions [link]可以幫助你

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

上面的命令將colorise文件類型和亮點轉儲文件。

要保存顏色輸出,您必須將其保存爲保留顏色的格式,如RTF或HTML。 Txt(純文本文件)只存儲文本。

下面的代碼會將您的輸出保存爲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 

行:

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

...檢查在HTML輸出爲一個錶行線。

行:

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

...使用正則表達式與綠顏色的字體標籤來代替第二表格單元格的內容。 這是一個非常簡單的正則表達式搜索&替換,只會將第二列的顏色變爲

而這裏的控制檯只有着色的另一種實現方式,基於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][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 

編輯。回答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 
+0

非常感謝TechSpud的回覆。我無法將您的邏輯應用於我的代碼,因此您可以將您的邏輯應用於我的代碼並粘貼到此處 – Franklin

+0

Great Tech Spud。請幫我保留列標題,例如HostName,ServiceDisplayName,ServiceName,StartMode,ServiceAccountName,State,Status以及邊框。 – Franklin

+0

@Franklin你是什麼意思的邊界? HTML邊界?如果您想對錶格進行樣式設置,請運行「Get-Help ConvertTo-Html -Full」。您可以指定樣式表的位置以附加到生成的html。搜索/谷歌的CSS樣式。如果你的意思是在你的屬性中保留空格,那麼用單引號將它們和所有對它們的引用包裝起來。我覺得我已經回答了你的問題,那麼你能把這個標記爲答案嗎?我需要給你一點工作來做你自己:) – TechSpud