Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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...

Frage Entwicklung Batch & Shell

Mitglied: Lennyy

Lennyy (Level 1) - Jetzt verbinden

05.12.2013, aktualisiert 09.12.2013, 4611 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 ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst Cmd Befehle in Powershell GUI aufrufen (5)

Frage von Markus2016 zum Thema Batch & Shell ...

Batch & Shell
gelöst Powershell Windows Update Management - get-WUinstall bleibt hängen (10)

Frage von MartinAD zum Thema Batch & Shell ...

Windows 7
Windows installation bleibt hängen (13)

Frage von jensgebken zum Thema Windows 7 ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...