2011-01-10 6 views
11

Ho uno script PowerShell che fornisce alcuni output di stato tramite write-output. Non sto intenzionalmente usando write-host perché l'output può essere catturato e scritto un file di log in questo modo:C'è un modo per specificare un colore di carattere quando si utilizza l'output di scrittura

./myscript.ps1 | out-file log.txt 

Ma se l'uscita non viene reindirizzato sarebbe bello avere colorato uscita sulla console, perché lo script sta producendo molti messaggi di stato diversi. So che l'output colorato è possibile con host di scrittura ma i messaggi di stato devono essere pipettati.

Qualche idea su come risolvere questo problema?

+0

MS suggerisce di utilizzare 'scrittura host' http://technet.microsoft. it/it/us/library/ff406264.aspx, ma capisco le tue preoccupazioni –

risposta

6

ho provato questa funzione in più e funziona sostanzialmente bene:

function Write-ColorOutput($ForegroundColor) 
{ 
    # save the current color 
    $fc = $host.UI.RawUI.ForegroundColor 

    # set the new color 
    $host.UI.RawUI.ForegroundColor = $ForegroundColor 

    # output 
    if ($args) { 
     Write-Output $args 
    } 
    else { 
     $input | Write-Output 
    } 

    # restore the original color 
    $host.UI.RawUI.ForegroundColor = $fc 
} 

# test 
Write-ColorOutput red (ls) 
Write-ColorOutput green (ls) 
ls | Write-ColorOutput yellow 

Il risultato di questo particolare test è un po 'strano però: abbiamo davvero ottenere linee in rosso, verde e giallo, ma la tabella di intestazione è in rosso, cioè il colore della prima chiamata della funzione.

+3

Che non funzionerà così bene in ISE o altri host non basati su console. :-) Potresti provare '$ host.UI.RawUI.ForegroundColor'. –

+1

@Keith, hai decisamente ragione (anche se l'autore chiede informazioni sulla console). Ho aggiornato il codice. –

+2

[Console] :: ForegroundColor è effettivamente migliore, perché $ host.UI.RawUI.ForegroundColor fa ** non ** fa ciò che ti aspetti in powershell_ise. – VoidStar

7

Separare i risultati sulla pipeline dai messaggi di stato nella console.

Ad esempio, utilizzare una funzione come questa nello script:

function write-status($status){ 
    $status | write-host -fore green -back red; #send a status msg to the console 
    $status | write-output; #send a status object down the pipe 
} 

Io consiglio anche di utilizzare uno dei seguenti cmdlet oltre write-host per emettere messaggi di stato dagli script:

  • write-debug
  • scrittura errore
  • write-warning write-verbose

L'aspetto di questi messaggi di stato varia in base al cmdlet utilizzato. Inoltre, l'utente può disabilitare specifici livelli di stato usando le variabili di preferenza $ (warning | error | verbose | debug), o acquisire specifici messaggi di stato usando i parametri del cmdlet comuni (warning | error | verbose | debug) comuni.

+2

Non molto bello perché tutti i messaggi sono mostrati due volte quando l'output non è collegato a un file. – binford

+1

Sono d'accordo, qualsiasi funzione che usi questo non è adatta per l'uso interattivo. L'unico modo decente per catturare tutto ciò che hai scritto in hosting è Start-Transcript. – VoidStar

0

So che questo post è antico, ma questo potrebbe tornare utile a qualcuno là fuori.

Volevo cambiare i colori e la risposta accettata non era la soluzione migliore. Ai miei occhi, il codice seguente è la soluzione migliore in quanto sfrutta le funzionalità native PowerShell:

EDIT:

# Print User message using String Array $message 
function PrintMessageToUser { 
    param(
     [Parameter(` 
      Mandatory=$True, ` 
      Valuefrompipeline = $true)] 
     [String]$message 
    ) 
    begin { 
     $window_private_data = (Get-Host).PrivateData; 
     # saving the original colors 
     $saved_background_color = $window_private_data.VerboseBackgroundColor 
     $saved_foreground_color = $window_private_data.VerboseForegroundColor 
     # setting the new colors 
     $window_private_data.VerboseBackgroundColor = 'Black'; 
     $window_private_data.VerboseForegroundColor = 'Red'; 
    } 
    process { 
     foreach ($Message in $Message) { 
      # Write-Host Considered Harmful - see http://www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/ 
      # first way how to correctly write it 
      #Write-host $message; 
      Write-Verbose -Message $message -Verbose; 
      # second correct way how to write it 
      #$VerbosePreference = "Continue" 
      #Write-Verbose $Message; 
     } 
    } 
    end { 
     $window_private_data.VerboseBackgroundColor = $saved_background_color; 
     $window_private_data.VerboseForegroundColor = $saved_foreground_color; 
    } 

} # end PrintMessageToUser 
Problemi correlati