A PowerShell-átiratok korlátozásai

Write-Host A kimenet és a kimeneti objektumok, sztringek és PowerShell-átírások összekeverése bonyolult. A szkript és az átírás működése között aprólékos interakció áll fenn olyan PowerShell-folyamatokkal, amelyek váratlan eredményeket kaphatnak.

Amikor objektumokat bocsát ki a szkriptből, az objektumok formázását a rendszer kezeli Out-Default. A formázás azonban akkor fordulhat elő, ha a szkript befejeződött, és az átírás leállt. Ez azt jelenti, hogy a kimenet nem lesz átírva. A sztringek kezelése eltérő. A sztringkimenet néha formázáson keresztül halad át, de nem mindig. Write-Host A azonnali írást tesz a gazdafolyamatba. Write-Object A a formázási rendszeren keresztül lesz elküldve. Az összetett objektumok kimenetének a gazdagépre történő írásával megnehezíti az átiratban naplózott adatok előrejelzését.

1. forgatókönyv – Strukturált objektum kimenete az összes többi művelet végén

Vegye figyelembe a következő szkriptet és kimenetét:

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

A konzol kimenete a várt kimenetet jeleníti meg, de nem a várt sorrendben. Write-Host 4 korábban látható Get-Location , mert Write-Host közvetlenül a gazdagépre való írásra van optimalizálva. Az átírásban van egy kód, amely átmásolja a kimenetet az átiratfájlba és a konzolba. Ezután meg fogjuk jelenni a szkript normál kimenetét Get-Location , és Write-Output 5 elküldjük a kimenetként.

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
**********************

Mivel az átírás ki van kapcsolva, mielőtt a szkript kilép, nem jelenik meg az átiratban. Az objektumok a folyamat következő felhasználójának lettek elküldve. Ebben az esetben ez Out-Defaultaz, amelyet a PowerShell automatikusan beszúrt. A további bonyolítás érdekében a sztringek kimenete a formázási rendszerben is optimalizálva van. Az elsőt Write-Output 2 az átirat bocsátja ki és rögzíti. Az objektum beszúrása azonban azt eredményezi, hogy a Get-Location kimenete a tényleges formázást igénylő dolgok halomába kerül, ami beállít egy kis állapotot az esetlegesen formázásra szoruló többi objektumhoz. Ez az oka annak, hogy a második Write-Output 5 nem lesz hozzáadva az átirathoz.

2. forgatókönyv – Az objektum kibocsátásának áthelyezése az elejére

Vegye figyelembe a következő szkriptet és kimenetét:

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

Láthatjuk, hogy a Write-Host parancsok minden előtt történnek, majd az objektumok megjelennek. Egy Write-Output sztring kényszeríti az objektum megjelenítését a képernyőn, de figyelje meg, hogy az átirat csak a kimenetét Write-Hosttartalmazza. Ennek az az oka, hogy ezek a sztringobjektumok formázásra Out-Default vannak állítva, miután a szkript kikapcsolta az átírást.

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
**********************

3. forgatókönyv – A szkript végén kibocsátott objektum

Ebben a forgatókönyvben az összetett objektum kimenete a szkript végén található.

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

A sztring kimenete mindkettőből Write-Host , és Write-Object az átiratba kerül. A kimenet Get-Location azonban az átírás leállása után következik be.

**********************
PowerShell transcript start
Start time: 20220606100342
**********************
Transcript started, output file is scenario3.log
1
2
4
5

**********************
PowerShell transcript end
End time: 20220606100342
**********************

A teljes átírás biztosításának módja

Ez a példa egy kis eltérés az eredeti forgatókönyvben, de most mindent naplóznak az átiratba. Az eredeti kód egy szkriptblokkba van csomagolva, és a formázó explicit módon meghívható a 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

Figyelje meg, hogy az utolsó Write-Host hívás még mindig nem megfelelő, ennek az az oka, hogy az optimalizálás Write-Host nem kerül a kimeneti streambe.

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
**********************