Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst Powershell GUI bleibt während einer While schleife hängen...

Mitglied: Lennyy

Lennyy (Level 1) - Jetzt verbinden

05.12.2013, aktualisiert 09.12.2013, 6046 Aufrufe, 6 Kommentare, 3 Danke

Hallo alle zusammen!

Ich habe zuzeit ein Powershellproblem wo ich einfach nicht mehr weiterkomme. Ich hoffe ihr könnt mir hier helfen.

Vorgeschichte:

Ich schreibe ein kleines Powershell Backupporgramm mit GUI für unsere Kunden.
Das Programm besteht aus 3 Scripten und einer XML-Datei für die Einstellungen.

Einstellungen.ps1 -> Hier werden die Ziel und Quellpfade eingestellt und in der XML Datei gespeichert.
BackupAufExternenDatenträger.ps1 -> In diesem Script befindet sich die GUI (mit Prograssbar für die Fortschrittsanzeige) und der Backupjob
BackupAufInternenDatenträger.ps1 -> Das gleiche wie BackupAufExternenDatenträger.ps1 nur mit andernen Pfaden

Das Backup erfolgt mit Robocopy über den Befehl Start-Job:

$BackupJob = start-job -Name RIS-Backup -ArgumentList $SicherungsQuelle,$sicherungsPfad,$LogPath -scriptblock{
$LogPath = $args[2]
$Robocopy = robocopy $args[0] $args[1] /mir /V /LOG:$Logpath}

Nachdem der Job gestartet wurde gehts an die Fortschrittsberechnung.
Das habe ich einfach mit einer While-Schleife erledigt, die guckt wie groß sind die zu kopierenden Daten und wieviel wurde schon Kopiert das ganze wird dann noch in Prozent um gerechnet und in einer Progressbar angezeigt.


while ($BackupJob.State -eq "Running")
{

$Kopiert = (Get-ChildItem $sicherungsPfad -Recurse | Measure-Object -property length -sum)

$Kopiert = "{0:N2}" -f ($Kopiert.sum / 1GB) | % {$_ -replace ",","."}
$Prozentanzeiger = 0
$Prozentanzeiger = $Kopiert/$GesamtGrBackup*100
"{0:n1}" -f $Prozentanzeiger
$progressBar1.Value = $prozentanzeiger
### 2 Sekunden warten ###
ping -n 2 localhost | out-null
}


Das ganze Funktioniert wunderbar nur habe ich das Problem, dass solange die While schleife am laufen ist, ich nichts mehr in der GUI machen kann (z.b. den Button "Backup Stoppen" drücken oder das Fenster verschieben )

Ich hatte dann noch die Idee die Schleife auch einfach in einen eigenen Job zu packen dann allerdings wird die Progressbar nicht mehr aktualisiert.

Jetzt zu meiner Frage:

Wie schaffe ich es das die Progressbar durch die schleife aktualisiert wird (Mir also der Fortschritt in der GUI angezeigt wird) und ich gleichzeitig die GUI weiterbenutzen kann?
Mitglied: colinardo
LÖSUNG 05.12.2013, aktualisiert 09.12.2013
Hallo Lennyy,
da sei dir das Asynchrone Event-Handling der Powershell ans Herz gelegt:
http://blogs.technet.com/b/heyscriptingguy/archive/2011/06/16/use-async ...
Da du hier aber zusätzlich mit einer GUI arbeitest musst du dafür auch mit Delegates oder Runspaces via BeginInvoke arbeiten damit die GUI von einem anderen Thread aus "upgedated" werden kann.
Ein Beispiel kannst du hier sehen:
http://stackoverflow.com/questions/14401704/update-winforms-not-wpf-ui- ...
Du siehst das ganze ist nicht so simpel, les dich aber bitte erst mal ein ...

Grüße Uwe
Bitte warten ..
Mitglied: Lennyy
06.12.2013 um 10:26 Uhr
Hallo Uwe,

Vielen Dank erstmal für die schnelle Hilfe!
Ich werde mich jetzt mal daransetzen mir das ganze durchlesen und versuchen da etwas zusammenzubasteln...

Die ergebnisse werde ich dann später posten...

Grüße
Bitte warten ..
Mitglied: colinardo
LÖSUNG 06.12.2013, aktualisiert 09.12.2013
Hallo Lennyy,
da das ganze doch etwas Zeit zur Einarbeitung benötigt habe ich dir hier mal ein Beispiel mit einer Demo-Form zusammen gestellt bei der eine Progress-Bar durch einen parallelen RunSpace(Thread) aktualisiert wird:

01.

02.
#region Import the Assemblies
03.
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null
04.
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null
05.
#endregion
06.

07.
#region Generated Form Objects
08.
$form1 = New-Object System.Windows.Forms.Form
09.
$button1 = New-Object System.Windows.Forms.Button
10.
$progress = New-Object System.Windows.Forms.ProgressBar
11.
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
12.
#endregion Generated Form Objects
13.

14.
#Create synchronized Hashtable-Object for communication between sub-thread and form
15.
$syncHash = [hashtable]::Synchronized(@{})
16.
#set the controls in the hashtable we wish to manipulate
17.
$syncHash.progress = $progress
18.
# initialize second Powershell runspace
19.
$psCmd = [powershell]::Create()
20.
#----------------------------------------------
21.
#Generated Event Script Blocks
22.
#----------------------------------------------
23.
$handler_button1_Click= 
24.
{
25.
    if ($button1.Text -eq "Start"){
26.
        # create new runspace to run our sub-thread in
27.
        $newRunspace =[runspacefactory]::CreateRunspace()
28.
        $newRunspace.ApartmentState = "STA"
29.
        $newRunspace.ThreadOptions = "ReuseThread"          
30.
        $newRunspace.Open()
31.
        $newRunspace.SessionStateProxy.SetVariable("syncHash",$syncHash)
32.

33.
        $psCmd.AddScript({
34.
                              # in this expample we set the progress-bar value every 500 ms
35.
                              for ($i = 1;$i -le 10;$i++){
36.
                                  sleep -Milliseconds 500
37.
                                  $syncHash.progress.Value = $i * 10
38.
                              }
39.
                         })
40.
        $psCmd.Runspace = $newRunspace
41.
        #start the runspace
42.
        $data = $psCmd.BeginInvoke()
43.
        $button1.Text = "Stop"
44.
    }else{
45.
        $psCmd.Stop()
46.
        $button1.Text = "Start"
47.
    }
48.

49.
}
50.

51.
$OnLoadForm_StateCorrection=
52.
{#Correct the initial state of the form to prevent the .Net maximized form issue
53.
	$form1.WindowState = $InitialFormWindowState
54.
}
55.

56.
#----------------------------------------------
57.
#region Generated Form Code
58.
$System_Drawing_Size = New-Object System.Drawing.Size
59.
$System_Drawing_Size.Height = 74
60.
$System_Drawing_Size.Width = 292
61.
$form1.ClientSize = $System_Drawing_Size
62.
$form1.DataBindings.DefaultDataSourceUpdateMode = 0
63.
$form1.MaximizeBox = $False
64.
$form1.Name = "form1"
65.
$form1.Text = "ProgressForm"
66.

67.

68.
$button1.DataBindings.DefaultDataSourceUpdateMode = 0
69.

70.
$System_Drawing_Point = New-Object System.Drawing.Point
71.
$System_Drawing_Point.X = 12
72.
$System_Drawing_Point.Y = 41
73.
$button1.Location = $System_Drawing_Point
74.
$button1.Name = "button1"
75.
$System_Drawing_Size = New-Object System.Drawing.Size
76.
$System_Drawing_Size.Height = 23
77.
$System_Drawing_Size.Width = 268
78.
$button1.Size = $System_Drawing_Size
79.
$button1.TabIndex = 1
80.
$button1.Text = "Start"
81.
$button1.UseVisualStyleBackColor = $True
82.
$button1.add_Click($handler_button1_Click)
83.

84.
$form1.Controls.Add($button1)
85.

86.
$progress.DataBindings.DefaultDataSourceUpdateMode = 0
87.
$System_Drawing_Point = New-Object System.Drawing.Point
88.
$System_Drawing_Point.X = 12
89.
$System_Drawing_Point.Y = 12
90.
$progress.Location = $System_Drawing_Point
91.
$progress.Name = "progress"
92.
$System_Drawing_Size = New-Object System.Drawing.Size
93.
$System_Drawing_Size.Height = 23
94.
$System_Drawing_Size.Width = 268
95.
$progress.Size = $System_Drawing_Size
96.
$progress.TabIndex = 0
97.

98.
$form1.Controls.Add($progress)
99.

100.
#Save the initial state of the form
101.
$InitialFormWindowState = $form1.WindowState
102.
#Init the OnLoad event to correct the initial state of the form
103.
$form1.add_Load($OnLoadForm_StateCorrection)
104.
#----- Show Form
105.
$form1.ShowDialog() | out-null
Grüße Uwe
Bitte warten ..
Mitglied: Lennyy
06.12.2013, aktualisiert um 16:59 Uhr
Ich habe jetzt den halben nachmittag versucht die Runspaces in mein Script mit einzubauen...
Aber irgendwo habe ich noch einen Denkfehler!

Die Form startet ohne Fehler aber irgendwie passiert jetzt nischt mehr wenn ich auf den "Backup Starten"-Button drücke

Vielleicht sieht hier ja jemand wo mein Fehler liegt.

Hier erstmal das Script welches ich geschrieben habe:



Datensicherung mit Robocopy und Fortschritsanzeige in einem eigenen Job ###



  1. Load Assemblies
[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms.ProgressBar") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms.Button") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms.FormStartPosition.CenterScreen") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms.Label") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms.MessageBox") | Out-Null



### Der Pfad wo das Script ausgeführt wird wird ermittelt ###
### Wird Später zum holen der Quell und Zielpfade benötigt ###
$ScriptPath = [System.Management.Automation.InvocationInfo]$myInv=$myInvocation
$ScriptPath = $myInv.get_MyCommand().Definition
$ScriptPath = Split-Path $ScriptPath -parent


### Variablen Definieren ###


[XML]$xml = get-content $ScriptPath\Einstellungen.Xml
$SicherungsQuelle = $xml.Einstellungen.Quelle
$SicherungsZielExtern = $xml.Einstellungen.Extern
$SicherungPfad = "$SicherungsZielExtern\Backup"
$LogPath = "$SicherungsZielExtern\LOG\RIS-Backup.log"


$progressBar1 = new-object System.Windows.Forms.ProgressBar
$BackupAufExternenDatenträger = New-Object System.Windows.Forms.Form
$Label = new-object System.Windows.Forms.Label
$buttonBackupStarten = new-object System.Windows.Forms.Button
$buttonBeenden = new-object System.Windows.Forms.Button


### Überprüfen ob alle benötigten ordner vorhanden sind ###



  1. Es wird überprüft ob der Ordner für die logdateien vorhanden ist
$Test = Test-Path $SicherungsZielExtern\log
if($Test -eq $false){mkdir $SicherungsZielExtern\log|Out-Null;}


$Test = Test-Path ("$SicherungsZielExtern\Backup").ToString()
if($Test -eq $false){mkdir $SicherungsZielExtern\Backup|Out-Null;}



SCRIPT START

#Create synchronized Hashtable-Object for communication between sub-thread and form
$syncHash = [hashtable]::Synchronized(@{})
#set the controls in the hashtable we wish to manipulate
$syncHash.progress = $progressbar1
  1. initialize second Powershell runspace
$psCmd = [powershell]::Create()
#----------------------------------------------
#Generated Event Script Blocks
#----------------------------------------------
$handler_button1_Click=
{


### Größe des Backups ermitteln ###
$GesamtGrBackup = 0
$GesamtGrBackup = (Get-ChildItem $SicherungsQuelle -Recurse| Where-Object { `
($_.FullName -notlike "$sicherungsquelle\log*") -and `
($_.FullName -notlike "$sicherungsquelle\Foxfilm*") -and `
($_.FullName -notlike "$sicherungsquelle\datsic*") -and `
($_.FullName -notlike "$sicherungsquelle\Backup*") -and `
($_.FullName -notlike "$sicherungsquelle\ups*") } | Measure-Object -property length -sum)
$GesamtGrBackup = "{0:N2}" -f ($GesamtGrBackup.sum / 1GB) | % {$_ -replace ",","."}

$prozentanzeiger = 0
$progressBar1.Value = $prozentanzeiger

### Backup Starten ###
$label.Text = "Datensicherung läuft..."

$BackupJob = start-job -Name RIS-Backup -ArgumentList $SicherungsQuelle,$SicherungPfad,$LogPath -scriptblock{
$LogPath = $args[2]
$Robocopy = robocopy $args[0] $args[1] /mir /V /XD "Foxfilm" "log" "datsich" "backup" "upd" /LOG:$Logpath}

### Zeitstempel erfassen ###
$vorher = get-date


if ($buttonBackupStarten.Text = "Backup Starten"){
                          1. create new runspace to run our sub-thread in
                          $newRunspace =[runspacefactory]::CreateRunspace()
                          $newRunspace.ApartmentState = "STA"
                          $newRunspace.ThreadOptions = "ReuseThread"
                          $newRunspace.Open()
                          $newRunspace.SessionStateProxy.SetVariable("syncHash",$syncHash)

                          $psCmd.AddScript({
                          ### Nachdem das Backup gestartet wurde, ###
                          ### Wird hier der Fortschritt berechnet ###
                          while ($BackupJob.State -eq "Running")
                          {

                          $Kopiert = (Get-ChildItem $SicherungPfad -Recurse | Measure-Object -property length -sum)

                          $Kopiert = "{0:N2}" -f ($Kopiert.sum / 1GB) | % {$_ -replace ",","."}
                          $Prozentanzeiger = 0
                          $Prozentanzeiger = $Kopiert/$GesamtGrBackup*100
                          "{0:n1}" -f $Prozentanzeiger
                          $progressBar1.Value = $prozentanzeiger
                          ### 1 Sekunde warten ###
                          ping -n 2 localhost | out-null

                          if ($BackupJob.State -eq "Completed"){
                          ### Zeitstempel erfassen ###
                          $nachher = get-date
                          $zeit = "{0:N3}" -f ($nachher - $vorher).TotalMinutes

                          $label.Text = "Datensicherung Abgeschlossen in $zeit Minuten"; $label.ForeColor = "Green"}
                          }
                          })
                          $psCmd.Runspace = $newRunspace
                          #start the runspace
                          $data = $psCmd.BeginInvoke()

                          }

                          #else{
                                  1. $psCmd.Stop()
                                  2. $button1.Text = "Start"
                          #}


                          ### Der Button backuo Starten wird ausgeblendet und Backup beenden eingeblendet
                          $buttonBackupStarten.Visible = $false
                          $buttonBeenden.Visible = $true

                          }





                          function showform{




                          1. Init Form

                          $BackupAufExternenDatenträger.width = 546
                          $BackupAufExternenDatenträger.height = 163
                          $BackupAufExternenDatenträger.Text = "Passwort eingabe"
                          $BackupAufExternenDatenträger.StartPosition = [System.Windows.Forms.FormStartPosition]::CenterScreen
                          #progressBar1

                          $progressBar1.Location = new-object System.Drawing.Point(12, 47);
                          $progressBar1.Name = "progressBar1";
                          $progressBar1.Size = new-object System.Drawing.Size(353, 23);
                          #Label

                          $Label.AutoSize = $true;
                          $Label.Location = new-object System.Drawing.Point(71, 19);
                          $Label.Name = "Label";
                          $Label.Size = new-object System.Drawing.Size(226, 25);
                          $Label.Text = "Backup NICHT Gestartet";
                          #Logbutton
                          $Logbutton = new-object System.Windows.Forms.Button
                          $Logbutton.Location = new-object System.Drawing.Point(254, 76);
                          $Logbutton.Name = "Logbutton";
                          $Logbutton.Size = new-object System.Drawing.Size(111, 23);
                          $Logbutton.Text = "Logdatei Anzeigen";
                          $Logbutton.UseVisualStyleBackColor = $true;
                          1. buttonBackupStarten

                        $buttonBackupStarten.Location = New-Object System.Drawing.Point(12, 76);
                        $buttonBackupStarten.Name = "buttonBackupStarten";
                        $buttonBackupStarten.Size = New-Object System.Drawing.Size(94, 23);
                        $buttonBackupStarten.Text = "Backup Starten";
                        $buttonBackupStarten.UseVisualStyleBackColor = $true;
                        1. buttonBeenden

                      $buttonBeenden.Location = New-Object System.Drawing.Point(12, 76);
                      $buttonBeenden.Name = "buttonBeenen";
                      $buttonBeenden.Size = New-Object System.Drawing.Size(94, 30);
                      $buttonBeenden.Text = "Programm Beenden";
                      $buttonBeenden.UseVisualStyleBackColor = $true;
                      $buttonBeenden.Visible = $false
                      #BackupAufFestplatte
                      $BackupAufExternenDatenträger.AutoScaleDimensions = new-object System.Drawing.SizeF(6, 13);
                      $BackupAufExternenDatenträger.ClientSize = new-object System.Drawing.Size(377, 127);
                      $BackupAufExternenDatenträger.controls.Add($Logbutton);
                      $BackupAufExternenDatenträger.controls.Add($buttonBackupStarten);
                      $BackupAufExternenDatenträger.controls.Add($Label);
                      $BackupAufExternenDatenträger.controls.Add($progressBar1);
                      $BackupAufExternenDatenträger.controls.Add($Buttonbeenden);
                      $BackupAufExternenDatenträger.Name = "Backup auf Externen Datenträger";
                      $BackupAufExternenDatenträger.Text = "Backup auf Externen Datenrtäger";









                      ### Funktionen Definieren ###


                      1. Wenn ESC gedrückt wird wird das Programm beendet
                      $BackupAufExternenDatenträger.KeyPreview = $True
                      $BackupAufExternenDatenträger.Add_KeyDown({if ($_.KeyCode -eq "Escape") {$BackupAufExternenDatenträger.Close()} })



                      $buttonBackupStarten.Add_Click({ $handler_button1_Click })


                      $Logbutton.Add_Click({
                      if (Test-Path $LogPath){notepad $LogPath}
                      else{[System.Windows.Forms.MessageBox]::Show("Es wurde keine Logdatei gefunden"," ",0)}
                      })


                      $buttonBeenden.add_click({
                      $BackupAufExternenDatenträger.Close()
                      })




                      $BackupAufExternenDatenträger.ShowDialog()

                      }

                      showform






                      Und hier noch die XML-Datei aus der die Pfadeinstellungen ausgelesen wird:

                      <Einstellungen>
                      <Quelle>C:\TEST</Quelle>
                      <Intern>C:\Temp</Intern>
                      <Extern>C:\Temp2</Extern>
                      </Einstellungen>







                      Ich verstehe einfach nicht wo der Fehler liegt nach meinem Verständnis ist alles richtig (Ich bin allerdings auch noch grün hinter den Ohren was Powershell betrifft)

                      Ach ja und noch eine Frage habe ich: Wie bette ich den Quellcode hier so schön ein wie colinardo das oben gemacht hat?


                      Grüße
                      Lenny





                      EDIT: Überall wo die runden Punkte sind oder ne 1 steht sind eigentlich "#" keine ahnung warum das hier falsch angezeigt wird
Bitte warten ..
Mitglied: colinardo
LÖSUNG 06.12.2013, aktualisiert 09.12.2013
Zitat von Lennyy:
Ich verstehe einfach nicht wo der Fehler liegt nach meinem Verständnis ist alles richtig (Ich bin allerdings auch noch
grün hinter den Ohren was Powershell betrifft)
sieh dir mal das Beispiel genauer an, das ich dir erstellt habe, bei Dir fehlt ja die Hälfte davon...
Ach ja und noch eine Frage habe ich: Wie bette ich den Quellcode hier so schön ein wie colinardo das oben gemacht hat?
das machst du mit Tags zur Codeformatierung.

Grüße Uwe
Bitte warten ..
Mitglied: Lennyy
09.12.2013 um 17:00 Uhr
Zitat von colinardo:

> Zitat von Lennyy:
> Ich verstehe einfach nicht wo der Fehler liegt nach meinem Verständnis ist alles richtig (Ich bin allerdings auch noch
> grün hinter den Ohren was Powershell betrifft)
sieh dir mal das Beispiel genauer an, das ich dir erstellt habe, bei Dir fehlt ja die Hälfte davon...

Ich habe mir heute dein Beispiel nochmal genauer angesehen und jetzt habe ich ein Funktionierendes Script wo die Progressbar Aktualisiert wird ohne das dass Script hängen bleibt!

Vielen Dank für deine Hilfe - Ohne das Beispiel von dir hättte ich warscheinlich noch ne ganze weile daran gesessen...

Hier noch einmal das Fertigt Script:

01.
#################################################################################
02.
#### Datensicherung mit Robocopy und Fortschritsanzeige in einem eigenen Job  ###
03.
#################################################################################
04.

05.

06.
            ### HIER BEGINNT DAS SCRIPT ###
07.

08.
#region Import the Assemblies
09.
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null
10.
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null
11.
#endregion
12.

13.
            ### Der Pfad wo das Script ausgeführt wird wird ermittelt  ###
14.
            ### Wird Später zum holen der Quell und Zielpfade benötigt ###
15.

16.
$ScriptPath = [System.Management.Automation.InvocationInfo]$myInv=$myInvocation
17.
$ScriptPath = $myInv.get_MyCommand().Definition
18.
$ScriptPath = Split-Path $ScriptPath -parent
19.

20.

21.
            ###########################################################
22.
            ### Überprüfen ob alle benötigten ordner vorhanden sind ###
23.
            ###########################################################
24.

25.

26.
# Es wird überprüft ob der Ordner für die logdateien vorhanden ist
27.
$Test = Test-Path $SicherungsZielExtern\log
28.
if($Test -eq $false){mkdir $SicherungsZielExtern\log|Out-Null;}
29.

30.

31.
$Test = Test-Path  ("$SicherungsZielExtern\Backup").ToString() 
32.
if($Test -eq $false){mkdir $SicherungsZielExtern\Backup|Out-Null;}
33.

34.
            ############################
35.
            ### Variablen Definieren ###
36.
            ############################
37.

38.
[XML]$xml = get-content $ScriptPath\Einstellungen.Xml
39.
$SicherungsQuelle = $xml.Einstellungen.Quelle
40.
$SicherungsZielExtern = $xml.Einstellungen.Extern
41.

42.

43.
$SicherungPfad = "$SicherungsZielExtern\Backup"
44.
$LogPath = "$SicherungsZielExtern\LOG\RIS-Backup.log"
45.
 
46.

47.
#region Generated Form Objects
48.
$BackupAufExternenDatenträger = New-Object System.Windows.Forms.Form
49.
$buttonBackupStarten = New-Object System.Windows.Forms.Button
50.
$progressBar1 = New-Object System.Windows.Forms.ProgressBar
51.
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
52.
$Logbutton = New-Object System.Windows.Forms.Button
53.
$Label = New-Object System.Windows.Forms.label
54.
#endregion Generated Form Objects
55.

56.

57.

58.
#Create synchronized Hashtable-Object for communication between sub-thread and form
59.
$syncHash = [hashtable]::Synchronized(@{})
60.
#set the controls in the hashtable we wish to manipulate
61.
$syncHash.progress = $progressBar1
62.
# initialize second Powershell runspace
63.
$psCmd = [powershell]::Create()
64.
#----------------------------------------------
65.
#Generated Event Script Blocks
66.
#----------------------------------------------
67.
$handler_button1_Click= 
68.
{
69.
 ### Größe des Backups ermitteln ###
70.
$GesamtGrBackup = 0
71.
$GesamtGrBackup = (Get-ChildItem $SicherungsQuelle -Recurse| Where-Object { `
72.
    ($_.FullName -notlike "$sicherungsquelle\log*") -and  `
73.
    ($_.FullName -notlike "$sicherungsquelle\Foxfilm*") -and  `
74.
    ($_.FullName -notlike "$sicherungsquelle\datsic*") -and  `
75.
    ($_.FullName -notlike "$sicherungsquelle\Backup*") -and  `
76.
    ($_.FullName -notlike "$sicherungsquelle\ups*")  }    | Measure-Object -property length -sum) 
77.
$GesamtGrBackup = "{0:N2}" -f ($GesamtGrBackup.sum / 1GB) | % {$_ -replace ",","."}
78.

79.
$prozentanzeiger = 0
80.
$progressBar1.Value = $prozentanzeiger
81.

82.
### Zeitstempel erfassen ###
83.
$vorher = get-date
84.
    
85.
### Backup Starten ###
86.
$label.Text = "Datensicherung läuft..."
87.

88.
$BackupJob = start-job -Name RIS-Backup -ArgumentList $SicherungsQuelle,$SicherungPfad,$LogPath -scriptblock{ 
89.
    $LogPath = $args[2]
90.
    $Robocopy = robocopy $args[0] $args[1] /mir /V /XD "Foxfilm" "log" "datsich" "backup" "upd" /LOG:$LogPath }
91.
       
92.
### Zeitstempel erfassen ###
93.
$vorher = get-date      
94.

95.
### 1 Sekunde warten ### WENN NICHT GEWARTET WIRD KANN ES PROBLEME MIT DER PROGRESSBAR GEBEN !
96.
#ping -n 1 localhost | out-null
97.

98.

99.
        # create new runspace to run our sub-thread in
100.
        $newRunspace =[runspacefactory]::CreateRunspace()
101.
        $newRunspace.ApartmentState = "STA"
102.
        $newRunspace.ThreadOptions = "ReuseThread"          
103.
        $newRunspace.Open()
104.
        $newRunspace.SessionStateProxy.SetVariable("syncHash",$syncHash)
105.
        $newRunspace.SessionStateProxy.SetVariable("SicherungPfad",$SicherungPfad)
106.
        $newRunspace.SessionStateProxy.SetVariable("BackupJob",$BackupJob)
107.
        $newRunspace.SessionStateProxy.SetVariable("vorher",$vorher)
108.
        $newRunspace.SessionStateProxy.SetVariable("label",$label)
109.
        $newRunspace.SessionStateProxy.SetVariable("buttonBackupStarten",$buttonBackupStarten)
110.
        $newRunspace.SessionStateProxy.SetVariable("buttonBeenden",$buttonBeenden)
111.
        $newRunspace.SessionStateProxy.SetVariable("GesamtGrBackup",$GesamtGrBackup)
112.
        $newRunspace.SessionStateProxy.SetVariable("psCmd",$psCmd)
113.

114.

115.

116.
        $psCmd.AddScript({
117.

118.

119.
                                    ### Nachdem das Backup gestartet wurde, ### 
120.
                                    ### Wird hier der Fortschritt berechnet ###
121.
                                    while ($BackupJob.State -eq "Running")
122.
                                    {
123.

124.
                                    
125.

126.
                                        $Kopiert = (Get-ChildItem $SicherungPfad -Recurse | Measure-Object -property length -sum) 
127.

128.
                                        $Kopiert = "{0:N2}" -f ($Kopiert.sum / 1GB) | % {$_ -replace ",","."}
129.
                                        $Prozentanzeiger = 0
130.
                                        $Prozentanzeiger = $Kopiert/$GesamtGrBackup*100
131.
                                        "{0:n1}" -f $Prozentanzeiger  
132.

133.
                                        $syncHash.progress.Value = $prozentanzeiger
134.
                                     }
135.
                                     
136.
                                     
137.

138.
                                                if ($BackupJob.State -eq "Completed"){
139.
                                                    ### Zeitstempel erfassen ###
140.
                                                    $nachher = get-date
141.
                                                    $zeit = "{0:N3}" -f ($nachher - $vorher).TotalMinutes
142.

143.
                                                    $label.Text = "Datensicherung Abgeschlossen in $zeit Minuten"; $label.ForeColor = "Green"
144.
                                                
145.
                                                    #[System.Windows.Forms.MessageBox]::Show("dümdüm"," ",0)
146.
                                                                                     }
147.

148.

149.
                                                ### Der Button backuo Starten wird ausgeblendet und Backup beenden eingeblendet        
150.
                                                $buttonBackupStarten.Visible = $false
151.
                                                $buttonBeenden.Visible = $true
152.
                                                #$psCmd.Stop() 
153.

154.

155.
                         })
156.
        $psCmd.Runspace = $newRunspace
157.
        #start the runspace
158.
        $data = $psCmd.BeginInvoke()
159.

160.

161.
}
162.

163.
$OnLoadForm_StateCorrection=
164.
{#Correct the initial state of the form to prevent the .Net maximized form issue
165.
	$BackupAufExternenDatenträger.WindowState = $InitialFormWindowState
166.
}
167.

168.

169.

170.
$handler_Logbutton_Click ={
171.
    if (Test-Path $LogPath){notepad $LogPath}
172.
    else{[System.Windows.Forms.MessageBox]::Show("Es wurde keine Logdatei gefunden"," ",0)}
173.
                            }
174.

175.

176.

177.
$handler_ButtonBeenden_Click ={
178.
$BackupAufExternenDatenträger.Close()
179.
                                }
180.

181.

182.
            ###########################################################
183.
            ########## Ab hier wird die Windows.Form Designt ##########
184.
            ###########################################################
185.

186.

187.
# Init Form
188.
#
189.
$BackupAufExternenDatenträger.width = 546
190.
$BackupAufExternenDatenträger.height = 163
191.
$BackupAufExternenDatenträger.StartPosition = [System.Windows.Forms.FormStartPosition]::CenterScreen 
192.
#
193.
#progressBar1
194.
#
195.
$progressBar1.Location = new-object System.Drawing.Point(12, 47);
196.
$progressBar1.Name = "progressBar1";
197.
$progressBar1.Size = new-object System.Drawing.Size(353, 23);
198.
$progressBar1.DataBindings.DefaultDataSourceUpdateMode = 0
199.
$progressBar1.TabIndex = 0
200.
#
201.
#Label
202.
#
203.
$Label.AutoSize = $true;
204.
$Label.Location = new-object System.Drawing.Point(71, 19);
205.
$Label.Name = "Label";
206.
$Label.Size = new-object System.Drawing.Size(226, 25);
207.
$Label.Text = "Backup NICHT Gestartet";
208.
#
209.
#Logbutton
210.
#
211.
$Logbutton.Location = new-object System.Drawing.Point(254, 76);
212.
$Logbutton.Name = "Logbutton";
213.
$Logbutton.Size = new-object System.Drawing.Size(111, 23);
214.
$Logbutton.Text = "Logdatei Anzeigen";
215.
$Logbutton.UseVisualStyleBackColor = $true;
216.
$Logbutton.add_Click($handler_Logbutton_Click)
217.
#
218.
# buttonBackupStarten
219.
#
220.
$buttonBackupStarten.Location = New-Object System.Drawing.Point(12, 76);
221.
$buttonBackupStarten.Name = "buttonBackupStarten";
222.
$buttonBackupStarten.Size = New-Object System.Drawing.Size(94, 23);
223.
$buttonBackupStarten.Text = "Backup Starten";
224.
$buttonBackupStarten.UseVisualStyleBackColor = $true;
225.
$buttonBackupStarten.TabIndex = 1
226.
$buttonBackupStarten.add_Click($handler_button1_Click)
227.
$buttonBackupStarten.DataBindings.DefaultDataSourceUpdateMode = 0
228.
#
229.
# buttonBeenden
230.
#
231.
$buttonBeenden = new-object System.Windows.Forms.Button
232.
$buttonBeenden.Location = New-Object System.Drawing.Point(12, 76);
233.
$buttonBeenden.Name = "buttonBeenen";
234.
$buttonBeenden.Size = New-Object System.Drawing.Size(94, 30);
235.
$buttonBeenden.Text = "Programm Beenden";
236.
$buttonBeenden.UseVisualStyleBackColor = $true;
237.
$buttonBeenden.Visible = $false
238.
$buttonBeenden.add_click({$handler_ButtonBeenden_Click})
239.
#
240.
#BackupAufFestplatte
241.
#
242.
$BackupAufExternenDatenträger.AutoScaleDimensions = new-object System.Drawing.SizeF(6, 13);
243.
$BackupAufExternenDatenträger.ClientSize = new-object System.Drawing.Size(377, 127);
244.
$BackupAufExternenDatenträger.controls.Add($Logbutton);
245.
$BackupAufExternenDatenträger.controls.Add($buttonBackupStarten);
246.
$BackupAufExternenDatenträger.controls.Add($Label);
247.
$BackupAufExternenDatenträger.controls.Add($progressBar1);
248.
$BackupAufExternenDatenträger.controls.Add($Buttonbeenden);
249.
$BackupAufExternenDatenträger.Name = "Backup auf Externen Datenträger";
250.
$BackupAufExternenDatenträger.Text = "Backup auf Externen Datenrtäger";
251.
$BackupAufExternenDatenträger.DataBindings.DefaultDataSourceUpdateMode = 0
252.
$BackupAufExternenDatenträger.MaximizeBox = $False
253.

254.

255.
#Save the initial state of the form
256.
$InitialFormWindowState = $BackupAufExternenDatenträger.WindowState
257.
#Init the OnLoad event to correct the initial state of the form
258.
$BackupAufExternenDatenträger.add_Load($OnLoadForm_StateCorrection)
259.
#----- Show Form
260.
$BackupAufExternenDatenträger.ShowDialog() | out-null
261.

262.

263.


UND die Einstellungen.xml:

01.
<Einstellungen>
02.
  <Quelle>C:\Temp</Quelle>
03.
  <Intern>C:\Temp3</Intern>
04.
  <Extern>C:\temp2</Extern>
05.
</Einstellungen>
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
PowerShell GUI WPF
gelöst Frage von derhoeppiBatch & Shell18 Kommentare

Hallo, heute habe ich hoffentlich wieder ein einfaches Thema. Und zwar besitzt meiner GUI (WPF) einige Checkboxen und auch ...

Batch & Shell
Powershell Neustart GUI
gelöst Frage von 136430Batch & Shell9 Kommentare

Hallo ich möchte in einer GUI einem User einen Neustart eines Remotecomputers zur Verfügung stellen, der user führt das ...

Windows 10
Powershell GUI Skript Filehash
gelöst Frage von BaphometWindows 104 Kommentare

Hallo Community, da ich mich erst sehr kurzzeitig mit der PS befasse tauchen immer wieder Fragen auf. > Ich ...

Batch & Shell
Powershell - GUI Elemente verstecken
gelöst Frage von BuggerBatch & Shell2 Kommentare

Hallo zusammen, ich möchte mit einer Checkbox einige Elemente verstecken. Dafür habe ich diesen Befehl: Somit zeigt er das ...

Neue Wissensbeiträge
Windows 10

Windows 10 - Programme laufen schneller, wenn Sie mit Administratorrechten ausgeführt werden

Erfahrungsbericht von 1Werner1 vor 22 StundenWindows 107 Kommentare

Moin, das wollte ich erst nicht glauben, aber es ist so. Wenn Ihr ein Programm mit Administratorrechten unter Windows ...

Sicherheits-Tools
Putty hat heftige Bugs korrigiert!
Information von Lochkartenstanzer vor 1 TagSicherheits-Tools5 Kommentare

Moin, Wie man aus herauslesen kann, sind in den Versionen vor 0.71 gravierende Bugs, die es angeraten erscheinen lassen, ...

Off Topic
Sachen die die Welt nicht braucht - Platz 1
Tipp von brammer vor 4 TagenOff Topic21 Kommentare

Hallo, ich habs als Tipp angelegt als Erfahrungsbericht nein Danke brammer

Humor (lol)
Spirit of Health-Kongress in Berlin
Information von AnkhMorpork vor 5 TagenHumor (lol)6 Kommentare

tgif! Beim dritten Spirit of Health-Kongress trafen sich am Wochenende Alternativmediziner und Naturheilkundler im Maritim Hotel Berlin, um sich ...

Heiß diskutierte Inhalte
Hardware
Telefonanlagen - Welche gibt es
Frage von Xaero1982Hardware25 Kommentare

Nabend Zusammen, ich suche eine neue TK Anlage und mein Auftraggeber will jetzt was völlig neues - State of ...

Windows Server
Eingeschränkte Gruppen - Spezielle Benutzergruppe hinzufügen
Frage von killtecWindows Server17 Kommentare

Hallo, ich möchte gerne folgendes Realisieren: Ich habe bei mir Eingeschränkte Gruppen via GPO aktiv und möchte nun der ...

Microsoft Office
Videodateien auf Windows Server 2008 R2 öffnen schlägt fehl
Frage von SchroediMicrosoft Office16 Kommentare

Hallo zusammen, wir haben das Problem das embedded Videos in PowerPoint (O365) auf unserer Citrix Farm (6.5) nicht abgespielt ...

LAN, WAN, Wireless
Intel(R) PRO Wireless 3945ABG
gelöst Frage von Leon509LAN, WAN, Wireless15 Kommentare

Hallo, habe ein Laptop Fujitsu (Intel, 4GB, 2GHz, Windos10, Intel(R) PRO/Wireless 3945ABG ) ein O2 DSL Anschluss Home50. Leider ...