Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Das Mischen der Write-Host-Ausgabe mit Ausgabeobjekten, Zeichenfolgen und der PowerShell-Transkription ist kompliziert. Es gibt eine subtile Interaktion zwischen dem Skript und der Funktionsweise der Transkription mit PowerShell-Pipelines, die unerwartete Ergebnisse haben können.
Wenn Sie Objekte aus Ihrem Skript ausgeben, wird die Formatierung dieser Objekte von Out-Default gehandhabt.
Die Formatierung kann jedoch auftreten, nachdem das Skript abgeschlossen wurde und die Transkription beendet wurde. Dies bedeutet, dass die Ausgabe nicht transkribiert wird. Zeichenfolgen werden anders verarbeitet. Manchmal wird die Zeichenfolgenausgabe durch Formatierung übergeben, aber nicht immer. Write-Host führt einen sofortigen Schreibvorgang in den Hostprozess aus. Write-Output wird über das Formatierungssystem gesendet. Das Kombinieren der Ausgabe komplexer Objekte mit Schreibvorgängen in den Host macht es schwierig, vorherzusagen, was im Transkript protokolliert wird.
Szenario 1 – Ausgabe eines strukturierten Objekts nach allen anderen Vorgängen
Betrachten Sie das folgende Skript und dessen Ausgabe
PS> Get-Content scenario1.ps1
Start-Transcript scenario1.log -UseMinimalHeader
Write-Host '1'
Write-Output '2'
Get-Location
Write-Host '4'
Write-Output '5'
Stop-Transcript
PS> ./scenario1.ps1
Transcript started, output file is scenario1.log
1
2
4
Path
----
/Users/user1/src/projects/transcript
5
Transcript stopped, output file is /Users/user1/src/projects/transcript/scenario1.log
Die Ausgabe in der Konsole zeigt die erwartete Ausgabe, aber nicht in der erwarteten Reihenfolge.
Write-Host 4 ist sichtbar vor Get-Location, weil Write-Host dafür optimiert ist, direkt auf den Host zu schreiben. Es gibt Code in der Transkription, der die Ausgabe in die Transkriptdatei und die Konsole kopiert. Dann haben wir die reguläre Ausgabe von Get-Location und Write-Output 5, die als Ausgabe des Skripts gesendet werden.
PS> Get-Content scenario1.log
**********************
PowerShell transcript start
Start time: 20191106114858
**********************
Transcript started, output file is s2
1
2
4
**********************
PowerShell transcript end
End time: 20191106114858
**********************
Da die Transkription vor dem Beenden des Skripts deaktiviert ist, wird sie nicht im Transkript gerendert. Die Objekte wurden an den nächsten Verbraucher in der Pipeline gesendet. In diesem Fall ist es Out-Default, das PowerShell automatisch eingefügt hat. Um die Dinge weiter zu erschweren, ist die Ausgabe von Zeichenfolgen auch im Formatierungssystem optimiert. Der erste Write-Output 2 wird ausgegeben und vom Transkript erfasst. Das Einfügen des Get-Location Objekts bewirkt jedoch, dass seine Ausgabe in den Stapel der Elemente geschoben wird, die eine tatsächliche Formatierung benötigen, wodurch ein bestimmter Status für alle verbleibenden Objekte festgelegt wird, die möglicherweise auch eine Formatierung benötigen. Aus diesem Grund wird die zweite Write-Output 5 dem Transkript nicht hinzugefügt.
Szenario 2 – Verschieben der Objektemission zum Anfang
Betrachten Sie das folgende Skript und dessen Ausgabe
PS> Get-Content scenario2.ps1
Start-Transcript scenario2.log -UseMinimalHeader
Get-Location
Write-Host '1'
Write-Output '2'
Get-Location
Write-Host '4'
Write-Output '5'
Stop-Transcript
PS> ./scenario2.ps1
Transcript started, output file is scenario2.log
1
4
Path
----
/Users/user1/src/projects/transcript
2
5
Transcript stopped, output file is /Users/user1/src/projects/transcript/scenario2.log
Wir können sehen, dass die Write-Host-Befehle zuerst kommen und dann die Objekte folgen. Write-Output einer Zeichenfolge erzwingt das Rendern des Objekts auf dem Bildschirm, beachten Sie jedoch, dass das Transkript nur die Ausgabe von Write-Host enthält. Das liegt daran, dass diese Zeichenfolgenobjekte zur Formatierung weitergeleitet Out-Default werden, nachdem das Skript die Transkription deaktiviert hat.
PS> Get-Content scenario2.log
**********************
PowerShell transcript start
Start time: 20220606094609
**********************
Transcript started, output file is s3
1
4
**********************
PowerShell transcript end
End time: 20220606094609
**********************
Szenario 3 – Objekt, das am Ende des Skripts ausgegeben wird
In diesem Szenario befindet sich die Ausgabe des komplexen Objekts am Ende des Skripts.
PS> Get-Content scenario3.ps1
Start-Transcript scenario3.log -UseMinimalHeader
Write-Host '1'
Write-Output '2'
Write-Host '4'
Write-Output '5'
Get-Location
Stop-Transcript
PS> ./scenario3.ps1
Transcript started, output file is scenario3.log
1
2
4
5
Path
----
/Users/user1/src/projects/transcript
Transcript stopped, output file is /Users/user1/src/projects/transcript/scenario3.log
Die Zeichenfolgenausgabe aus Write-Host und Write-Output wird in das Transkript aufgenommen. Die Ausgabe von Get-Location tritt jedoch auf, nachdem die Transkription beendet wurde.
**********************
PowerShell transcript start
Start time: 20220606100342
**********************
Transcript started, output file is scenario3.log
1
2
4
5
**********************
PowerShell transcript end
End time: 20220606100342
**********************
Eine Möglichkeit, die vollständige Transkription sicherzustellen
Dieses Beispiel ist eine geringfügige Variation des ursprünglichen Szenarios, aber jetzt wird alles beim Transkript protokolliert. Der ursprüngliche Code wird in einem Skriptblock eingeschlossen und der Formatierer explizit über Out-Default aufgerufen.
PS> Get-Content scenario4.ps1
Start-Transcript scenario4.log -UseMinimalHeader
. {
Write-Host '1'
Write-Output '2'
Get-Location
Write-Host '4'
Write-Output '5'
} | Out-Default
Stop-Transcript
PS> ./scenario4.ps1
Transcript started, output file is scenario4.log
1
2
4
Path
----
/Users/user1/src/projects/transcript
5
Transcript stopped, output file is /Users/user1/src/projects/transcript/scenario4.log
Beachten Sie, dass der letzte Write-Host Aufruf immer noch außerhalb der Reihenfolge ist, das liegt daran, dass die Optimierung in Write-Host nicht in den Ausgabedatenstrom gelangt.
PS> Get-Content scenario4.log
**********************
PowerShell transcript start
Start time: 20220606101038
**********************
Transcript started, output file is s5
1
2
4
Path
----
/Users/user1/src/projects/transcript
5
**********************
PowerShell transcript end
End time: 20220606101038
**********************