2016-04-05 6 views
3

Ist es möglich, ein Farbcode-Escapezeichen zu verwenden, so dass ich den Parameter "ForeGroundColor" nicht angeben muss?Kann ich einen Farbcode in Powershell umgehen, damit ich nicht -ForeGroundColor verwenden muss?

Also statt:

write-Host "Hello World!" -ForegroundColor:Blue 

Kann ich so etwas wie:

write-Host "Hello \{somethinghere to denote from this point it will be in BLUE color} World!" 
+2

Möchten Sie die Farbe im mittleren Text dann ändern? Das kann gemacht werden, aber Sie müssen immer noch die Parameter einstellen und müssen "-NoNewLine" verwenden. Eine Funktion wäre die Antwort, aber ich bin mir sicher, dass dir das aufgefallen ist. – Matt

+0

Sie denken wahrscheinlich an ANSI-Escape-Sequenzen. AFAIK PowerShell unterstützt diese nicht. [This] (http://stackoverflow.com/a/30178582/1630171) könnte jedoch helfen. –

+0

@AnsgarWiechers Das ist ein schöner Fund. Code benötigt aber ein Update .... all diese 'if's .... – Matt

Antwort

3

Hier ist eine Lösung, die Powershell umgeht, die ANSI-Escape-Codes nicht unterstützt.

erlauben Dies sollte Sie, welche Zeichen, das Sie als Trennzeichen verwenden, um anzugeben

function Write-Colored { 
    param(
     [Parameter(Mandatory=$True, Position=1)] 
     [string]$text, 
     [Parameter(Mandatory=$True, Position=2)] 
     [string]$delimiter 
    ) 


    $i = $text.Split($delimiter) 

    function pr ([string]$item, [System.ConsoleColor]$color){ 
     Write-Host $item.Substring(1) -fore $color -NoNewline 
    } 

    foreach ($item in $i){ 
     $colorcode = $item.ToCharArray()[0] 

     switch($colorcode){ 
      "b" { pr $item Blue } 
      "r" { pr $item Red } 
      "g" { pr $item Green } 
      "y" { pr $item Yellow } 
      default { Write-Host $item -NoNewline } 
     } 
    } 
} 

im Schalterblock, hinzufügen, was eine Abkürzung Codes, die Sie zu einer bestimmten Farbe entsprechen soll. Ich nahm einzelne Zeichen, da es einfacher gegen zu validieren, und die Ergebnisse sind wie folgt:

Eingang:

$text = "#rmy #gname #yis #bchris" 

gibt so etwas wie

image

nur im Auge behalten, während Sie Diese Hilfsfunktion müssen Sie verwenden

`n 

zum Hinzufügen von Zeilenumbrüchen zu Ihrem Text oder fügen Sie am Ende Ihrer Funktion einen write-host "" hinzu, falls gewünscht.

Bearbeiten: Überarbeiteter Code ein wenig zuverlässiger zu sein

+0

Vielen Dank! Ich habe Ihre Funktion benutzt und funktioniert so, wie ich es erwartet habe und sehr einfach anzuwenden. – pencilCake

+0

Unter allen Problemumgehungen war dies das einfachste und am besten geschriebene. – VillasV

0

können Sie $ PSDefaultParameterValues ​​verwenden die Standardfarbe einzustellen.

$PSDefaultParameterValues['Write-Host:ForegroundColor'] = 'Blue' 
+0

Havent hat dich schon eine Weile gesehen.Ich vermute, dass der OP dies dynamischer ändern möchte, aber zuerst muss er hineinspielen. – Matt

3

Ein sehr einfacher Ansatz, den ich dafür nehmen würde wäre eine bestimmte Funktion zu machen, die für spezielle Zeichenkette sucht, die Farbinformationen enthalten. Dies hat nicht viel Validierung, aber es funktioniert als Beweis für das Konzept, vorausgesetzt, ich weiß, was Sie versuchen zu tun.

Function Write-HostFormatted{ 
    param(
     [parameter(Mandatory=$true)] 
     $text, 
     [parameter(Mandatory=$true)] 
     [alias("DefaultColour")] 
     [System.ConsoleColor]$Colour 
    ) 

    $text -split "({[^}]+})" | ForEach-Object{ 
     If($_ -match "({[^}]+})"){ 
      # We need to change the colour 
      $Colour = $_.Trim("{}") 
     } else { 
      # Output text using the current colour 
      Write-Host -NoNewline $_ -ForegroundColor $Colour 
     } 
    } 
    # Add the trailing newline 
    Write-Host "" 
} 

Dann könnte man es so nennen:

Write-HostFormatted "This text is{Blue} Blue!{Red} Now this text is Red" White 

Output example

Ist dies etwas war man eigentlich interessiert waren in ich es neu schreiben würde, wie ich denke, es gibt große Raum für Verbesserungen. Point-Sein ist, dass Sie eine benutzerdefinierte Funktion erstellen müssen, um das zu tun, was Sie wollen.

Verwandte Themen