124909
Goto Top

Powershell: Elemente der WPF-GUI beim ersten starten updaten

Hallo Freunde,

ich denke das ist eher was für die Powershell-Cracks:

Ich habe ein Programm geschrieben welches ein Inkrementelles Backup vom Desktop ins persönliche Netzlaufwerk tätigt.
Dies ist meiner GUI, über WPF realisiert, dort sind noch Buttons wie z.B jetzt sichern, später sichern, nicht sichern eingebunden und mit Events geschmückt.
Außerdem zeigt die Maske auch die zu sichernden Daten an mit der LastWriteTime. Soweit funktioniert auch alles nun mein Problem:

Ich habe das ganze in eine .exe -Umgewandelt, wenn ich diese jetzt starte sind alle Labels und Textboxen leer, diese werden über Funktionen gefüllt. Mir ist aufgefallen, dass in der Powershell-ISE die Labels und Textboxen auch erst nach dem 2. mal aktualisiert werden mit den bestimmten Inhalten.

Ich denke Powershell lädt immer erst die Maske und beim 2. mal compilieren aktualisiert sie die einzelnen Elemente.

Welche Möglichkeiten gibt es, dass Powershell nun also 2 Hintergrundjobs ausführt (Maske laden und Elemente füllen), ich habe leider kein Ansatz wie ich danach suchen soll.

Vielen Dank vorab & Frohe Ostern

Content-Key: 300007

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

Printed on: April 26, 2024 at 15:04 o'clock

Mitglied: 114757
114757 Mar 24, 2016 updated at 11:56:56 (UTC)
Goto Top
Zitat von @124909:
Ich habe das ganze in eine .exe -Umgewandelt,
Mit welcher Methode?
wenn ich diese jetzt starte sind alle Labels und Textboxen leer, diese werden über Funktionen gefüllt. Mir ist aufgefallen, dass in der Powershell-ISE die Labels und Textboxen auch erst nach dem 2. mal aktualisiert werden mit den bestimmten Inhalten.
ISE und testen von WPF GUI ist sehr fehlerbehaftet wenn man die Ressourcen nicht konsequent entlädt
und die Garbage Collection laufen lässt
Ich denke Powershell lädt immer erst die Maske und beim 2. mal compilieren aktualisiert sie die einzelnen Elemente.
Nein. Das liegt an deinem Code.
Welche Möglichkeiten gibt es, dass Powershell nun also 2 Hintergrundjobs ausführt (Maske laden und Elemente füllen), ich habe leider kein Ansatz wie ich danach suchen soll.
Zum Entwickeln von WPF GUIs nicht die ISE benutzen.

Gruß jodel32
Mitglied: 124909
124909 Mar 24, 2016 updated at 12:40:27 (UTC)
Goto Top
Mit welcher Methode?
PowerGUI, ich denke dort wird es auch nur in einem C-Code eingebettet und mit .NET 4.0 bearbeitet

ISE und testen von WPF GUI ist sehr fehlerbehaftet wenn man die Ressourcen nicht konsequent entlädt
und die Garbage Collection laufen lässt
Was schlägst du also vor ?

Zum Entwickeln von WPF GUIs nicht die ISE benutzen.
Was empfehlst du? Visual-Studio ? Mir gehts hauptsächlich um den Lerneffekt und um die Möglichkeit dieses Skript eventuell später noch an Clients zu verteilen, dann ist es vom Vorteil wenn die Skriptsprache schon installiert ist.

Vielen Dank
clubmate
Mitglied: 114757
114757 Mar 24, 2016 updated at 12:49:39 (UTC)
Goto Top
Was schlägst du also vor ?
Zum Skripten reicht ein Texteditor deiner Wahl. Und zum ausführen (Testen) eine separate PS Konsole.

Visual Studio kannst du natürlich auch verwenden.
Mitglied: 124909
124909 Mar 24, 2016 at 13:10:23 (UTC)
Goto Top
Zum Skripten reicht ein Texteditor deiner Wahl. Und zum ausführen (Testen) eine separate PS Konsole.

Und zu meinem Problem hilft mir was ?
Mitglied: 114757
114757 Mar 24, 2016 updated at 13:40:41 (UTC)
Goto Top
Zitat von @124909:
Und zu meinem Problem hilft mir was ?
Korrekt geschriebener Code für WPF.

Von deinem ist hier aber nichts zu sehen face-sad Wie soll man da ergründen können was du falsch machst?
Mitglied: 124909
124909 Mar 24, 2016 at 13:53:26 (UTC)
Goto Top
Von deinem ist hier aber nichts zu sehen face-sad Wie soll man da ergründen können was du falsch machst?

Gut ok :p , unwichtige Sachen weggelassen, das ist im Grunde die WPF-Maske, die Methoden die sie für die Elemente braucht und wie ich die Maske sichtbar mache:

##################    MASKE  #####################
$ErrorActionPreference = "SilentlyContinue"  
$inputXML = @"  
<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
        Title="Inkrementelles BackUp von Desktop zu Userhome" Height="480.652" Width="478.436">  
    <Grid x:Name="Window" Background="#FF86B8EA">  
        <Label x:Name="label" Content="Inkrementelles Backup vom:" HorizontalAlignment="Left" Margin="60,13,0,0" VerticalAlignment="Top" Width="220" FontSize="13"/>  
        <Label x:Name="LDatum" Content= "$($Datum)" HorizontalAlignment="Left" Height="31" Margin="230,10,0,0" VerticalAlignment="Top" FontSize="16" Width="163" FontWeight="Bold"/>  
        <Label x:Name="label1" HorizontalAlignment="Left" Margin="53,67,0,0" VerticalAlignment="Top" Width="127"/>  
        <ProgressBar x:Name="bar" HorizontalAlignment="Left" Height="10" Margin="10,344,0,0" VerticalAlignment="Top" Width="436"/>  
        <Button x:Name="BSichern" Content="Jetzt Sichern" HorizontalAlignment="Left" Margin="10,308,0,0" VerticalAlignment="Top" Width="82" RenderTransformOrigin="-0.002,0.916"/>  
        <Button x:Name="BSpaeter" Content="Später ..." HorizontalAlignment="Left" Margin="118,308,0,0" VerticalAlignment="Top" Width="75" RenderTransformOrigin="-0.002,0.916"/>  
        <Button x:Name="BBeenden" Content="Programm beenden" HorizontalAlignment="Left" Margin="324,308,0,0" VerticalAlignment="Top" Width="122" RenderTransformOrigin="-0.002,0.916"/>  
        <Button x:Name="BnSichern" Content="nicht Sichern" HorizontalAlignment="Left" Margin="220,308,0,0" VerticalAlignment="Top" Width="87" RenderTransformOrigin="-0.002,0.916"/>  
        <Label x:Name="label3" Content="Dateiname:" HorizontalAlignment="Left" Margin="90,56,0,0" VerticalAlignment="Top" Width="122" FontWeight="Bold" FontSize="14"/>  
        <Label x:Name="label4" Content="Zuletzt geändert:" HorizontalAlignment="Left" Margin="315,56,0,0" VerticalAlignment="Top" FontWeight="Bold" FontSize="14" />  
        <Separator HorizontalAlignment="Left" Height="100" Margin="178,124,0,0" VerticalAlignment="Top" Width="236" RenderTransformOrigin="0.5,0.5">  
            <Separator.RenderTransform>
                <TransformGroup>
                    <ScaleTransform/>
                    <SkewTransform/>
                    <RotateTransform Angle="90"/>  
                    <TranslateTransform/>
                </TransformGroup>
            </Separator.RenderTransform>
        </Separator>
        <Separator HorizontalAlignment="Left" Height="73" Margin="0,45,0,0" VerticalAlignment="Top" Width="470" BorderThickness="0"/>  
        <Label x:Name="label2"        Content="$(CompareDesktopUserhomeName(0))" HorizontalAlignment="Left" Margin="50,90,0,0"   VerticalAlignment="Top" Width="150"  FontWeight="Bold"/>  
        <Label x:Name="label2_Copy"   Content="$(CompareDesktopUserhomeName(1))" HorizontalAlignment="Left" Margin="50,115,0,0"  VerticalAlignment="Top" Width="150"  FontWeight="Bold"/>  
        <Label x:Name="label2_Copy1"  Content="$(CompareDesktopUserhomeName(2))" HorizontalAlignment="Left" Margin="50,140,0,0"  VerticalAlignment="Top" Width="150"  FontWeight="Bold"/>  
        <Label x:Name="label2_Copy2"  Content="$(CompareDesktopUserhomeName(3))" HorizontalAlignment="Left" Margin="50,165,0,0"  VerticalAlignment="Top" Width="150"  FontWeight="Bold"/>  
        <Label x:Name="label2_Copy3"  Content="$(CompareDesktopUserhomeName(4))" HorizontalAlignment="Left" Margin="50,190,0,0"  VerticalAlignment="Top" Width="150"  FontWeight="Bold"/>  
        <Label x:Name="label2_Copy4"  Content="$(CompareDesktopUserhomeName(5))" HorizontalAlignment="Left" Margin="50,215,0,0"  VerticalAlignment="Top" Width="150"  FontWeight="Bold"/>  
        <Label x:Name="label2_Copy5"  Content="$(CompareDesktopUserhomeName(6))" HorizontalAlignment="Left" Margin="50,240,0,0"  VerticalAlignment="Top" Width="150"  FontWeight="Bold"/>  
        <Label x:Name="label2_Copy6"  Content="$(CompareDesktopUserhomeName(7))" HorizontalAlignment="Left" Margin="50,265,0,0"  VerticalAlignment="Top" Width="150"  FontWeight="Bold"/>  
        <Label x:Name="label2_Copy7"  Content="$(CompareDesktopUserhomeTime(0))" HorizontalAlignment="Left" Margin="315,90,0,0"  VerticalAlignment="Top" Width="150"  FontWeight="Bold"/>  
        <Label x:Name="label2_Copy8"  Content="$(CompareDesktopUserhomeTime(1))" HorizontalAlignment="Left" Margin="315,115,0,0" VerticalAlignment="Top" Width="150"  FontWeight="Bold"/>  
        <Label x:Name="label2_Copy9"  Content="$(CompareDesktopUserhomeTime(2))" HorizontalAlignment="Left" Margin="315,140,0,0" VerticalAlignment="Top" Width="150"  FontWeight="Bold"/>  
        <Label x:Name="label2_Copy10" Content="$(CompareDesktopUserhomeTime(3))" HorizontalAlignment="Left" Margin="315,165,0,0" VerticalAlignment="Top" Width="150"  FontWeight="Bold"/>  
        <Label x:Name="label2_Copy11" Content="$(CompareDesktopUserhomeTime(4))" HorizontalAlignment="Left" Margin="315,190,0,0" VerticalAlignment="Top" Width="150"  FontWeight="Bold"/>  
        <Label x:Name="label2_Copy12" Content="$(CompareDesktopUserhomeTime(5))" HorizontalAlignment="Left" Margin="315,215,0,0" VerticalAlignment="Top" Width="150"  FontWeight="Bold"/>  
        <Label x:Name="label2_Copy13" Content="$(CompareDesktopUserhomeTime(6))" HorizontalAlignment="Left" Margin="315,240,0,0" VerticalAlignment="Top" Width="150"  FontWeight="Bold"/>  
        <Label x:Name="label2_Copy14" Content="$(CompareDesktopUserhomeTime(7))" HorizontalAlignment="Left" Margin="315,265,0,0" VerticalAlignment="Top" Width="150"  FontWeight="Bold"/>  
        <Label x:Name="Speicherort" Content="Durchsuchte Pfade:" HorizontalAlignment="Left" Margin="10,365,0,0" VerticalAlignment="Top" FontSize="14" Width="150"  FontWeight="Bold"/>  
            <Label x:Name="Ort" Content="" HorizontalAlignment="Left" Margin="150,365,0,0" VerticalAlignment="Top" FontSize="12" Width="350"/>  
        <Label x:Name="Durchsucht" Content="Speicherort:" HorizontalAlignment="Left" Margin="10,385,0,0" VerticalAlignment="Top" FontSize="14" Width="150"  FontWeight="Bold"/>  
            <Label x:Name="Suchen" Content="" HorizontalAlignment="Left" Margin="150,385,0,0" VerticalAlignment="Top" FontSize="12" Width="350"/>  
        <Label x:Name="Dateitypen" Content="Dateitypen:" HorizontalAlignment="Left" Margin="10,405,0,0" VerticalAlignment="Top" FontSize="14" Width="150"  FontWeight="Bold"/>  
            <Label x:Name="Typen" Content="*.csv,*.txt,*.docx,*.bat,*.pdf,*.pptx,*.xls" HorizontalAlignment="Left" Margin="150,405,0,0" VerticalAlignment="Top" FontSize="12" Width="350"/>  
    </Grid>
</Window>
"@        
$inputXML = $inputXML -replace 'mc:Ignorable="d"','' -replace "x:N",'N'  -replace '^<Win.*', '<Window'   
[void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')  
[xml]$XAML = $inputXML
$reader=(New-Object System.Xml.XmlNodeReader $xaml) 
$Form=[Windows.Markup.XamlReader]::Load( $reader )
$Datum = Get-Date -f "dd.MM.yyyy HH:mm"   
$xaml.SelectNodes("//*[@Name]") | %{Set-Variable -Name "WPF$($_.Name)" -Value $Form.FindName($_.Name)}  

##################    Dateien anzeigen  ###################
function CompareDesktopUserhomeName {
[CmdLetBinding()]
          param(
            [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)]
            [int]$Textbox
            )

$user = [Environment]::UserName
$desktop = Get-ChildItem -Path "$env:USERPROFILE\desktop\*" -Recurse | Where-Object {  
$_.Extension -eq ".exe" -or   
$_.Extension -eq ".csv" -or   
$_.Extension -eq ".txt" -or   
$_.Extension -eq ".docx" -or   
$_.Extension -eq ".bat" -or   
$_.Extension -eq ".pdf" -or   
$_.Extension -eq ".pptx" -or   
$_.Extension -eq ".xls"}   
$Userhome = get-childitem -Path "" -Recurse   

$Different = @(Compare-Object $desktop $Userhome -Property Name,Lastwritetime | Where-Object {$_.SideIndicator -eq "<="}| Select-Object -ExpandProperty Name)  
return $Different[$Textbox]
}
function CompareDesktopUserhomeTime {
[CmdLetBinding()]
          param(
            [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)]
            [int]$Textbox
            )
$user = [Environment]::UserName
$desktop = Get-ChildItem -Path "$env:USERPROFILE\desktop\*" -Recurse | Where-Object {  
$_.Extension -eq ".exe" -or   
$_.Extension -eq ".csv" -or   
$_.Extension -eq ".txt" -or   
$_.Extension -eq ".docx" -or   
$_.Extension -eq ".bat" -or   
$_.Extension -eq ".pdf" -or   
$_.Extension -eq ".pptx" -or   
$_.Extension -eq ".xls"}   
$Userhome = get-childitem -Path "" -Recurse   

$Different = Compare-Object $desktop $Userhome -Property Name,LastwriteTime | Where-Object {$_.SideIndicator -eq "<="}| Select-Object -ExpandProperty LastWriteTime  
return $Different[$Textbox]
}
##################    Maske SetVisible  ###################
    $Form.ShowDialog() | out-null
Mitglied: 114757
Solution 114757 Mar 24, 2016 updated at 14:30:21 (UTC)
Goto Top
Alles klar ich sehe den Fehler, du rufst in deinem XAML Code eine Powershellfunktion auf dies es zu diesem Zeitpunkt noch gar nicht gibt ! Die Felder können also aus Prinzip dann keinen Inhalt haben face-wink
Dazu musst du die Funktionen (CompareDesktopUserhomeTime etc.) schon vor der Deklaration der Variablen des XAML Codes schreiben. Dann geht das.
Das ist auch der Grund warum es erst später geht, weil dann ja deine Funktionen bereits vom Codeablauf her existieren.

Powershell ist immer noch eine Skriptsprache, dort kann man Funktionen nicht irgendwo platzieren, sondern diese müssen vor der Verwendung schon existieren, also im Code vor der eigentlichen Verwendung stehen.

Außerdem ruft man Powershellfunktionen nicht mit Klammern um die Parameter auf.

$(CompareDesktopUserhomeTime 7)
Mitglied: 124909
124909 Mar 24, 2016 at 17:47:34 (UTC)
Goto Top
Und am Ende ist es doch so trivial ! :D
Besten dank jodel und ein schönes verlängertes wochenende face-smile