PowerShell Log-Files: Logging in eine Textdatei - write to file

 

Logfiles in PowerShell können über den Befehl Out-File, über eine eigene Funktion oder über das in PowerShell integrierte Transcript erstellt werden.

Transcript

Eine sehr einfache Variante die Command-Line-Ausgabe in eine Textdatei zu schreiben, bietet der PowerShell-Befehl Transcript.

PS C:\temp> start-transcript c:\temp\transcript.txt
Die Aufzeichnung wurde gestartet. Die Ausgabedatei ist "c:\temp\transcript.txt".
PS C:\temp> write-host "test"
test
PS C:\temp> stop-transcript

Transcript schreibt einen Header mit Informationen zum User und Computer und im Anschluss die komplette Konsolenausgabe in eine Textdatei:

[+]
**********************
Start der Windows PowerShell-Aufzeichnung
Startzeit: 20200822123630
Benutzername: DOMAIN\User
RunAs-Benutzer: DOMAIN\User
Computer: COMPUTERNAME (Microsoft Windows NT 10.0.15063.0)
Hostanwendung: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Prozess-ID: 2832
PSVersion: 5.1.15063.1387
PSEdition: Desktop
PSCompatibleVersions: 1.0, 2.0, 3.0, 4.0, 5.0, 5.1.15063.1387
BuildVersion: 10.0.15063.1387
CLRVersion: 4.0.30319.42000
WSManStackVersion: 3.0
PSRemotingProtocolVersion: 2.3
SerializationVersion: 1.1.0.1
**********************
Die Aufzeichnung wurde gestartet. Die Ausgabedatei ist "c:\temp\transcript.txt".
PS C:\temp> write-host "test"
test
PS C:\temp> stop-transcript
**********************
Ende der Windows PowerShell-Aufzeichnung
Endzeit: 20200822123640
**********************

Transcript für alle PowerShell-Sessions und Skripts

Wer auf einem Computer oder Server pauschal alle PowerShell-Befehle in Transcripts sammeln will, kann die Transcript-Funktion in der Registry aktivieren. Dazu folgenden Inhalt in eine .reg-Datei kopieren und diese im Anschluss durch einen Doppelklick importieren. 

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\PowerShellCore\Transcription]
"EnableTranscripting"=dword:00000001
"OutputDirectory"="c:\\windows\\temp\\pstranscripts"

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\PowerShell\Transcription]
"EnableTranscripting"=dword:00000001
"OutputDirectory"="c:\\windows\\temp\\pstranscripts"

Für PowerShell-Core wird an dieser Stelle ein anderer Registry-Pfad verwendet, entsprechend benötigt PowerShell Core einen eigenen Eintrag in der Registry. Der Pfad für die Logs kann natürlich entsprechend angepasst werden.

Alternativ kann die Einstellung auch über eine Gruppenrichtlinie gesetzt werden. Als Pfad könnte auch ein UNC-Share im Netzwerk verwendet werden.

Alle PowerShell-Sessions protokollieren deren Ausgabe somit in eine eigene Datei in dem angegebenen Ordner:

Out-File

Wer die Ausgabe der Logzeilen in eine Textdatei selbst in die Hand nehmen will, kann das mit dem Befehl Out-File, siehe auch: PowerShell-Textdatei. Mit Hilfe des Befehles Out-File ist es möglich von PowerShell in eine Textdatei zu schreiben, hier ein einfaches Beispiel:

"Logzeileneintrag" | out-file "c:\temp\log.txt" -Append

Der Parameter -Append erstellt die Datei, falls diese nicht vorhanden ist und fügt bei einem erneuten Aufruf zusätzliche Logzeilen hinzu.

Damit, wie für ein Logfile üblich, auch die Zeit am Beginn der Logzeile geschrieben wird, kann diese mit folgendem Befehl hinzugefügt werden:

"$(get-date -format "yyyy-MM-dd HH:mm:ss"): Logzeileneintrag" | out-file "c:\temp\log.txt" -Append

Ausgabe in die Datei:

eigene Logging-Funktion

Damit im Befehl für die Ausgabe der Logzeile nicht immer der Command für das Datum eingebaut werden muss, kann für das Logging auch eine eigene Funktion erstellt werden. Die Funktion könnte dann auch Dinge wie eine automatische Benennung der Log-Datei, Log-Rotation oder ähnliches implementieren. 

Um bei dem Beispiel mit Out-File zu bleiben und um die Funktion möglichst einfach zu halten, habe ich den Befehl in eine kleine Funktion gegeben: der Schreibvorgang in das Log-File erfolgt dann mittels "Write-Log -text "Logtext", hier die Funktion und deren Aufruf:

function Write-Log
{
    Param
    (
        $text
    )

    "$(get-date -format "yyyy-MM-dd HH:mm:ss"): $($text)" | out-file "c:\temp\log.txt" -Append
}

Write-Log -text "Logzeile1"
Write-Log -text "Logzeile2"
positive Bewertung({{pro_count}})
Beitrag bewerten:
{{percentage}} % positiv
negative Bewertung({{con_count}})

DANKE für deine Bewertung!

Fragen / Kommentare


(sortiert nach Bewertung / Datum) [alle Kommentare(neueste zuerst)]

✍anonym
18.05.2021 23:37
Haha :D - Bin gerade so richtig und Powershell-Stimmung und schreibe für meine Scripts gerade eine .log-Datei.
Alls erstes ein Riesen Dankeschön an DICH! Hast ein paar coole Sachen die ich mir abgeschaut habe!!

Und dann ich musste gerade so lachen - Ich schaute mir deine "Datums" Ausgabe in der Log-Datei an, und war zuerst ein bisschen Verwirrt "2020-29-22" :DD - bis ich gemerkt habe, dass du die 'mm' Verwechselt hast :D
✍Bernhard
gepostet am 19.05.2021 06:58
ah, im Screenshot war das auch noch falsch, vielen Dank: jetzt sollte es passen.

Beitrag erstellt von Bernhard

✍anonym
31.03.2021 12:01
Beim Format müssten natürlich für den Monat zwei große Ms verwendet werden, sonst stehen an der Stelle die Minuten.
-format "yyyy-MM-dd H:mm:ss"
✍Bernhard
gepostet am 31.03.2021 12:28
danke, habe ich ausgebessert

Beitrag erstellt von Bernhard

Durch die weitere Nutzung der Seite stimmst du der Verwendung von Cookies zu Mehr Details