Kategorien
CodeArchiv Powershell

PowerShell Bildschirmbereich mit GetBufferContents sichern und wieder herstellen

Beschreibung

Da ich ein Fan der Konsole bin und gerne mehr mit Powershell  erledigen möchte , habe ich mich auf die Suche gemacht, komfortable Werte abzufragen in Form eines Formulars. Klar ich kann mit Tools mit eine GUI zusammenbasteln und auf die Ereignisse reagieren. Aber dann befinde ich mich schon wieder außerhalb der Konsole. Also was tun.

Ich habe also angefangen ein Formulartool für die Shell zu erstellen. Was bis dato auch schon super funktioniert. Aber da ich auch Auswahlfelder haben möchte, bin auf das Problem gestoßen, da ich beim Einblenden der möglichen Werte, andere Feldbreiche überschreibe. Also muss ich vor dem Einblenden den Bereich, in dem ich die Werte einlebenden möchte, zwischenspeichern. Dazu habe ich die Funktion GetBackGround geschrieben die mit der Funktion GetBufferContents einen Bereich sichert.

Ich gebe als Parameter die linke obere und die rechte untere Ecke als Koordinaten an. Dann sichert mir die Funktion den Inhalt und gibt sie mir zurück.

Ich fühle mich, irgendwie wie in alte DOS Zeiten versetzt. Die ersten Programmier Erfahrungen mit Fenstertechnik unter Turbo Basic und Dos.

Mit der Funktion SetBackGround wird der gesicherte Inhalt einfach wieder an der Ursprungsposition ausgegeben. Weitere Funktionen rund um mein Powershell Formulartool für die Shell werde ich zu einem späteren Zeitpunkt hier veröffentlichen.

Parameter

Parameter NameParameter Wert
intLeftSpalte der linken oberen Ecke (beginnt mit 0)
intTopZeile der linken oberen Ecke (beginnt mit 0)
intRightSpalte der rechten unteren Ecke
intBottomZeile der rechten unteren Ecke

Rückgabe

Rückgabe TypRückgabe Wert
Array[0] = CursorPosition der linken oberen Ecke
[1] = Array der Daten die gesichert wurden inkl. Farbwerten

Beispiel

Clear-Host
$objScreen = GetBackGround -intLeft 0 -intTop 0 -intRight 80 -intBottom 20
dir c:\
Write-Host "Press any key to continue ..."
$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
SetBackGround -objData $objScreen

Code GetBackGround

function GetBackGround () {
    param ([int]$intLeft = 0,
           [int]$intTop = 0,
           [int]$intRight = 0,
           [int]$intBottom = 0)
    
    $Host.ui.RawUI.CursorPosition = @{x=$intLeft; y=$intTop}
    $objPosition = $Host.ui.RawUI.CursorPosition


    $objRect = New-Object Management.Automation.Host.Rectangle
    $objRect.Left = $intLeft
    $objRect.Top = $intTop
    $objRect.Right = $intRight
    $objRect.Bottom = $intBottom
    $objCells = $host.UI.RawUI.GetBufferContents($objRect)
    return $objPosition, $objCells
}

Code SetBackGround

function SetBackGround(){
    param ($objData)
    $host.UI.RawUI.SetBufferContents($objData[0], $objData[1])
}

Download