Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Mieszanie Write-Host danych wyjściowych z obiektami wyjściowymi, ciągami i transkrypcją programu PowerShell jest skomplikowane. Istnieje subtelna interakcja między skryptem a działaniem transkrypcji w potokach programu PowerShell, która może prowadzić do nieoczekiwanych rezultatów.
Gdy emitujesz obiekty ze skryptu, formatowanie tych obiektów jest obsługiwane przez Out-Default.
Jednak formatowanie może wystąpić po zakończeniu działania skryptu i zatrzymaniu transkrypcji. Oznacza to, że dane wyjściowe nie są transkrypowane. Ciągi są obsługiwane inaczej. Czasami dane wyjściowe ciągu są przekazywane przez formatowanie, ale nie zawsze.
Write-Host wykonuje natychmiastowy zapis w procesie hosta.
Write-Output jest wysyłany za pośrednictwem systemu formatowania. Połączenie danych wyjściowych złożonych obiektów z zapisami na hoście utrudnia przewidywanie, co jest rejestrowane w transkrypcji.
Scenariusz 1 — dane wyjściowe obiektu strukturalnego po wszystkich innych operacjach
Rozważmy następujący skrypt i jego dane wyjściowe:
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
Dane wyjściowe w konsoli zawierają oczekiwane dane wyjściowe, ale nie w oczekiwanej kolejności.
Write-Host 4 jest widoczny przed Get-Location , ponieważ Write-Host jest zoptymalizowany pod kątem zapisywania bezpośrednio na hoście. Istnieje kod w transkrypcji, który kopiuje dane wyjściowe do pliku transkrypcji i konsoli. Następnie mamy regularne dane wyjściowe Get-Location i Write-Output 5 wysyłane jako dane wyjściowe skryptu.
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
**********************
Ponieważ transkrypcja jest wyłączona przed zakończeniem działania skryptu, nie pojawia się w transkrypcie. Obiekty zostały wysłane do następnego konsumenta w łańcuchu przetwarzania. W tym przypadku jest to Out-Default, które program PowerShell wstawił automatycznie. Aby bardziej skomplikować sytuację, wynik ciągów jest również zoptymalizowany w systemie formatowania. Pierwszy Write-Output 2 jest najpierw emitowany, a następnie przechwytywany przez transkrypcję. Jednak wstawienie obiektu Get-Location powoduje przeniesienie jego wyników do stosu rzeczy wymagających rzeczywistego formatowania, co ustawia stan dla pozostałych obiektów, które również mogą wymagać formatowania. Dlatego drugi Write-Output 5 nie zostanie dodany do transkrypcji.
Scenariusz 2 — przenieść emisję obiektu na początek
Rozważmy następujący skrypt i jego dane wyjściowe:
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
Widzimy, że polecenia Write-Host są wykonywane przed wszystkim innym, a następnie zaczynają się pojawiać obiekty. Ciąg Write-Output wymusza wyświetlenie obiektu na ekranie, ale zwróć uwagę, że transkrypcja zawiera tylko dane wyjściowe Write-Host. Dzieje się tak, ponieważ te obiekty ciągów są przesyłane do Out-Default w celu formatowania po wyłączeniu transkrypcji w skrypcie.
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
**********************
Scenariusz 3 — obiekt emitowany na końcu skryptu
W tym scenariuszu dane wyjściowe obiektu złożonego są na końcu skryptu.
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
Dane wyjściowe ciągu z zarówno Write-Host jak i Write-Output elementów zostają wprowadzone do transkrypcji. Jednak dane wyjściowe z Get-Location wystąpią po zatrzymaniu transkrypcji.
**********************
PowerShell transcript start
Start time: 20220606100342
**********************
Transcript started, output file is scenario3.log
1
2
4
5
**********************
PowerShell transcript end
End time: 20220606100342
**********************
Sposób zapewnienia pełnej transkrypcji
Ten przykład jest nieznaczną odmianą oryginalnego scenariusza, ale teraz wszystko jest rejestrowane w transkrypcji. Oryginalny kod jest opakowany w blok skryptu, a formater jawnie wywoływany za pośrednictwem metody Out-Default.
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
Zwróć uwagę, że ostatnie wywołanie Write-Host jest nadal poza kolejnością, ponieważ optymalizacja w Write-Host nie trafia do strumienia wyjściowego.
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
**********************