Câu trả lời:
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à:
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
và $_
đầ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.
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'