PowerShell Logging mit TFS/VSO – write-host richtig verwenden

Logging mit PowerShell ist im Zusammenspiel mit dem Team Foundation Server (TFS) / Visual Studio Online (VSO) etwas anders zu handhaben, als bei „klassischen“, „einfachen“ PowerShell Skripten. Während in der klassischen Konsole ein Host vorhanden ist, in dem die Ausgabe mit Write-Host erfolgen kann gibt es beim Ausführen von Remote PowerShell über das Release-Management des TFS keinen „Host“ in den die Nachricht geschrieben werden kann.

Remot PowerShell Icon

Der Fehler, der durch ein „Write-Host“ im Release-Management beim Ausführen von Remote PowerShell geworfen wird lautet:

"A command that prompts the user failed because the host program or the command type does not support user interaction. Try a host program that supports user interaction, such as the Windows PowerShell Console or Windows PowerShell ISE, and remove prompt-related commands from command types that do not support user interaction, such as Windows PowerShell workflows. "

Generell würde ich empfehlen Write-Host möglichst nicht zu benutzen. Folgende Befehle können stattdessen genutzt werden:

  • Write-Verbose
  • Write-Warning
  • Write-Error

Der Vorteil bei Write-Verbose ist, dass das Logging mit Hilfe des Parameters -verbose:$true oder auch nur -verbose aktiviert werden kann. Die Warnung und der Fehler werden darüber hinaus auch farblich dargestellt und helfen beim Erkennen selbiger in der Konsole.

Damit Verbose Logging zur Verfügung steht muss in jeder PS1-Datei zu Beginn und in jede PS-Funktion folgender Command eingebunden werden.

[CmdletBinding()]
Param()

Der Param-Parameter muss als leerer Platzhalter vorhanden sein, wenn keine Parameter im Skript verwendet werden.

Gut zu wissen: Was macht CmdletBinding noch?

Das Comandlet stellt die folgenden Funktionen zur Verfügung:

  • Die Möglichkeit [Parameter()] als decorators zu Parametern hinzuzufügen (oft in Verbindung mit [CmdletBinding()] eingesetzt)
  • Stellt Write-Verbose, Write-Debug zur Verfügung mit den Parametern –Verbose und –Debug
  • Stellt grundlegende Parameter wie –EV und –EA zur Verfügung
  • Stellt Parameter wir –whatif und –confirm zur Verfügung

 

Eine Alternative mit Tücken

Alternativ zu Write-Error und Write-Warning gibt es noch eine spezielle Syntax für Write-Host für den TFS/VSO. Diese darf aber nur dann verwendet werden, wenn die Skripte/Funktionen NICHT im Remote PowerShell ausgeführt werden – ansonsten tritt der oben genannte Fehler auf.

Warnung:

Write-Host “##vso[task.logissue type=warning;] PowerShell Warning Test for VSO”

Fehler:

Write-Host “##vso[task.logissue type=error;] PowerShell Error Test for VSO”

Vorteil dieser Variante:
Die Fehler und Warnungen werden im TFS/VSO in der Summary berücksichtigt. Bedeutet konkret: Die Fehler und Warnungen werden als solche gezählt und angezeigt. Fehler die mit Write-Error geschrieben werden, werden nicht „gezählt“ sondern nur angezeigt. Hingegen werden Warnings mit Write-Warning in der Zusammenfassung gar nicht angezeigt. (Siehe Grafik zur Zusammenfassung weiter unten.)

Beispiel für eine Funktion

Die Folgende Funktion zeigt die unterschiedlichen Loggingansätze:

function StartLogging
{
[CmdletBinding()]
param()
# The following will appear in the console output as "Verbose" without -verbose:true parameter
Write-Verbose “This is verbose generated in a PowerShell script without -verbose:true ”

# The following will appear in the console output as "Verbose" with -verbose:true parameter
Write-Verbose “This is verbose generated in a PowerShell script with -verbose:true” -verbose:$true

# The following will appear in the console output preceded by “WARNING: “
Write-Warning “This is a warning generated in a PowerShell script”

# The following will appear Build Summary as a Warning and in the task specific log in YELLOW text.
Write-Host “##vso[task.logissue type=warning;] PowerShell Warning Test for VSO”

# The following will appear in the Build Summary and the console output with additional error information”.
Write-Error “This is an error generated in a PowerShell script”

# The following will appear Build Summary as an Error and in the task specific log in YELLOW text.
Write-Host “##vso[task.logissue type=error;] PowerShell Error Test for VSO”
}

Die Ausgabe in PowerShell IDE beim Aufruf der Funktion:

Logging Ausgabe mit PowerShell

Die Ausgabe im TFS beim Aufruf der Funktion:

Logging Ausgabe im TFS

TFS Protokoll:

TFS Logging Protokoll

TFS-Zusammenfassung:
TFS usammenfassung

Schreibe einen Kommentar