xaero1982
Goto Top

Powershell Gui

Moin Zusammen,

ich bin gerade bissel am Powershell basteln.

Jetzt möchte ich z.B. sowas:

Get-BitLockerVolume | select MountPoint, ProtectionStatus

in einer Messagebox ausgeben, aber die Ausgabe ist leer. In einer PS direkt geht es problemlos.
Mache ich es ohne das select bekomme ich nur meine Laufwerke ausgegeben in der Messagebox.

Jemand eine Idee wie ich solche gefilterten Ergebnisse ausgeben kann?

Danke, Grüße

Content-ID: 667433

Url: https://administrator.de/contentid/667433

Ausgedruckt am: 18.11.2024 um 20:11 Uhr

em-pie
em-pie 08.06.2021 um 17:55:07 Uhr
Goto Top
Moin,

dein Wert ist vermutlich/ scheinbar ein Array.
Probiere es einmal so:
https://community.spiceworks.com/topic/1974262-textbox-format-text-each- ...

$computers = (PC-1, PC-2, PC-3)
$outputBox.AppendText( ($computers | foreach {$_ + "`n" } ) )  

Gruß
em-pie
Xaero1982
Xaero1982 08.06.2021 um 18:01:15 Uhr
Goto Top
Hi em-pie,

danke dir, aber das passt bei mir nicht rein face-smile

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")  
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")  

$objForm = New-Object System.Windows.Forms.Form
$objForm.Backcolor="white"  
$objForm.StartPosition = "CenterScreen"  
$objForm.Size = New-Object System.Drawing.Size(800,500)
$objForm.Text = "Settingschecker"  

$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(300,60)
$objLabel.Size = New-Object System.Drawing.Size(1000,20)
$objLabel.Text = "Bitte geben sie einen Text ein:"  
$objForm.Controls.Add($objLabel)

$objTextBox = New-Object System.Windows.Forms.TextBox
$objTextBox.Location = New-Object System.Drawing.Size(300,100)
$objTextBox.Size = New-Object System.Drawing.Size(200,20)
$objForm.Controls.Add($objTextBox)

#OK Button anzeigen lassen
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(500,420)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"  
$OKButton.Name = "OK"  
#$OKButton.DialogResult = "OK" # Ansonsten wird Fenster geschlossen  
$OKButton.Add_Click({$bitlockerstatus=Get-BitLockerVolume | select MountPoint, ProtectionStatus 
[void] [Windows.Forms.MessageBox]::Show($bitlockerstatus)
})

$objForm.Controls.Add($OKButton) 

[void] $objForm.ShowDialog()

Grüße
colinardo
Lösung colinardo 08.06.2021 aktualisiert um 21:00:07 Uhr
Goto Top
Servus
Du musst aus den Objects einen String machen, Objekte mit diversen Eigenschaften und Typen stellt eine Messagbox verständlicherweise nicht dar 😉
$bitlockerstatus = Get-BitLockerVolume | ft MountPoint, ProtectionStatus -AutoSize | out-string
Alternativ ohne Messagebox sondern gleich als GridView
Get-BitLockerVolume | select MountPoint, ProtectionStatus | ogv
Grüße Uwe
em-pie
em-pie 08.06.2021 aktualisiert um 21:15:42 Uhr
Goto Top
Hab's es mal so hingerotzt (hoffe, @colinardo erschlägt mich nicht face-big-smile)

function GetBitlockerInfo(){
    $bitlockerstatus = Get-BitLockerVolume | select MountPoint, ProtectionStatus
    $objTextBox.AppendText(( $bitlockerstatus ) )
    return $bitlockerstatus
}

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")  
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")  

$objForm = New-Object System.Windows.Forms.Form
$objForm.Backcolor="white"  
$objForm.StartPosition = "CenterScreen"  
$objForm.Size = New-Object System.Drawing.Size(800,500)
$objForm.Text = "Settingschecker"  

$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(300,60)
$objLabel.Size = New-Object System.Drawing.Size(1000,20)
$objLabel.Text = "Bitte geben sie einen Text ein:"  
$objForm.Controls.Add($objLabel)

$objTextBox = New-Object System.Windows.Forms.TextBox
$objTextBox.Location = New-Object System.Drawing.Size(300,100)
$objTextBox.Size = New-Object System.Drawing.Size(300,40)
$objForm.Controls.Add($objTextBox)

#OK Button anzeigen lassen
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(500,420)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"  
$OKButton.Name = "OK"  
#$OKButton.DialogResult = "OK" # Ansonsten wird Fenster geschlossen  
$OKButton.Add_Click{GetBitlockerInfo}

$objForm.Controls.Add($OKButton) 

[void] $objForm.ShowDialog()


du kannst das mit der function aber auch seinlassen und stattdessen direkt ein
$OKButton.Add_Click{$objTextBox.AppendText(( Get-BitLockerVolume | select MountPoint, ProtectionStatus ) )}

Formatieren müsstest du es dann noch selbst
mbehrens
mbehrens 08.06.2021 um 21:19:13 Uhr
Goto Top
Zitat von @Xaero1982:

> [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")  
> [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")  
> 
[...]
> $OKButton.Add_Click({$bitlockerstatus=Get-BitLockerVolume | select MountPoint, ProtectionStatus 
> [void] [Windows.Forms.MessageBox]::Show($bitlockerstatus)
> })
> 

Wie soll die arme MessageBox auch ein PSCustomObject anzeigen?

Dafür kann ich in der Dokumentation keine passende Methode entdecken. Des weiteren kann ich nur dazu raten, den Event Handler in eine Function auszulagern. Das macht vieles klarer.
Xaero1982
Xaero1982 08.06.2021 um 21:27:51 Uhr
Goto Top
Zitat von @colinardo:

Servus
Du musst aus den Objects einen String machen, Objekte mit diversen Eigenschaften und Typen stellt eine Messagbox verständlicherweise nicht dar 😉
> $bitlockerstatus = Get-BitLockerVolume | ft MountPoint, ProtectionStatus -AutoSize | out-string
> 
Alternativ ohne Messagebox sondern gleich als GridView
> Get-BitLockerVolume | select MountPoint, ProtectionStatus | ogv
> 
Grüße Uwe

Danke Dir Uwe, das klappt.
Gridview fand ich nicht so ansprechend muss ich gestehen. Das hatte ich schon probiert.

@em-pie: Das klappt leider beides nicht.
colinardo
colinardo 08.06.2021 aktualisiert um 21:48:30 Uhr
Goto Top
By the way den alten Hut hatten wir hier gefühlt schon hundert mal ...
PowerShell - Liste von Dokumenten in MessageBox ausgeben
Powershell Ausgabe in Messagebox
Powershell : DNS Abfrage : Ausgabe in Textbox
Usw.
Also immer daran denken mit der PS arbeitet man objektorientiert und typisiert, auch wenn einem die Shell viele Konvertierungen automatisch abnimmt muss man die Typen immer im Hinterkopf behalten, sonst stellen die einem gerne ein Bein.

Schönen Abend.
Xaero1982
Xaero1982 09.06.2021 um 18:59:56 Uhr
Goto Top
Hi @colinardo,

kannst du mir noch nen Tipp geben? face-smile

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")  
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")  


#Bitlockerstatus abrufen
function GetBitlockerInfo(){
    $bitlockerstatus = Get-BitLockerVolume | ft MountPoint, ProtectionStatus | out-string
    return $bitlockerstatus
}

#Fenster erstellen
$objForm = New-Object System.Windows.Forms.Form
$objForm.Backcolor="white"  
$objForm.StartPosition = "CenterScreen"  
$objForm.Size = New-Object System.Drawing.Size(800,500)
$objForm.Text = "Settingschecker"  

function New-Button {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory=$true)]
        [string]$Location,
        [Parameter(Mandatory=$true)]
        [string]$Size,
        [Parameter(Mandatory=$true)]
        [string]$Text = '',  
        [Parameter(Mandatory=$true)]
        [string]$Add_Click
    )

    $x = New-Object System.Windows.Forms.Button
    $x.Location  = $Location
    $x.Size      = $Size
    $x.Text      = $Text
    $x.Add_Click{$Add_Click}
    

    return $x
}

$button = New-Button -Location '250,30' -Size '130,23' -Text 'Bitlockerstatus' -Add_Click ($status = GetBitlockerInfo [void] [System.Windows.Forms.MessageBox]::Show($status))  
$objForm.Controls.Add($button)

[void] $objForm.ShowDialog()

Es wird zwar korrekt das Fenster geöffnet und auch der Button hinzugefügt, aber beim Klick passiert gar nichts. Hast du eine Idee woran das scheitern könnte?

Grüße und Danke
colinardo
Lösung colinardo 09.06.2021 aktualisiert um 19:09:49 Uhr
Goto Top
Servus,
Hast du eine Idee woran das scheitern könnte?
Ja, erstens ist Add_Click ein Methodenaufruf, ergo werden dort normale Klammern () verwendet. Des weiteren ist der Inhalt des Parameters für das Click-Event ein Objekt vom Typ "Scriptblock" und kein String (man könnte das zwar als String übergeben und mit Invoke-Expression ausführen aber ehrlich gesagt murks):
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")  
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")  


#Bitlockerstatus abrufen
function GetBitlockerInfo(){
    $bitlockerstatus = Get-BitLockerVolume | ft MountPoint, ProtectionStatus | out-string
    return $bitlockerstatus
}

#Fenster erstellen
$objForm = New-Object System.Windows.Forms.Form
$objForm.Backcolor="white"  
$objForm.StartPosition = "CenterScreen"  
$objForm.Size = New-Object System.Drawing.Size(800,500)
$objForm.Text = "Settingschecker"  

function New-Button {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory=$true)]
        [string]$Location,
        [Parameter(Mandatory=$true)]
        [string]$Size,
        [Parameter(Mandatory=$true)]
        [string]$Text = '',  
        [Parameter(Mandatory=$true)]
        [scriptblock]$Add_Click
    )

    $x = New-Object System.Windows.Forms.Button
    $x.Location  = $Location
    $x.Size      = $Size
    $x.Text      = $Text
    $x.Add_Click($Add_Click)
    

    return $x
}

$button = New-Button -Location '250,30' -Size '130,23' -Text 'Bitlockerstatus' -Add_Click {  
    $status = GetBitlockerInfo
    [void][System.Windows.Forms.MessageBox]::Show($status)
}
$objForm.Controls.Add($button)

[void] $objForm.ShowDialog()
Xaero1982
Xaero1982 09.06.2021 um 19:40:40 Uhr
Goto Top
Hach! Ich habs mir irgendwie schon gedacht, dass das an der Stelle nicht richtig sein kann. Hab aber nichts zu gefunden, bzw. war mir nicht so richtig klar wonach ich suchen soll.

Ich danke dir! Schönen Abend noch face-smile

Grüße