2011-01-10 9 views
11

? Tengo un script powershell que da algún resultado de estado a través de write-output. Intencionalmente no estoy usando Write-Host ya que la salida puede ser capturado y se escribe en un archivo de registro de esta manera:¿Hay alguna forma de especificar un color de fuente al usar write-output

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

Pero si la salida no se redirige sería bueno haber teñido salida en la consola, porque la secuencia de comandos está produciendo muchos mensajes de estado diferentes. Sé que la salida de color es posible con write-host, pero los mensajes de estado deben poder procesarse.

¿Alguna idea de cómo solucionar esto?

+0

MS sugiere el uso de 'escritura host' http://technet.microsoft. com/en-us/library/ff406264.aspx, pero entiendo sus preocupaciones –

Respuesta

6

me han tratado esta función adicional y que básicamente funciona bien:

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 

El resultado de esta prueba en particular es un poco gracioso sin embargo: que realmente obtenemos líneas de cabecera de color rojo, verde y amarillo, pero la mesa está en rojo, es decir, el color de la primera llamada de la función.

+3

Eso no funcionará tan bien en ISE u otros hosts sin consola. :-) Puede probar '$ host.UI.RawUI.ForegroundColor' en su lugar. –

+1

@Keith, definitivamente tienes razón (a pesar de que el autor pregunta acerca de la consola). He actualizado el código. –

+2

[Console] :: ForegroundColor es realmente mejor, porque $ host.UI.RawUI.ForegroundColor no ** hace ** lo que espera en powershell_ise. – VoidStar

7

Separe los resultados en la canalización de los mensajes de estado en la consola.

Por ejemplo, utilizar una función como esta en el 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 
} 

Me gustaría también recomendamos que utilice uno de los siguientes cmdlets más de Write-Host para dar salida a los mensajes de estado de las secuencias de comandos:

  • escritura de depuración
  • escritura de error
  • escritura prolija
  • escritura de alerta

La apariencia de estos mensajes de estado variará según el cmdlet utilizado. Además, el usuario puede deshabilitar niveles específicos de estado utilizando las variables de preferencia $ (advertencia | error | verbose | debug), o capturar mensajes de estado específicos usando los parámetros comunes de cmdlet - (warning | error | verbose | debug).

+2

No es muy agradable porque todos los mensajes se muestran dos veces cuando la salida no se canaliza a un archivo. – binford

+1

Acepto, cualquier función que use esto no será apta para uso interactivo. La única forma decente de capturar todo lo que ha escrito alojado es Start-Transcript. – VoidStar

0

Sé que esta publicación es antigua, pero podría ser útil para alguien.

Quería cambiar los colores y la respuesta aceptada no era la mejor. En mis ojos, el siguiente código es mejor solución, ya que se aprovecha de la funcionalidad nativa 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 
Cuestiones relacionadas