highspeed1
Goto Top

Powershell Kopiervorgang und StatusBar mit hochlaufender Prozentzahl

Hallo zusammen.

Ich will ein Programm schreiben das Dateien kopiert. In der Statusbar soll die Anzahl der bereits kopierten Dateien angezeigt werden. An welcher Stelle muss ich den Kopiervorgang einbauen damit er abgearbeitet wird?

1

function Get-InstallPrg
{
    Add-Type -AssemblyName System.Windows.Forms
    Add-Type -AssemblyName System.Drawing

    $DialogBoxSizeX = 500
    $DialogBoxSizeY = 300

    $form = New-Object System.Windows.Forms.Form
    $form.Text = "Text"  
    $form.Size = New-Object System.Drawing.Size($DialogBoxSizeX,$DialogBoxSizeY)
    $form.MinimumSize = New-Object System.Drawing.Size($DialogBoxSizeX,$DialogBoxSizeY)
    $form.MaximumSize = New-Object System.Drawing.Size($DialogBoxSizeX,$DialogBoxSizeY)

    $form.Icon = $Icon
    $form.StartPosition = 'CenterScreen'  

    # --- Statusbar ---
    $StatusBarText = "Anzahl kopierte Dateien:"  
    $StatusBar = New-Object System.Windows.Forms.StatusBar
    $StatusBar.Dock = "bottom"  
    $Form.Controls.Add($StatusBar)

# Code ab hier
    $Counter = 0
    0..10 | foreach {
  #Hier soll kopiert werden und Status verändert werden
        $StatusBar.Text =  $StatusBarText + $_
        $Form.Controls.Add($StatusBar)
        sleep -Milliseconds 100
    }
# Bis hier

    $form.Topmost = $true
    
    $form.ShowDialog()
}
Get-InstallPrg

Kann mir hier jemand helfen.
Danke.

HighSpeed1

Content-ID: 52975218870

Url: https://administrator.de/forum/powershell-kopiervorgang-und-statusbar-mit-hochlaufender-prozentzahl-52975218870.html

Ausgedruckt am: 23.12.2024 um 05:12 Uhr

7907292512
7907292512 11.09.2023 aktualisiert um 14:15:07 Uhr
Goto Top
Here you go:

Powershell GUI bleibt während einer While schleife hängen...
Powershell progressbar AND multitask

Add-Type -A System.Windows.Forms
# synchronized Hashtable für den Austausch von Daten zwischen den Threads erstellen
$ht = [hashtable]::Synchronized(@{})
# Powershell thread erstellen
$ps = [powershell]::Create()
# die Hashtable als Variable "ht" dem Powershell-Runspace hinzufügen 
$ps.Runspace.SessionStateProxy.SetVariable("ht",$ht)      
#form erzeugen
$form = New-Object System.Windows.Forms.Form -P @{
    ClientSize = '200,80'  
    Text = "Copystatus"  
}
# button erzeugen
$btn = New-Object System.Windows.Forms.Button -P @{
    Text = "Start copy"  
    Location = '10,20'  
    Size = '180,30'  
    Anchor = 'Bottom,Left,Right'  
    # aktion wenn auf den Button geklickt wird
    add_Click = {
        # dem separaten Powershell Thread ein Skript hinzufügen
        $ps.AddScript({
            # hier statt der Schleife die Aktionen einfügen und Updates an die Statusbar schicken:
            1..10 | %{
                $ht.statusbar.Text = "Datei $_"  
                sleep -Milliseconds 500
            }
            $ht.statusbar.Text = "Fertig"  
        })
        $ps.BeginInvoke()
    }
}
$statusbar = [System.Windows.Forms.StatusBar]@{
    Dock = "Bottom"  
}
$ht.statusbar = $statusbar
$form.Controls.AddRange(@($statusbar,$btn))
[void]$form.ShowDialog()
$ps.Dispose()

Gruß sid.
HighSpeed1
HighSpeed1 11.09.2023 um 13:59:44 Uhr
Goto Top
Hallo Siddius.

So ganz blicke ich da nicht durch. Ich habe noch nie mit Runspace gearbeitet.

1. Runspace erzeugen
2. open()
3. Alle Variablen mit reinpacken
4. BeginInvoke()

Hab ich das so richtig verstanden?

        $newRunspace =[runspacefactory]::CreateRunspace()
        $newRunspace.ApartmentState = "STA"    
        $newRunspace.ThreadOptions = "ReuseThread"              
        $newRunspace.Open()
        $newRunspace.SessionStateProxy.SetVariable("syncHash",$syncHash)    
        $newRunspace.SessionStateProxy.SetVariable("SicherungPfad",$SicherungPfad)    
        $newRunspace.SessionStateProxy.SetVariable("BackupJob",$BackupJob)  

       $newRunspace.SessionStateProxy.SetVariable("psCmd",$psCmd)    

        $psCmd.AddScript({

              # Hier PRG-Abschnitt einfügen

        })

        $psCmd.Runspace = $newRunspace
        #start the runspace
        $data = $psCmd.BeginInvoke()
7907292512
7907292512 11.09.2023 aktualisiert um 14:00:27 Uhr
Goto Top
Siehe ergänztes ganz einfaches Bsp oben.
HighSpeed1
HighSpeed1 11.09.2023 um 14:01:37 Uhr
Goto Top
Mein Problem ist das ich kein Startereignis habe. Sobald das Fenster aufgeht soll es losgehen.
7907292512
Lösung 7907292512 11.09.2023 aktualisiert um 14:14:54 Uhr
Goto Top
Zitat von @HighSpeed1:

Mein Problem ist das ich kein Startereignis habe. Sobald das Fenster aufgeht soll es losgehen.
Nimmst du halt einfach das Load- oder Shown-Event der Form das startet sobald die Form offen ist.

Add-Type -A System.Windows.Forms
$ht = [hashtable]::Synchronized(@{})
$ps = [powershell]::Create()
$ps.Runspace.SessionStateProxy.SetVariable("ht",$ht)      

$form = New-Object System.Windows.Forms.Form -P @{
    ClientSize = '200,80'  
    Text = "Copystatus"  
    add_Shown = {
        $ps.AddScript({
            1..10 | %{
                $ht.statusbar.Text = "Datei $_ von 10 wird kopiert."  
                sleep -Milliseconds 500
            }
            $ht.statusbar.Text = "Fertig"  
        })
        $ps.BeginInvoke()
    }
}
$statusbar = [System.Windows.Forms.StatusBar]@{
    Dock = "Bottom"  
}
$ht.statusbar = $statusbar
$form.Controls.Add($statusbar)
[void]$form.ShowDialog()
$ps.Dispose()

RTFM => Form.Load Ereignis
HighSpeed1
HighSpeed1 11.09.2023 um 14:09:30 Uhr
Goto Top
$form.add_shown() das ist es was ich gesucht habe. Wo kann man eigentlich eine vollständige Liste der Befehle .add_xxx finden?

Danke für deine Hilfe.
7907292512
7907292512 11.09.2023 aktualisiert um 14:21:34 Uhr
Goto Top
Zitat von @HighSpeed1:
Wo kann man eigentlich eine vollständige Liste der Befehle .add_xxx finden?

Danke für deine Hilfe.
In der .NET System.Windows.Forms Doku die "Ereignisse" für jedes Control (Links "Ereignisse" auswählen)


screenshot

Aber Achtung der MS Übersetzer übersetzt die Ereignisse teilweise ins Deutsche du musst aber die englischen Bezeichnungen nehmen, also die Seite besser auf Englisch umstellen.
Das "add_" ist nur ein Prefix von Powershell das man für das Ansprechen der Events benutzen muss, die Doku ist aber trotzdem die gleiche weil dies die selben Objekte sind.
HighSpeed1
HighSpeed1 11.09.2023 um 14:23:09 Uhr
Goto Top
Danke.