From d091fe336e829408cc82f1910aacc4744574593a Mon Sep 17 00:00:00 2001 From: mistangl Date: Tue, 13 Jun 2023 15:37:11 +0200 Subject: [PATCH] Unterordner dazu --- IO-Konvertierer.ps1 | 2163 +++++++++++++++++ Test-Dateien/BELYARN_20230404.txt | 554 +++++ Test-Dateien/BENIN_20221208.txt | 636 +++++ .../EinstellungenSkriptKonvertierung.txt | 15 + .../EinstellungenSkriptKonvertierung2.txt | 2 + ...nstellungenSkriptKonvertierung_m.kraft.txt | 13 + Test-Skripte/Excel-Datei erstellen.ps1 | 14 + Test-Skripte/GUI-Angepasst1.ps1 | 268 ++ Test-Skripte/GUI-Angepasst2.ps1 | 1097 +++++++++ Test-Skripte/GUI-Angepasst2_Backup1.ps1 | 359 +++ Test-Skripte/GUI-Angepasst2_Backup2.ps1 | 387 +++ ...UI-Angepasst2_FunktionierenderExplorer.ps1 | 391 +++ Test-Skripte/GUI-Angepasst2_Lauffaehig.ps1 | 1005 ++++++++ Test-Skripte/GUI-Angepasst3.ps1 | 264 ++ Test-Skripte/GUI-Angepasst4.ps1 | 1090 +++++++++ Test-Skripte/GUI-Angepasst4_Backup1.ps1 | 1270 ++++++++++ Test-Skripte/GUI-Angepasst5 - Backup1.ps1 | 1515 ++++++++++++ Test-Skripte/GUI-Angepasst5.ps1 | 1604 ++++++++++++ Test-Skripte/GUI-Angepasst6 - Kommentare.ps1 | 1658 +++++++++++++ Test-Skripte/GUI-Angepasst6.ps1 | 2142 ++++++++++++++++ Test-Skripte/GUI-Vorlage.ps1 | 43 + Test-Skripte/Skript1.ps1 | 10 + Test-Skripte/Skript10.ps1 | 17 + Test-Skripte/Skript11.ps1 | 29 + Test-Skripte/Skript12.ps1 | 5 + Test-Skripte/Skript13 copy.ps1 | 17 + Test-Skripte/Skript13.ps1 | 17 + Test-Skripte/Skript14.ps1 | 107 + Test-Skripte/Skript15.ps1 | 8 + Test-Skripte/Skript16.ps1 | 14 + Test-Skripte/Skript17.ps1 | 50 + Test-Skripte/Skript18.ps1 | 62 + Test-Skripte/Skript19.ps1 | 3 + Test-Skripte/Skript2-EA.ps1 | 106 + Test-Skripte/Skript2.ps1 | 106 + Test-Skripte/Skript3.ps1 | 39 + Test-Skripte/Skript4.ps1 | 7 + Test-Skripte/Skript5.ps1 | 13 + Test-Skripte/Skript6.ps1 | 32 + Test-Skripte/Skript7.ps1 | 25 + Test-Skripte/Skript8.ps1 | 16 + Test-Skripte/Skript9.ps1 | 143 ++ Test-Skripte/Txt-Dateien-Test.ps1 | 49 + doc/Anleitung.one | Bin 0 -> 1390360 bytes doc/Bilder Anleitung/01_Einrichten.JPG | Bin 0 -> 40548 bytes doc/Bilder Anleitung/01_Export.jpg | Bin 0 -> 172212 bytes doc/Bilder Anleitung/02_Einrichten.JPG | Bin 0 -> 69515 bytes doc/Bilder Anleitung/02_Export.jpg | Bin 0 -> 31704 bytes doc/Bilder Anleitung/02_Export_besser.jpg | Bin 0 -> 52649 bytes doc/Bilder Anleitung/03_Einrichten.JPG | Bin 0 -> 101874 bytes doc/Bilder Anleitung/03_Export.jpg | Bin 0 -> 185444 bytes doc/Bilder Anleitung/04_Einrichten.JPG | Bin 0 -> 55484 bytes doc/Bilder Anleitung/05_Einrichten.JPG | Bin 0 -> 92622 bytes doc/Bilder Anleitung/06_Einrichten.JPG | Bin 0 -> 62024 bytes doc/Bilder Anleitung/Thumbs.db | Bin 0 -> 74752 bytes doc/Erster Start und Einrichtung.pdf | Bin 0 -> 927887 bytes doc/Export BricsCAD.pdf | Bin 0 -> 729846 bytes doc/IO_besser_V2.txt | 8 + doc/LinksammlungPowerShell.md | 85 + 59 files changed, 17458 insertions(+) create mode 100644 IO-Konvertierer.ps1 create mode 100644 Test-Dateien/BELYARN_20230404.txt create mode 100644 Test-Dateien/BENIN_20221208.txt create mode 100644 Test-Skripte/EinstellungenSkriptKonvertierung.txt create mode 100644 Test-Skripte/EinstellungenSkriptKonvertierung2.txt create mode 100644 Test-Skripte/EinstellungenSkriptKonvertierung_m.kraft.txt create mode 100644 Test-Skripte/Excel-Datei erstellen.ps1 create mode 100644 Test-Skripte/GUI-Angepasst1.ps1 create mode 100644 Test-Skripte/GUI-Angepasst2.ps1 create mode 100644 Test-Skripte/GUI-Angepasst2_Backup1.ps1 create mode 100644 Test-Skripte/GUI-Angepasst2_Backup2.ps1 create mode 100644 Test-Skripte/GUI-Angepasst2_FunktionierenderExplorer.ps1 create mode 100644 Test-Skripte/GUI-Angepasst2_Lauffaehig.ps1 create mode 100644 Test-Skripte/GUI-Angepasst3.ps1 create mode 100644 Test-Skripte/GUI-Angepasst4.ps1 create mode 100644 Test-Skripte/GUI-Angepasst4_Backup1.ps1 create mode 100644 Test-Skripte/GUI-Angepasst5 - Backup1.ps1 create mode 100644 Test-Skripte/GUI-Angepasst5.ps1 create mode 100644 Test-Skripte/GUI-Angepasst6 - Kommentare.ps1 create mode 100644 Test-Skripte/GUI-Angepasst6.ps1 create mode 100644 Test-Skripte/GUI-Vorlage.ps1 create mode 100644 Test-Skripte/Skript1.ps1 create mode 100644 Test-Skripte/Skript10.ps1 create mode 100644 Test-Skripte/Skript11.ps1 create mode 100644 Test-Skripte/Skript12.ps1 create mode 100644 Test-Skripte/Skript13 copy.ps1 create mode 100644 Test-Skripte/Skript13.ps1 create mode 100644 Test-Skripte/Skript14.ps1 create mode 100644 Test-Skripte/Skript15.ps1 create mode 100644 Test-Skripte/Skript16.ps1 create mode 100644 Test-Skripte/Skript17.ps1 create mode 100644 Test-Skripte/Skript18.ps1 create mode 100644 Test-Skripte/Skript19.ps1 create mode 100644 Test-Skripte/Skript2-EA.ps1 create mode 100644 Test-Skripte/Skript2.ps1 create mode 100644 Test-Skripte/Skript3.ps1 create mode 100644 Test-Skripte/Skript4.ps1 create mode 100644 Test-Skripte/Skript5.ps1 create mode 100644 Test-Skripte/Skript6.ps1 create mode 100644 Test-Skripte/Skript7.ps1 create mode 100644 Test-Skripte/Skript8.ps1 create mode 100644 Test-Skripte/Skript9.ps1 create mode 100644 Test-Skripte/Txt-Dateien-Test.ps1 create mode 100644 doc/Anleitung.one create mode 100644 doc/Bilder Anleitung/01_Einrichten.JPG create mode 100644 doc/Bilder Anleitung/01_Export.jpg create mode 100644 doc/Bilder Anleitung/02_Einrichten.JPG create mode 100644 doc/Bilder Anleitung/02_Export.jpg create mode 100644 doc/Bilder Anleitung/02_Export_besser.jpg create mode 100644 doc/Bilder Anleitung/03_Einrichten.JPG create mode 100644 doc/Bilder Anleitung/03_Export.jpg create mode 100644 doc/Bilder Anleitung/04_Einrichten.JPG create mode 100644 doc/Bilder Anleitung/05_Einrichten.JPG create mode 100644 doc/Bilder Anleitung/06_Einrichten.JPG create mode 100644 doc/Bilder Anleitung/Thumbs.db create mode 100644 doc/Erster Start und Einrichtung.pdf create mode 100644 doc/Export BricsCAD.pdf create mode 100644 doc/IO_besser_V2.txt create mode 100644 doc/LinksammlungPowerShell.md diff --git a/IO-Konvertierer.ps1 b/IO-Konvertierer.ps1 new file mode 100644 index 0000000..bc38272 --- /dev/null +++ b/IO-Konvertierer.ps1 @@ -0,0 +1,2163 @@ +Function Main +{ + $StartPfad = StartPfadHolen + GUI $StartPfad +} + +Function GUI ($StartPfad) +{ + [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") + [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") + + # Eigenschaften Fenster + $Fenster = New-Object System.Windows.Forms.Form + $Fenster.Size = New-Object System.Drawing.Size(940,660) #Breite, Hoehe + $Fenster.StartPosition = "CenterScreen" + $Fenster.KeyPreview = $true # was macht das? + $Fenster.MaximumSize = $Fenster.Size # legt fest, dass Groesse des Fensters nicht veraendert werden kann + $Fenster.MinimumSize = $Fenster.Size + $Fenster.Text = "Dateikonvertierer I/O" + + # Eigenschaften Tabs + $TabBasis = New-Object System.Windows.Forms.TabControl + $TabBasis.Location = New-Object System.Drawing.Size(10,10) + $TabBasis.Size = New-Object System.Drawing.Size(900,600) + $TabBasis.DataBindings.DefaultDataSourceUpdateMode = 0 # Was macht das? + $Fenster.Controls.Add($TabBasis) + + # Tab: TXT-Pfad auswaehlen + $TabSeiteTXTAuswaehlen = New-Object System.Windows.Forms.TabPage + $TabSeiteTXTAuswaehlen.TabIndex = 0 + $TabSeiteTXTAuswaehlen.UseVisualStyleBackColor = $true + $TabSeiteTXTAuswaehlen.Text = "txt-Datei Auswaehlen" + #Paddings + $TabSeiteTXTAuswaehlen.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteTXTAuswaehlen) + + # TXTPfadFeld + $TXTPfadFeld = New-Object System.Windows.Forms.TextBox + $TXTPfadFeld.Location = New-Object System.Drawing.Size(10,10) + $TXTPfadFeld.Size = New-Object System.Drawing.Size(860,20) + $TXTPfadFeld.Add_KeyDown({ + # Reaktion bei gedrueckter Taste + $Taste = $_.KeyCode + TastenReaktionPfadFeld "txt" $Taste + }) + $TabSeiteTXTAuswaehlen.Controls.Add($TXTPfadFeld) + + # TXTListeOrdnernamen + $TXTListeOrdnernamen = New-Object System.Windows.Forms.ListBox + $TXTListeOrdnernamen.Location = New-Object System.Drawing.Size(10,40) + $TXTListeOrdnernamen.Size = New-Object System.Drawing.Size(860,20) + $TXTListeOrdnernamen.Height = 450 + $TXTListeOrdnernamen.Font = New-Object System.Drawing.Font("Arial",12,[System.Drawing.FontStyle]::Regular) + $TXTListeOrdnernamen.Add_DoubleClick({ + # Variablen bestimmen zur uebergabe + $Auswahl = $TXTListeOrdnernamen.SelectedItem + $Pfad = $TXTPfadFeld.Text + + # Pfad aktualisieren + VerzeichnisAuswaehlen "txt" $Pfad $Auswahl + }) + $TXTListeOrdnernamen.Add_KeyDown({ + # Reaktion bei gedrueckter Taste + $Taste = $_.KeyCode + TastenReaktionListeOrdnernamen "txt" $Taste + }) + $TabSeiteTXTAuswaehlen.Controls.Add($TXTListeOrdnernamen) + + # ZurueckButton + $TXTZurueckButton = New-Object System.Windows.Forms.Button + $TXTZurueckButton.Location = New-Object System.Drawing.Size(10,500) + $TXTZurueckButton.Size = New-Object System.Drawing.Size(100,30) + $TXTZurueckButton.Text = "Zurueck" + $TXTZurueckButton.Add_Click({ + $Pfad = $TXTPfadFeld.Text + + #Pfad aktualisieren + VerzeichnisZurueck "txt" $Pfad + }) + $TXTZurueckButton.Add_KeyDown({ + # Reaktion bei gedrueckter Taste + $Taste = $_.KeyCode + TastenReaktionButtons "txt" $Taste + }) + $TabSeiteTXTAuswaehlen.Controls.Add($TXTZurueckButton) + + # AuswaehlenButton + $TXTAuswaehlenButton = New-Object System.Windows.Forms.Button + $TXTAuswaehlenButton.Location = New-Object System.Drawing.Size(750,500) + $TXTAuswaehlenButton.Size = New-Object System.Drawing.Size(100,30) + $TXTAuswaehlenButton.Text = "Auswaehlen" + $TXTAuswaehlenButton.Add_Click({ + # Variablen bestimmen zur uebergabe + $Auswahl = $TXTListeOrdnernamen.SelectedItem + $Pfad= $TXTPfadFeld.Text + + # Pfad aktualisieren + VerzeichnisAuswaehlen "txt" $Pfad $Auswahl + }) + $TXTAuswaehlenButton.Add_KeyDown({ + # Reaktion bei gedrueckter Taste + $Taste = $_.KeyCode + TastenReaktionButtons "txt" $Taste + }) + $TabSeiteTXTAuswaehlen.Controls.Add($TXTAuswaehlenButton) + + $A = AnzeigeAktualisieren "txt" $StartPfad # Ohne dem Aufruf kann kein Startverzeichnis uebergeben werden. Wird der Aufruf keiner Variable zugewiesen verursacht dies Fehler bei der Rueckgabe. + + # Tab: Zielverzeichnis auswaehlen + $TabSeiteZielVerzeichnisAuswaehlen = New-Object System.Windows.Forms.TabPage + $TabSeiteZielVerzeichnisAuswaehlen.TabIndex = 1 + $TabSeiteZielVerzeichnisAuswaehlen.UseVisualStyleBackColor = $true + $TabSeiteZielVerzeichnisAuswaehlen.Text = "Zielverzeichnis Auswaehlen" + #Paddings + $TabSeiteZielVerzeichnisAuswaehlen.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteZielVerzeichnisAuswaehlen) + + # PfadFeld + $VERPfadFeld = New-Object System.Windows.Forms.TextBox + $VERPfadFeld.Location = New-Object System.Drawing.Size(10,10) + $VERPfadFeld.Size = New-Object System.Drawing.Size(860,20) + $VERPfadFeld.Add_KeyDown({ + # Reaktion bei gedrueckter Taste + $Taste = $_.KeyCode + TastenReaktionPfadFeld "ver" $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERPfadFeld) + + # ListeOrdnernamen + $VERListeOrdnernamen = New-Object System.Windows.Forms.ListBox + $VERListeOrdnernamen.Location = New-Object System.Drawing.Size(10,40) + $VERListeOrdnernamen.Size = New-Object System.Drawing.Size(860,20) + $VERListeOrdnernamen.Height = 450 + $VERListeOrdnernamen.Font = New-Object System.Drawing.Font("Arial",12,[System.Drawing.FontStyle]::Regular) + $VERListeOrdnernamen.Add_DoubleClick({ + # Variablen bestimmen zur uebergabe + $Auswahl = $VERListeOrdnernamen.SelectedItem + $Pfad = $VERPfadFeld.Text + + # Pfad aktualisieren + VerzeichnisAuswaehlen "ver" $Pfad $Auswahl + }) + $VERListeOrdnernamen.Add_KeyDown({ + # Reaktion bei gedrueckter Taste + $Taste = $_.KeyCode + TastenReaktionListeOrdnernamen "ver" $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERListeOrdnernamen) + + # ZurueckButton + $VERZurueckButton = New-Object System.Windows.Forms.Button + $VERZurueckButton.Location = New-Object System.Drawing.Size(10,500) + $VERZurueckButton.Size = New-Object System.Drawing.Size(100,30) + $VERZurueckButton.Text = "Zurueck" + $VERZurueckButton.Add_Click({ + $Pfad = $VERPfadFeld.Text + + #Pfad aktualisieren + VerzeichnisZurueck "ver" $Pfad + }) + $VERZurueckButton.Add_KeyDown({ + # Reaktion bei gedrueckter Taste + $Taste = $_.KeyCode + TastenReaktionButtons "ver" $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERZurueckButton) + + # AuswaehlenButton + $VERAuswaehlenButton = New-Object System.Windows.Forms.Button + $VERAuswaehlenButton.Location = New-Object System.Drawing.Size(630,500) + $VERAuswaehlenButton.Size = New-Object System.Drawing.Size(100,30) + $VERAuswaehlenButton.Text = "Auswaehlen" + $VERAuswaehlenButton.Add_Click({ + # Variablen bestimmen zur uebergabe + $Auswahl = $VERListeOrdnernamen.SelectedItem + $Pfad = $VERPfadFeld.Text + + if ($($VERListeOrdnernamen.Items[0] -eq "")) + { + VERAuswahlBestaetigt $Pfad $Auswahl + } + else + { + # Pfad aktualisieren + VerzeichnisAuswaehlen "ver" $Pfad $Auswahl + } + }) + $VERAuswaehlenButton.Add_KeyDown({ + # Reaktion bei gedrueckter Taste + $Taste = $_.KeyCode + TastenReaktionButtons "ver" $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERAuswaehlenButton) + + # BestaetigenButton + $VERBestaetigenButton = New-Object System.Windows.Forms.Button + $VERBestaetigenButton.Location = New-Object System.Drawing.Size(750,500) + $VERBestaetigenButton.Size = New-Object System.Drawing.Size(100,30) + $VERBestaetigenButton.Text = "Bestaetigen" + $VERBestaetigenButton.Add_Click({ + $Auswahl = $VERListeOrdnernamen.SelectedItem + $Pfad = $VERPfadFeld.Text + + VERAuswahlBestaetigt $Pfad $Auswahl + }) + $VERBestaetigenButton.Add_KeyDown({ + # Reaktion bei gedrueckter Taste + $Taste = $_.KeyCode + TastenReaktionButtons "ver" $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERBestaetigenButton) + + # Tab: Ausgabe Fortschritt + $TabSeiteFortschrittsanzeige = New-Object System.Windows.Forms.TabPage + $TabSeiteFortschrittsanzeige.TabIndex = 2 + $TabSeiteFortschrittsanzeige.UseVisualStyleBackColor = $true + $TabSeiteFortschrittsanzeige.Text = "Bearbeitungsfortschritt" + #Paddings + $TabSeiteFortschrittsanzeige.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteFortschrittsanzeige) + + $FATextfeld1 = New-Object System.Windows.Forms.Label + $FATextfeld1.Location = New-Object System.Drawing.Size(10,10) + $FATextfeld1.Size = New-Object System.Drawing.Size(130,20) + $FATextfeld1.Text = "Aktuelle Aufgabe" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld1) + + $FATextfeld2 = New-Object System.Windows.Forms.Label + $FATextfeld2.Location = New-Object System.Drawing.Size(10,55) + $FATextfeld2.Size = New-Object System.Drawing.Size(430,20) + $FATextfeld2.Text = "Erledigte Aufgaben" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld2) + + $FATextfeldAktuelleAufgabe = New-Object System.Windows.Forms.Label + $FATextfeldAktuelleAufgabe.Location = New-Object System.Drawing.Size(150,10) + $FATextfeldAktuelleAufgabe.Size = New-Object System.Drawing.Size(710,60) + $FATextfeldAktuelleAufgabe.Font = New-Object System.Drawing.Font("Arial",13,[System.Drawing.FontStyle]::Regular) + $FATextfeldAktuelleAufgabe.Text = "txt-Datei auswaehlen" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeldAktuelleAufgabe) + + $FAListeErledigteAufgaben = New-Object System.Windows.Forms.ListBox + $FAListeErledigteAufgaben.Location = New-Object System.Drawing.Size(10,85) + $FAListeErledigteAufgaben.Size = New-Object System.Drawing.Size(860,20) + $FAListeErledigteAufgaben.Height = 200 + $FAListeErledigteAufgaben.Font = New-Object System.Drawing.Font("Arial",12,[System.Drawing.FontStyle]::Regular) + $TabSeiteFortschrittsanzeige.Controls.Add($FAListeErledigteAufgaben) + + $FATextfeld3 = New-Object System.Windows.Forms.Label + $FATextfeld3.Location = New-Object System.Drawing.Size(10,300) + $FATextfeld3.Size = New-Object System.Drawing.Size(430,20) + $FATextfeld3.Text = "Fortschritt Excel-Dateien beschreiben" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld3) + + $FAFortschrittsbar = New-Object System.Windows.Forms.ProgressBar + $FAFortschrittsbar.Location = New-Object System.Drawing.Size(10,320) + $FAFortschrittsbar.Size = New-Object System.Drawing.Size(860,30) + $FAFortschrittsbar.Value = 0 + $TabSeiteFortschrittsanzeige.Controls.Add($FAFortschrittsbar) + + $FATextfeldRealwertFortschrittsbar = New-Object System.Windows.Forms.Label # Wird verwendet, aber VSC erkennt das nicht + + $FATextfeld4 = New-Object System.Windows.Forms.Label + $FATextfeld4.Location = New-Object System.Drawing.Size(10,370) + $FATextfeld4.Size = New-Object System.Drawing.Size(140,20) + $FATextfeld4.Text = "Bearbeitete Eintraege:" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld4) + + $FATextfeld5 = New-Object System.Windows.Forms.Label + $FATextfeld5.Location = New-Object System.Drawing.Size(10,400) + $FATextfeld5.Size = New-Object System.Drawing.Size(100,20) + $FATextfeld5.Text = "Gesamteintraege:" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld5) + + $FATextfeldBearbeiteteEintraege = New-Object System.Windows.Forms.Label + $FATextfeldBearbeiteteEintraege.Location = New-Object System.Drawing.Size(170,370) + $FATextfeldBearbeiteteEintraege.Size = New-Object System.Drawing.Size(430,20) + $FATextfeldBearbeiteteEintraege.Text = "0" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeldBearbeiteteEintraege) + + $FATextfeldGesamtEintraege = New-Object System.Windows.Forms.Label + $FATextfeldGesamtEintraege.Location = New-Object System.Drawing.Size(170,400) + $FATextfeldGesamtEintraege.Size = New-Object System.Drawing.Size(430,20) + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeldGesamtEintraege) + + # Tab: Ausgabe doppelte Ein- und Ausgaenge sowie nicht zurordnebare Betriebsmittel + $TabSeiteDuplikate = New-Object System.Windows.Forms.TabPage + $TabSeiteDuplikate.TabIndex = 3 + $TabSeiteDuplikate.UseVisualStyleBackColor = $true + $TabSeiteDuplikate.Text = "Doppelte Ein- und Ausgaenge" + #Paddings + $TabSeiteDuplikate.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteDuplikate) + + $DPTextfeld1 = New-Object System.Windows.Forms.Label + $DPTextfeld1.Location = New-Object System.Drawing.Size(10,10) + $DPTextfeld1.Size = New-Object System.Drawing.Size(275,40) + $DPTextfeld1.Text = "Bei den Eingaengen gibt es folgende Duplikate: " + $TabSeiteDuplikate.Controls.Add($DPTextfeld1) + + $DPListeEingaenge = New-Object System.Windows.Forms.DataGridView + $DPListeEingaenge.Location = New-Object System.Drawing.Size(10,60) + $DPListeEingaenge.Size = New-Object System.Drawing.Size(275,20) + $DPListeEingaenge.Height = 430 + $DPListeEingaenge.ColumnCount = 2 + $DPListeEingaenge.ColumnHeadersVisible = $true + $DPListeEingaenge.Columns[0].Name = "Zeile" + $DPListeEingaenge.Columns[1].Name = "Kennzeichnung" + $TabSeiteDuplikate.Controls.Add($DPListeEingaenge) + + $DPTextfeld2 = New-Object System.Windows.Forms.Label + $DPTextfeld2.Location = New-Object System.Drawing.Size(295,10) + $DPTextfeld2.Size = New-Object System.Drawing.Size(275,40) + $DPTextfeld2.Text = "Bei den Ausgaengen gibt es folgende Duplikate: " + $TabSeiteDuplikate.Controls.Add($DPTextfeld2) + + $DPListeAusgaenge = New-Object System.Windows.Forms.DataGridView + $DPListeAusgaenge.Location = New-Object System.Drawing.Size(295,60) + $DPListeAusgaenge.Size = New-Object System.Drawing.Size(275,20) + $DPListeAusgaenge.Height = 430 + $DPListeAusgaenge.ColumnCount = 2 + $DPListeAusgaenge.ColumnHeadersVisible = $true + $DPListeAusgaenge.Columns[0].Name = "Zeile" + $DPListeAusgaenge.Columns[1].Name = "Kennzeichnung" + $TabSeiteDuplikate.Controls.Add($DPListeAusgaenge) + + $DPTextfeld3 = New-Object System.Windows.Forms.Label + $DPTextfeld3.Location = New-Object System.Drawing.Size(580,10) + $DPTextfeld3.Size = New-Object System.Drawing.Size(275,40) + $DPTextfeld3.Text = "Folgende Eintraege konnten keinem Betriebsmittel zugewiesen werden:" + $TabSeiteDuplikate.Controls.Add($DPTextfeld3) + + $DPListeFehler = New-Object System.Windows.Forms.DataGridView + $DPListeFehler.Location = New-Object System.Drawing.Size(580,60) + $DPListeFehler.Size = New-Object System.Drawing.Size(275,20) + $DPListeFehler.Height = 430 + $DPListeFehler.ColumnCount = 2 + $DPListeFehler.ColumnHeadersVisible = $true + $DPListeFehler.Columns[0].Name = "Zeile" + $DPListeFehler.Columns[1].Name = "Kennzeichnung" + $TabSeiteDuplikate.Controls.Add($DPListeFehler) + + $DPBestaetigenButton = New-Object System.Windows.Forms.Button + $DPBestaetigenButton.Location = New-Object System.Drawing.Size(10,500) + $DPBestaetigenButton.Size = New-Object System.Drawing.Size(860,30) + $DPBestaetigenButton.Text = "Programm beenden" + $DPBestaetigenButton.Add_Click({ + $Fenster.Dispose() + return + }) + $TabSeiteDuplikate.Controls.Add($DPBestaetigenButton) + + # Tab: Einstellungen + $TabSeiteEigenschaften = New-Object System.Windows.Forms.TabPage + $TabSeiteEigenschaften.TabIndex = 0 + $TabSeiteEigenschaften.UseVisualStyleBackColor = $true + $TabSeiteEigenschaften.Text = "Einstellungen" + #Paddings + $TabSeiteEigenschaften.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteEigenschaften) + + $BasisHoehe1 = 170 #80 + #$BasisHoehe2 = $BasisHoehe1 + 20 #100 + #$BasisHoehe2x = $BasisHoehe2 + 30 #130 + #$BasisHoehe3 = $BasisHoehe2 + 65 #165 + + $BasisBreite1 = 10 #10 + #$BasisBreite2 = $BasisBreite1 + 70 #80 + #$BasisBreite3 = $BasisBreite2 + 60 #140 + #$BasisBreite4 = $BasisBreite3 + 210 #350 + #$BasisBreite5 = $BasisBreite4 + 55 #405 + + $ESTextfeld1 = New-Object System.Windows.Forms.Label + $ESTextfeld1.Location = New-Object System.Drawing.Size($BasisBreite1,10) + $ESTextfeld1.Size = New-Object System.Drawing.Size(200,20) + $ESTextfeld1.Text = "Startverzeichnis Auswahl .txt-Datei:" + $TabSeiteEigenschaften.Controls.Add($ESTextfeld1) + + $ESTextfeldStartPfad = New-Object System.Windows.Forms.Label + $ESTextfeldStartPfad.Location = New-Object System.Drawing.Size(($BasisBreite1+200),10) + $ESTextfeldStartPfad.Size = New-Object System.Drawing.Size(510,20) + $TabSeiteEigenschaften.Controls.Add($ESTextfeldStartPfad) + + $ESStartPfadAendernButton = New-Object System.Windows.Forms.Button + $ESStartPfadAendernButton.Location = New-Object System.Drawing.Size(730,10) + $ESStartPfadAendernButton.Size = New-Object System.Drawing.Size(150,30) + $ESStartPfadAendernButton.Text = "Aendern" + $ESStartPfadAendernButton.Add_Click({ + VerzeichnisAendern "StartPfad" + }) + $TabSeiteEigenschaften.Controls.Add($ESStartPfadAendernButton) + + + $ESTextfeld2 = New-Object System.Windows.Forms.Label + $ESTextfeld2.Location = New-Object System.Drawing.Size($BasisBreite1,45) + $ESTextfeld2.Size = New-Object System.Drawing.Size(450,20) + $ESTextfeld2.Text = "Startverzeichnis bei Auswahl des Zielverzeichnisses der Datei(en):" + $TabSeiteEigenschaften.Controls.Add($ESTextfeld2) + + $ESRadioButtonWieTXT = New-Object System.Windows.Forms.RadioButton + $ESRadioButtonWieTXT.Location = New-Object System.Drawing.Size(10,10) + $ESRadioButtonWieTXT.Size = New-Object System.Drawing.Size(163,18) + $ESRadioButtonWieTXT.Name = "ESRadioButtonWieTXT" + $ESRadioButtonWieTXT.Text = "Gleich Startpfad .txt-Datei" + + $ESRadioButtonWieZieldatei = New-Object System.Windows.Forms.RadioButton + $ESRadioButtonWieZieldatei.Location = New-Object System.Drawing.Size(173,10) + $ESRadioButtonWieZieldatei.Size = New-Object System.Drawing.Size(179,18) + $ESRadioButtonWieZieldatei.Name = "ESRadioButtonWieZieldatei" + $ESRadioButtonWieZieldatei.Text = "Gleich gewaehlter .txt-Datei" + + $ESRadioButtonEigenerPfad = New-Object System.Windows.Forms.RadioButton + $ESRadioButtonEigenerPfad.Location = New-Object System.Drawing.Size(352,10) + $ESRadioButtonEigenerPfad.Size = New-Object System.Drawing.Size(94,18) + $ESRadioButtonEigenerPfad.Name = "ESRadioButtonEigenerPfad" + $ESRadioButtonEigenerPfad.Text = "Anderer Pfad" + + $ESGroupBoxRadioButtons = New-Object System.Windows.Forms.GroupBox + $ESGroupBoxRadioButtons.Location = New-Object System.Drawing.Size(($BasisBreite1),60) + $ESGroupBoxRadioButtons.Size = New-Object System.Drawing.Size(449,30) + $ESGroupBoxRadioButtons.Controls.Add($ESRadioButtonWieTXT) + $ESGroupBoxRadioButtons.Controls.Add($ESRadioButtonWieZieldatei) + $ESGroupBoxRadioButtons.Controls.Add($ESRadioButtonEigenerPfad) + $TabSeiteEigenschaften.Controls.Add($ESGroupBoxRadioButtons) + + $ESSpeichernButton = New-Object System.Windows.Forms.Button + $ESSpeichernButton.Location = New-Object System.Drawing.Size(730,60) + $ESSpeichernButton.Size = New-Object System.Drawing.Size(150,30) + $ESSpeichernButton.Text = "Speichern" + $ESSpeichernButton.Add_Click({ + EinstellungenRadioButtonSpeichern + }) + $TabSeiteEigenschaften.Controls.Add($ESSpeichernButton) + + $ESTextfeld3 = New-Object System.Windows.Forms.Label + $ESTextfeld3.Location = New-Object System.Drawing.Size($BasisBreite1,95) + $ESTextfeld3.Size = New-Object System.Drawing.Size(250,20) + $ESTextfeld3.Text = "Startverzeichnis Auswahl Zielverzeichnis:" + + $ESTextfeldZielPfad = New-Object System.Windows.Forms.Label + $ESTextfeldZielPfad.Location = New-Object System.Drawing.Size(($BasisBreite1+250),95) + $ESTextfeldZielPfad.Size = New-Object System.Drawing.Size(460,20) + + $ESZielPfadAendernButton = New-Object System.Windows.Forms.Button + $ESZielPfadAendernButton.Location = New-Object System.Drawing.Size(730,95) + $ESZielPfadAendernButton.Size = New-Object System.Drawing.Size(150,30) + $ESZielPfadAendernButton.Text = "Aendern" + $ESZielPfadAendernButton.Add_Click({ + VerzeichnisAendern "ZielPfad" + }) + + +#------------------- Tabelle mit ZielDateien + + $ESTextfeld4 = New-Object System.Windows.Forms.Label + $ESTextfeld4.Location = New-Object System.Drawing.Size($BasisBreite1,140) + $ESTextfeld4.Size = New-Object System.Drawing.Size(200,20) + $ESTextfeld4.Text = "Zieldateien:" + $TabSeiteEigenschaften.Controls.Add($ESTextfeld4) + + $ESAenderungenSpeichernButton = New-Object System.Windows.Forms.Button + $ESAenderungenSpeichernButton.Location = New-Object System.Drawing.Size(730,$BasisHoehe1) + $ESAenderungenSpeichernButton.Size = New-Object System.Drawing.Size(150,30) + $ESAenderungenSpeichernButton.Text = "Aenderungen Speichern" + $ESAenderungenSpeichernButton.Add_Click({ + EinstellungenZielDateienSpeichern + }) + $TabSeiteEigenschaften.Controls.Add($ESAenderungenSpeichernButton) + + $ESListeEinstellungen = New-Object System.Windows.Forms.DataGridView + $ESListeEinstellungen.Location = New-Object System.Drawing.Size(10,$BasisHoehe1) + $ESListeEinstellungen.Size = New-Object System.Drawing.Size(650,380) + $ESListeEinstellungen.ColumnCount = 4 + $ESListeEinstellungen.ColumnHeadersVisible = $true + $ESListeEinstellungen.AllowUserToAddRows = $true + $ESListeEinstellungen.AllowUserToDeleteRows = $true + $ESListeEinstellungen.AutoGenerateColumns = $false + $ESListeEinstellungen.AutoSizeColumnsMode = "Fill" + $ESListeEinstellungen.Columns[0].Name = "Prefix Eingang" + $ESListeEinstellungen.Columns[1].Name = "Prefix Ausgang" + $ESListeEinstellungen.Columns[2].Name = "Dateiname" + $ESListeEinstellungen.Columns[3].Name = "Konvertierungsart" + $TabSeiteEigenschaften.Controls.Add($ESListeEinstellungen) + + AnzeigeEinstellungenInitialisieren + + $Fenster.Add_Shown({$Fenster.Activate()}) + [void]$Fenster.ShowDialog() + + return +} + +#------------------- Funktion nur fuer das txt-GUI -------------------------- + +Function TXTReaktionReturn ($Pfad) +{ + if (PfadExistiert $Pfad) + { + # Gueltiger Pfad oder .txt-Datei + $PfadEnde = $(Split-Path $Pfad -Leaf) + if ($($PfadEnde -match ".txt")) + { + ZuVERSpringen + # Ist zwar sachlich gesehen unsinn, aber sonst funktioniert Return in der GUI nicht richtig + $TXTPfadFeld.Text = $Pfad + return + } + else + { + AnzeigeAktualisieren "txt" $Pfad + } + } + else + { + # Laufwerke aktualisieren oder ungueltiger Pfad + AnzeigeAktualisieren "txt" "" + } + return +} + +#------------------- Funktion nur fuer das VerzeichnisWaehlen-GUI -------------------------- + + +# Fuehrt $Pfad und $Auswahl zusammen und ueberprueft ob der daraus resultierte neue Pfad vorhanden ist. Falls dies der Fall ist, wird in den Bereich der Fortschrittsanzeige gewechselt +Function VERAuswahlBestaetigt($Pfad, $Auswahl) +{ + $Pfad = Join-Path -Path $Pfad -ChildPath $Auswahl -Resolve + + if (PfadExistiert $Pfad) + { + ZuFASpringen + $VERPfadfeld.Text = $Pfad + return + } +} + +Function VERVorauswahlAnzeigeAktualisieren () { + # Todo: Soll evtl. in AnzeigeAktualisieren migriert werden. Problem: Innerhalb der Verzeichniswahl koennte man dann evtl. nicht mehr navigieren. + $RadioButton = RadioButtonHolen + switch ($RadioButton) { + EigenerPfad { + $ZielPfad = ZielPfadHolen + AnzeigeAktualisieren "ver" $ZielPfad + } + WieTXT { + $StartPfad = StartPfadHolen + AnzeigeAktualisieren "ver" $StartPfad + } + WieZielDatei { + AnzeigeAktualisieren "ver" $TXTPfadFeld.Text + } + Default { + AnzeigeAktualisieren "ver" $TXTPfadFeld.Text + } + } +} + + +#------------------- Funktionen zum wechseln der Tabs -------------------------- + +Function ZuVERSpringen +{ + VERVorauswahlAnzeigeAktualisieren + AufgabenAktualisieren "Zielverzeichnis auswaehlen" + $TabBasis.SelectedIndex = 1 +} + +Function ZuFASpringen +{ + $TabBasis.SelectedIndex = 2 + + $ZielDateien = ZielDateienHolen + + $PfadUrsprungsdatei = $TXTPfadFeld.Text + $PfadZielDateien = $VERPfadFeld.Text + + foreach ($ZielDatei in $ZielDateien) { + $ZielPfad = ExcelDateiNameErstellen $($ZielDatei.DateiName) $PfadUrsprungsdatei $PfadZielDateien + + AufgabenAktualisieren $("Excel-Datei $($ZielDatei.DateiName) erstellen") + + if ($($ZielDatei.WandlungsTyp) -eq "TIA") { + $Gleiche = ExcelDateiBeschreibenTIA $PfadUrsprungsdatei $($ZielDatei.PrefixEingang) $($ZielDatei.PrefixAusgang) $ZielPfad + } + elseif ($($ZielDatei.WandlungsTyp) -eq "Simpel") { + $Gleiche = ExcelDateiBeschreibenSimpel $PfadUrsprungsdatei $($ZielDatei.PrefixEingang) $($ZielDatei.PrefixAusgang) $ZielPfad + } + elseif ($($ZielDatei.WandlungsTyp) -eq "WSCAD") { + $Gleiche = ExcelDateiBeschreibenWSCAD $PfadUrsprungsdatei $($ZielDatei.PrefixEingang) $($ZielDatei.PrefixAusgang) $ZielPfad + } + elseif ($($ZielDatei.WandlungsTyp) -eq "WSCAD_Bezug") { + $Gleiche = ExcelDateiBeschreibenWSCAD_Bezug $PfadUrsprungsdatei $($ZielDatei.PrefixEingang) $($ZielDatei.PrefixAusgang) $ZielPfad + } + else { + $Gleiche = ExcelDateiBeschreibenSimpel $PfadUrsprungsdatei $($ZielDatei.PrefixEingang) $($ZielDatei.PrefixAusgang) $ZielPfad + } + } + + $GleicheEingaenge = $Gleiche[0] + $GleicheAusgaenge = $Gleiche[1] + $Fehler = $Gleiche[2] + + AufgabenAktualisieren "Ausgabe Duplikate und Fehler" + ZuDPSpringen $GleicheEingaenge $GleicheAusgaenge $Fehler +} + +Function ZuDPSpringen ($GleicheEingaenge, $GleicheAusgaenge, $Fehler) +{ + foreach ($GleichenEingang in $GleicheEingaenge) { + $DPListeEingaenge.Rows.Add($($GleichenEingang.Zeile),($GleichenEingang.Name)) + } + + foreach ($GleichenAusgang in $GleicheAusgaenge) { + $DPListeAusgaenge.Rows.Add($($GleichenAusgang.Zeile),($GleichenAusgang.Name)) + } + + foreach ($Fehlen in $Fehler) { + $DPListeFehler.Rows.Add($($Fehlen.Zeile),($Fehlen.Name)) + } + + $TabBasis.SelectedIndex = 3 + + # Werte zuruecksetzen, um weitere durchlauefe zu ermoeglichen + # Todo: Fehler und Duplikate zuruecksetzen!!! + VERVorauswahlAnzeigeAktualisieren + AnzeigeAktualisieren "txt" $($ESTextfeldStartPfad.Text) + $FAFortschrittsbar.Value = 0 + $FATextfeldBearbeiteteEintraege.Text = "0" +} + +#------------------- Funktionen fuer alle GUIs -------------------------- + + +# Bekommt Pfad, stellt fest ob Laufwerke oder Ordner angezeigt werden muessen und aktualisiert entsprechend alles +# Um die Laufwerke anzuzeigen, muss der $Pfad = "" sein +Function AnzeigeAktualisieren ($AuswahlTyp, $Pfad) +{ +# Ueberpruefen, ob es das Verzeichnis gibt +if (PfadExistiert $Pfad) +{ + $Optionen = Optionen $AuswahlTyp $Pfad +} +elseif ($Pfad.Length -eq 0) { + $Optionen = LaufwerkeFinden + $Pfad = "" +} +else +{ + AnzeigeAktualisieren $AuswahlTyp "" + return +} + +if ($($AuswahlTyp -eq "txt")) { + $TXTPfadFeld.Text = $Pfad + $TXTListeOrdnernamen.Items.Clear() + foreach ($Option in $Optionen) + { + if ($Option.Length -gt 0) + { + $TXTListeOrdnernamen.Items.Add($Option) + } + } +} +elseif ($($AuswahlTyp -eq "ver")) { + $VERPfadFeld.Text = $Pfad + $VERListeOrdnernamen.Items.Clear() + foreach ($Option in $Optionen) + { + if ($Option.Length -gt 0) + { + $VERListeOrdnernamen.Items.Add($Option) + } + } +} + +return +} + +Function VerzeichnisAuswaehlen ($AuswahlTyp, $Pfad, $Auswahl) +{ +if (PfadExistiert $Pfad) +{ + $Pfad = Join-Path -Path $Pfad -ChildPath $Auswahl -Resolve +} +elseif ($Pfad.Length -eq 0) { + #Wenn der Pfad die Laenge 0 hat, wurde ein Laufwerk gewaehlt + $Pfad = $Auswahl +} +else { + #Fehlerfall/ ungueltiger Pfad: zurueck zu Laufwerken navigieren + $Pfad = "" +} + +# Erkennen, ob *.txt-Datei gewaehlt wurde -> ggf. Auswahl abgeschlossen +if ($($($Auswahl -match ".txt") -and $($AuswahlTyp -eq "txt"))) +{ + # Fuer den Gesamtfortschritt Anzahl Dateien auslesen und mit der Anzahl der zu erstellenden Dateien multiplizieren + $Datei = Get-Content $Pfad + $ZielDateien = ZielDateienHolen + $FATextfeldGesamtEintraege.Text = $($ZielDateien.count) * $($Datei.Length) + + ZuVERSpringen + # Ist zwar sachlich gesehen unsinn, aber sonst funktioniert Return in der GUI nicht + $TXTPfadFeld.Text = $Pfad + return +} + +AnzeigeAktualisieren $AuswahlTyp $Pfad +return +} + +Function VerzeichnisZurueck ($AuswahlTyp, $Pfad) +{ +if ($Pfad.Length -gt 3) +{ + # Weiter mit Ordnern + $Pfad = Split-Path $Pfad +} +elseif ($Pfad.Length -le 3) +{ + # Weiter mit Laufwerken + $Pfad = "" +} +else +{ + # Fehler/ Nichts tun? + # Ermitteln: wann tritt dieser Fall ein? + $Pfad = "" +} +AnzeigeAktualisieren $AuswahlTyp $Pfad +return +} + +Function TastenReaktionPfadFeld($AuswahlTyp, $Taste) +{ +if ($AuswahlTyp -eq "txt") { + switch ($Taste){ + "Return" { + $Pfad = $TXTPfadFeld.Text + TXTReaktionReturn $Pfad + } + Default { + } + } +} +elseif ($AuswahlTyp -eq "ver") { + switch ($Taste) { + "Return" { + $Pfad = $VERPfadFeld.Text + + AnzeigeAktualisieren "ver" $Pfad + } + Default { + } + } +} +return +} + +Function TastenReaktionListeOrdnernamen($AuswahlTyp, $Taste) +{ +if ($AuswahlTyp -eq "txt"){ + switch ($Taste){ + "Return" { + $Auswahl = $TXTListeOrdnernamen.SelectedItem + $Pfad = $TXTPfadFeld.Text + VerzeichnisAuswaehlen $AuswahlTyp $Pfad $Auswahl + } + "Back" { + $Pfad = $TXTPfadFeld.Text + # Pfad aktualisieren + VerzeichnisZurueck $AuswahlTyp $Pfad + } + Default { + } + } +} +elseif ($AuswahlTyp -eq "ver") { + switch ($Taste) { + "Return" { + $Auswahl = $VERListeOrdnernamen.SelectedItem + $Pfad = $VERPfadFeld.Text + VerzeichnisAuswaehlen $AuswahlTyp $Pfad $Auswahl + } + "Back" { + $Pfad = $VERPfadFeld.Text + VerzeichnisZurueck $AuswahlTyp $Pfad + } + "ShiftKey" { + $Pfad = $VERPfadFeld.Text + $Auswahl = $VERListeOrdnernamen.SelectedItem + ReaktionShiftKey $Pfad $Auswahl + } + Default { + } + } +} + +return +} + +Function TastenReaktionButtons($AuswahlTyp, $Taste) +{ +if ($AuswahlTyp -eq "txt") { + switch ($Taste){ + "Back" { + $Pfad = $TXTPfadFeld.Text + # Pfad aktualisieren + VerzeichnisZurueck $AuswahlTyp $Pfad + } + Default { + } + } +} +elseif ($AuswahlTyp -eq "ver") { + switch ($Taste) { + "Back" { + $Pfad = $VERPfadFeld.Text + VerzeichnisZurueck $AuswahlTyp $Pfad + } + "ShiftKey" { + $Pfad = $VERPfadFeld.Text + $Auswahl = $VERListeOrdnernamen.SelectedItem + ReaktionShiftKey $Pfad $Auswahl + } + Default { + } + } +} +return +} + +Function Optionen($AuswahlTyp, $Pfad) +{ +# Unterordner und .txt-Dateien finden +# Typzuweisung noetig, da aus unbekanntem Grund sonst Unterordner, die mit "_" beginnen, nicht gefunden werden koennen +[System.Object[]]$UnterOrdner = UnterOrdnerFinden $Pfad + +if ($AuswahlTyp -eq "txt") { + $TxtDateien = TxtDateienFinden $Pfad + #Gibt aktuell auch Index und Typ (System.IO.DirectoryInfo bzw. System.String) zurueck + $Optionen = $UnterOrdner + $TxtDateien +} +elseif ($AuswahlTyp -eq "ver") { + #Gibt aktuell auch Index und Typ (System.IO.DirectoryInfo bzw. System.String) zurueck + $Optionen = $UnterOrdner +} +return $Optionen +} + +Function PfadExistiert ($Pfad) +{ +#Um Abzufangen, dass Test-Path mit leerem Wert durchlaufen wird. Leere Verzeichnisse gelten als ungueltig. +if ($Pfad.Length -eq 0) { + return $false +} +if ($(Test-Path $Pfad -PathType Container) -or $(Test-Path $Pfad -Include "*.txt")) +{ + return $true +} +else +{ + return $false +} +} + +Function LaufwerkeFinden() +{ +$Laufwerke = $(Get-PSDrive | Where-Object {$_.Free}).Name +$i = 0 + +foreach($Laufwerk in $Laufwerke) +{ + $Laufwerke[$i] = $Laufwerk + ":\" + $i++ +} +return $Laufwerke +} + +Function UnterOrdnerFinden($Pfad) +{ +$UnterOrdner = $(Get-ChildItem $Pfad -Directory) + +if ($($UnterOrdner.Length -gt 0)) +{ + $Ordner = $(Split-Path $UnterOrdner -Leaf) +} +else { + $Ordner = "" +} + +return $Ordner +} + +function KompatibilitaetsCheck ($SpeicherOrt){ + $Inhalte = Get-Content $SpeicherOrt + if ($Inhalte.Length -eq 0) { + return $false + } + else { + foreach ($Zeile in $Inhalte) { + if (-not ($Zeile -match "'\w+','.+'") -and $Zeile.Length -gt 0) { + # -not (($Zeile -match "'\w+','\w+','\w+','\w+','\w*','\w*','\w*','\w*'") -and ($Zeile.Length -gt 0)) + #todo: doesn't work, but old version accepts new IO-schematic + #Zeichenbereiche: [0-9], [A-Z] (jeweils ein Zeichen) + #Zahlen: \d eine Dezimalziffer, \D eine nicht-dezimale Ziffer + #Wortzeichen: \w entpspricht [a-zA-Z0-9], \W Nicht-Wortzzeichen + #Platzhalter . + #Leerzeichen \s, kein Leerzeichen \S + #Anzahl: * => 0-n; + => 1-n; ? => 0-1; {n,m} => n-m (, und m sind optional; nur n => muss n mal vorhanden sein; n, => muss mindestens n mal vorhanden sein) + return $false + } + } + } + return $true +} + +Function TxtDateienFinden($Pfad) +{ +$TxtDateien = $(Get-Childitem $Pfad\*.txt) + +$KompatibleTxtDateien = @() + +if ($TxtDateien.Length -gt 0) +{ + foreach ($TxtDatei in $TxtDateien) { + if (KompatibilitaetsCheck $TxtDatei) { + $KompatibleTxtDateien += $TxtDatei + } + } + if ($KompatibleTxtDateien.Length -gt 0) { + return $(Split-Path $KompatibleTxtDateien -Leaf) + } + else { + Return + } +} +else +{ + return +} +} + +Function ReaktionShiftKey ($Pfad, $Auswahl) +{ + if (PfadExistiert $Pfad) + { + VERAuswahlBestaetigt $Pfad $Auswahl + } + else + { + AnzeigeAktualisieren "ver" "" + } + return +} + + +Function AufgabenAktualisieren ($Aufgabe) +{ + $FAListeErledigteAufgaben.Items.Add($FATextfeldAktuelleAufgabe.Text) + $FATextfeldAktuelleAufgabe.Text = $Aufgabe +} + +Function DateiBeschreibenAktualisieren +{ + $AnteilJeBeschriftung = 100 / $($FATextfeldGesamtEintraege.Text) + [System.double] $FATextfeldRealwertFortschrittsbar.Text += $AnteilJeBeschriftung + + #Da $FAFortschrittsbar.Value anscheinend ein int ist, ist der letzte Wert i. d. R. hoeher als 100 -> Fehler, der hiermit abgefangen wird + if ($([System.Double]$FATextfeldRealwertFortschrittsbar.Text) -ge 100) + { + $FAFortschrittsbar.Value = 100 + } + else + { + $FAFortschrittsbar.Value = $FATextfeldRealwertFortschrittsbar.Text + } + + + [System.Int64] $BearbeiteteEintraege = $FATextfeldBearbeiteteEintraege.Text + $BearbeiteteEintraege++ + $FATextfeldBearbeiteteEintraege.Text = $BearbeiteteEintraege +} + +#--------------------------------------- Start Funktionen fuer Einstellungen ------------------------------- + +Function BenutzerNameHolen () { + return $env:USERNAME +} + + +Function PfadEinstellungsDateiHolen () { + # Koennte man eigentlich in einer Zeile machen, PS macht da aber Probleme + $AktuellesVerzeichnis = Get-Location + $Benutzer = BenutzerNameHolen + $PfadEinstellungsDatei = $("$AktuellesVerzeichnis\" + "EinstellungenSkriptKonvertierung_" + $Benutzer + ".txt") + Write-Host "Pfad Einstellungsdatei: " $PfadEinstellungsDatei + return $PfadEinstellungsDatei +} + +Function InhalteEinstellungsDateiHolen () { + $PfadEinstellungsDatei = PfadEinstellungsDateiHolen + + if (-not (Test-Path $PfadEinstellungsDatei)) { + $A = EinstellungsDateiErstellen + } + else { + $EinstellungsInhalte = Get-Content $PfadEinstellungsDatei + return $EinstellungsInhalte + } +} + +Function StartPfadHolen () { + $EinstellungsZeilen = InhalteEinstellungsDateiHolen + $PfadEinstellungsDatei = PfadEinstellungsDateiHolen + + foreach ($EinstellungsZeile in $EinstellungsZeilen) { + $EinstellungsBestandteile = $EinstellungsZeile.Split("|") + if ($EinstellungsBestandteile[0] -eq "StartPfad") { + $StartPfad = $EinstellungsBestandteile[1] + #Pruefen, ob es den Pfad gibt. Falls er nicht existiert, wird das aktuelle Verzeichnis als StartPfad festgelegt + if (PfadExistiert $StartPfad) { + return $StartPfad + } + else { + #Todo: Muesste eigentlich auch in der Einstellungsdatei neu gespeichert werden. Neue Funktion erstellen, die dies auch fuer VerzeichnisAendern macht? + return Get-Location + } + } + } + + # Falls kein StartPfad gefunden wurde, soll der Pfad der Einstellungsdatei als Pfad angegeben werden + $StartPfad = Split-Path $PfadEinstellungsDatei + Add-Content $PfadEinstellungsDatei $("StartPfad|" + $StartPfad) + return $StartPfad +} + +Function ZielPfadHolen () { + $EinstellungsZeilen = InhalteEinstellungsDateiHolen + $PfadEinstellungsDatei = PfadEinstellungsDateiHolen + + foreach ($EinstellungsZeile in $EinstellungsZeilen) { + $EinstellungsBestandteile = $EinstellungsZeile.Split("|") + if ($EinstellungsBestandteile[0] -eq "ZielPfad") { + $ZielPfad = $EinstellungsBestandteile[1] + return $ZielPfad + } + } + + # Falls kein ZielPfad gefunden wurde, soll der Pfad des StartVerzeichnisses als Pfad angegeben werden + $ZielPfad = StartPfadHolen + Add-Content $PfadEinstellungsDatei $("ZielPfad|" + $ZielPfad) + return $ZielPfad +} + +Function RadioButtonHolen () { + $EinstellungsZeilen = InhalteEinstellungsDateiHolen + $PfadEinstellungsDatei = PfadEinstellungsDateiHolen + + foreach ($EinstellungsZeile in $EinstellungsZeilen) { + $EinstellungsBestandteile = $EinstellungsZeile.Split("|") + if ($EinstellungsBestandteile[0] -eq "VerzeichnisWahl") { + $RadioButton = $EinstellungsBestandteile[1] + return $RadioButton + } + } + + #Falls kein VerzeichnisWahl gefunden wurde, soll die Einstellung auf gleich gesetzt werden + Add-Content $PfadEinstellungsDatei $("VerzeichnisWahl|Gleich") + return "Gleich" +} + +Function ZielDateienHolen () { + $PfadEinstellungsDatei = PfadEinstellungsDateiHolen + + # Ueberpruefen, ob Einstellungsdatei vorhanden ist, ggf. erstellen + if (Test-Path $PfadEinstellungsDatei) { + # Einstellungsdatei vorhanden -> auslesen + $EinstellungsInhalte = InhalteEinstellungsDateiHolen + foreach ($EinstellungsZeile in $EinstellungsInhalte) { + $EinstellungsInhalt = $EinstellungsZeile.Split("|") + if ($EinstellungsInhalt[0] -eq "Datei") { + $ZielDateien += @([PSCustomObject]@{ + PrefixEingang = $EinstellungsInhalt[1] + PrefixAusgang = $EinstellungsInhalt[2] + DateiName = $EinstellungsInhalt[3] + WandlungsTyp = $EinstellungsInhalt[4] + }) + } + } + $ZielDateienSicher = ZielDateienCheck $ZielDateien + return $ZielDateienSicher + } + else { + return EinstellungsDateiErstellen + } +} + +Function ZielDateienCheck ($ZielDateien) { + #Iterieren durch die Eintraege von $ZielDateien + #Reihenfolge der Korrektur ist wichtig! WandlungsTyp muss zuerst korrigiert werden, da Prefixe und DateiName dort einen Wert brauchen + $i = 0 + foreach ($ZielDatei in $ZielDateien) { + #Fehler: Keiner oder falscher Wandlungstyp angegeben + if (($ZielDatei.WandlungsTyp -ne "TIA") -and ($ZielDatei.WandlungsTyp -ne "WSCAD") -and ($ZielDatei.WandlungsTyp -ne "WSCAD_Bezug") -and ($ZielDatei.WandlungsTyp -ne "Simpel")) { + $ZielDatei.WandlungsTyp = "Simpel" + $ESListeEinstellungen.Rows[$i].Cells[3].Value = $ZielDatei.WandlungsTyp + $ESListeEinstellungen.Rows[$i].Cells[3].Style.BackColor = 'Red' + } + #Fehler: Zu langer Prefix fuer Eingaenge angegeben + if ($ZielDatei.PrefixEingang.Length -gt 3) { + $ZielDatei.PrefixEingang = $ZielDatei.PrefixEingang.Substring(0,3) + $ESListeEinstellungen.Rows[$i].Cells[0].Value = $ZielDatei.PrefixEingang + $ESListeEinstellungen.Rows[$i].Cells[0].Style.BackColor = 'Red' + } + #Fehler: Kein Prefix fuer Eingaenge angegeben + if ($ZielDatei.PrefixEingang.Length -eq 0) { + switch ($($ZielDatei.WandlungsTyp)) { + Simpel { + $ZielDatei.PrefixEingang = "E" + } + TIA { + $ZielDatei.PrefixEingang = "%E" + } + WSCAD { + $ZielDatei.PrefixEingang = "E" + } + WSCAD_Bezug { + $ZielDatei.PrefixEingang = "E" + } + Default { + $ZielDatei.PrefixEingang = "E" + } + } + $ESListeEinstellungen.Rows[$i].Cells[0].Value = $ZielDatei.PrefixEingang + $ESListeEinstellungen.Rows[$i].Cells[0].Style.BackColor = 'Red' + } + #Fehler: Zu langer Prefix fuer Ausgaenge angegeben + if ($ZielDatei.PrefixAusgang.Length -gt 3) { + $ZielDatei.PrefixAusgang = $ZielDatei.PrefixAusgang.Substring(0,3) + $ESListeEinstellungen.Rows[$i].Cells[1].Value = $ZielDatei.PrefixAusgang + $ESListeEinstellungen.Rows[$i].Cells[1].Style.BackColor = 'Red' + } + #Fehler: Kein Prefix fuer Ausgaenge angegeben + if ($ZielDatei.PrefixAusgang.Length -eq 0) { + switch ($($ZielDatei.WandlungsTyp)) { + Simpel { + $ZielDatei.PrefixAusgang = "A" + } + TIA { + $ZielDatei.PrefixAusgang = "%A" + } + WSCAD { + $ZielDatei.PrefixAusgang = "A" + } + WSCAD_Bezug { + $ZielDatei.PrefixAusgang = "A" + } + Default { + $ZielDatei.PrefixAusgang = "A" + } + } + $ESListeEinstellungen.Rows[$i].Cells[1].Value = $ZielDatei.PrefixAusgang + $ESListeEinstellungen.Rows[$i].Cells[1].Style.BackColor = 'Red' + } + #Fehler: Zu langer Dateiname angegeben + if ($ZielDatei.DateiName.Length -gt 150) { + $ZielDatei.DateiName = $ZielDatei.DateiName.Substring(0,150) + $ESListeEinstellungen.Rows[$i].Cells[2].Value = $ZielDatei.DateiName + $ESListeEinstellungen.Rows[$i].Cells[2].Style.BackColor = 'Red' + } + #Fehler: Kein Dateiname angegeben + if ($ZielDatei.DateiName.Length -eq 0) { + $ZielDatei.DateiName = $($ZielDatei.WandlungsTyp + "_[Ursprungsdatei]") + $ESListeEinstellungen.Rows[$i].Cells[2].Value = $ZielDatei.DateiName + $ESListeEinstellungen.Rows[$i].Cells[2].Style.BackColor = 'Red' + } + #Werte speichern fuer Rueckgabe + $GepruefteZielDateien += @([PSCustomObject]@{ + PrefixEingang = $ZielDatei.PrefixEingang + PrefixAusgang = $ZielDatei.PrefixAusgang + DateiName = $ZielDatei.DateiName + WandlungsTyp = $ZielDatei.WandlungsTyp + }) + $i++ + } + + return $GepruefteZielDateien +} + +Function EinstellungsDateiErstellen () { + $PfadEinstellungsDatei = PfadEinstellungsDateiHolen + # Todo: Moegliches Problem mit der Funktion "StartVerzeichnisAktualisieren". Ueberpruefen! + + New-Item $PfadEinstellungsDatei -ItemType File + + $StartPfad = Get-Location + + $ZielDateien = @([PSCustomObject]@{ + PrefixEingang = "E" + PrefixAusgang = "A" + DateiName = "WSCAD_[Ursprungsdatei]" + WandlungsTyp = "WSCAD" + }) + $ZielDateien += @([PSCustomObject]@{ + PrefixEingang = "E" + PrefixAusgang = "A" + DateiName = "WSCAD_Bezug_[Ursprungsdatei]" + WandlungsTyp = "WSCAD_Bezug" + }) + $ZielDateien += @([PSCustomObject]@{ + PrefixEingang = "%E" + PrefixAusgang = "%A" + DateiName = "TIA_[Ursprungsdatei]" + WandlungsTyp = "TIA" + }) + $ZielDateien += @([PSCustomObject]@{ + PrefixEingang = "E" + PrefixAusgang = "A" + DateiName = "EA_[Ursprungsdatei]" + WandlungsTyp = "Simpel" + }) + + Add-Content $PfadEinstellungsDatei "Hinweise zur Einstellungsdatei: " + Add-Content $PfadEinstellungsDatei "1) Jeder Eintrag wird durch senkrechte Striche (|) geteilt. Der erste Bereich gibt die Art des Eintrags an." + Add-Content $PfadEinstellungsDatei " Moegliche Werte sind 'StartPfad' und 'Datei'. Es sollte nur ein StartPfad angegeben sein. Sind mehrere Angegeben," + Add-Content $PfadEinstellungsDatei " wird der erste verwendet. Es koennen beliebig viele Dateien angegeben werden." + Add-Content $PfadEinstellungsDatei "2) Die rechte Spalte bei Dateien gibt das Konvertierungsformat fuer diese Datei an. Moeglich sind 'TIA', 'WSCAD'" + Add-Content $PfadEinstellungsDatei " und 'Simpel'. Ist ein falscher oder kein Wert angegeben, wird automatisch in 'Simpel' konvertiert." + Add-Content $PfadEinstellungsDatei "3) Die zweite Spalte von rechts bei Dateien gibt den Zieldateinamen an. Ist darin [Ursprungsdatei] enthalten," + Add-Content $PfadEinstellungsDatei " wird dieser Teil durch den Namen der txt-Datei ersetzt, von der die Daten konvertiert werden." + Add-Content $PfadEinstellungsDatei "Nutzung des Konvertierers auf eigene Gefahr und ohne Haftungsuebernahme bei Schaeden!" + + Add-Content $PfadEinstellungsDatei $("StartPfad|" + $StartPfad) + Add-Content $PfadEinstellungsDatei $("VerzeichnisWahl|WieZielDatei") + Add-Content $PfadEinstellungsDatei $("ZielPfad|" + $StartPfad) + foreach ($ZielDatei in $ZielDateien) { + Add-Content $PfadEinstellungsDatei $("Datei|" + $ZielDatei.PrefixEingang + "|" + $ZielDatei.PrefixAusgang + "|" + $ZielDatei.DateiName + "|" + $ZielDatei.WandlungsTyp) + } + + return $ZielDateien +} + +Function AnzeigeEinstellungenInitialisieren () +{ + # Neue Werte sollen nicht uebergeben werden, sondern aus der Einstellungsdatei ausgelesen werden, um Fehler zu vermeiden. + # Einzige Voraussetzung: es muss eine Einstellungsdatei geben! + + # Erstellen der neuen Eintraege + $EinstellungsInhalte = InhalteEinstellungsDateiHolen + + foreach ($EinstellungsZeile in $EinstellungsInhalte) { + $EinstellungsBestandteile = $EinstellungsZeile.Split("|") + if ($EinstellungsBestandteile[0] -eq "Datei") { + $ESListeEinstellungen.Rows.Add($($EinstellungsBestandteile[1]),$($EinstellungsBestandteile[2]),$($EinstellungsBestandteile[3]),$($EinstellungsBestandteile[4])) + } + } + + $StartPfad = StartPfadHolen + $ESTextfeldStartPfad.Text = $StartPfad + + # Radio-Button Einstellung und daraus folgend Anzeige der Zielverzeichnis-Schaltflaeche + $RadioButton = RadioButtonHolen + switch ($RadioButton) { + EigenerPfad { + $ESRadioButtonEigenerPfad.Checked = $true + $TabSeiteEigenschaften.Controls.Add($ESTextfeld3) + $TabSeiteEigenschaften.Controls.Add($ESTextfeldZielPfad) + $TabSeiteEigenschaften.Controls.Add($ESZielPfadAendernButton) + $ZielPfad = ZielPfadHolen + $ESTextfeldZielPfad.Text = $ZielPfad + } + WieTXT { + $ESRadioButtonWieTXT.Checked = $true + } + WieZielDatei { + $ESRadioButtonWieZieldatei.Checked = $true + } + Default { + $ESRadioButtonWieZieldatei.Checked = $true + } + } +} + +Function VerzeichnisAendern ($SuchBereich) +{ + + $DateiInhalt = InhalteEinstellungsDateiHolen + $PfadEinstellungsDatei = PfadEinstellungsDateiHolen + Clear-Content $PfadEinstellungsDatei + + foreach ($DateiZeile in $DateiInhalt) { + $DateiBestandTeile = $DateiZeile.Split("|") + if ($DateiBestandTeile[0] -eq $SuchBereich) { + $Explorer = New-Object System.Windows.Forms.FolderBrowserDialog + $Explorer.SelectedPath = $DateiBestandTeile[1] + $Explorer.ShowDialog() + $Pfad = $Explorer.SelectedPath + $DateiZeile = $($DateiBestandTeile[0] + "|" + $Pfad) + } + Add-Content $PfadEinstellungsDatei $DateiZeile + } + + # Ansichten aktualisieren zum neuen Startverzeichnis + AnzeigeAktualisieren "txt" $Pfad + VERVorauswahlAnzeigeAktualisieren + + switch ($SuchBereich) { + StartPfad { + $ESTextfeldStartPfad.Text = $Pfad + } + ZielPfad { + $ESTextfeldZielPfad.Text = $Pfad + } + Default {} + } +} + +Function EinstellungenRadioButtonSpeichern () { + + if ($ESRadioButtonEigenerPfad.Checked -eq $true) { + $Auswahl = "EigenerPfad" + $TabSeiteEigenschaften.Controls.Add($ESTextfeld3) + $TabSeiteEigenschaften.Controls.Add($ESTextfeldZielPfad) + $TabSeiteEigenschaften.Controls.Add($ESZielPfadAendernButton) + $ZielPfad = ZielPfadHolen + $ESTextfeldZielPfad.Text = $ZielPfad + } + elseif ($ESRadioButtonWieTXT.Checked -eq $true) { + $Auswahl = "WieTXT" + $TabSeiteEigenschaften.Controls.Remove($ESTextfeld3) + $TabSeiteEigenschaften.Controls.Remove($ESTextfeldZielPfad) + $TabSeiteEigenschaften.Controls.Remove($ESZielPfadAendernButton) + } + else { + $Auswahl = "WieZielDatei" + $TabSeiteEigenschaften.Controls.Remove($ESTextfeld3) + $TabSeiteEigenschaften.Controls.Remove($ESTextfeldZielPfad) + $TabSeiteEigenschaften.Controls.Remove($ESZielPfadAendernButton) + } + #Variablen deklarieren + $DateiInhalt = InhalteEinstellungsDateiHolen + $PfadEinstellungsDatei = PfadEinstellungsDateiHolen + + #Anzeige fuer Verzeichnis aktualisieren, Einstellungsdatei loeschen + VERVorauswahlAnzeigeAktualisieren + Clear-Content $PfadEinstellungsDatei + + #Durch die Einstellungsinhalte iterieren + foreach ($DateiZeile in $DateiInhalt) { + $DateiBestandTeile = $DateiZeile.Split("|") + #Zeile fuer VerzeichnisWahl finden und Einstellung durch neue Auswahl ersetzen + if ($DateiBestandTeile[0] -eq "VerzeichnisWahl") { + $DateiZeile = $($DateiBestandTeile[0] + "|" + $Auswahl) + } + Add-Content $PfadEinstellungsDatei $DateiZeile + } +} + +Function EinstellungenZielDateienSpeichern () +{ + #Auslesen von $ZielDateien + for ($i = 0; $i -lt ($ESListeEinstellungen.RowCount-1); $i++) { + #Falls alle Felder leer sind, wird die Zeile nicht hinzugefuegt + if ($($($($ESListeEinstellungen.Rows[$i].Cells[0].Value).Length -ne 0) -or + $($($ESListeEinstellungen.Rows[$i].Cells[1].Value).Length -ne 0) -or + $($($ESListeEinstellungen.Rows[$i].Cells[2].Value).Length -ne 0) -or + $($($ESListeEinstellungen.Rows[$i].Cells[3].Value).Length -ne 0) + )) { + #Zeile fuer $ZielDateien hinzufuegen + $ZielDateien += @([PSCustomObject]@{ + PrefixEingang = $ESListeEinstellungen.Rows[$i].Cells[0].Value + PrefixAusgang = $ESListeEinstellungen.Rows[$i].Cells[1].Value + DateiName = $ESListeEinstellungen.Rows[$i].Cells[2].Value + WandlungsTyp = $ESListeEinstellungen.Rows[$i].Cells[3].Value + }) + } + } + $ZielDateien = ZielDateienCheck $ZielDateien + + # Schreiben in Einstellungsdatei + $PfadEinstellungsDatei = PfadEinstellungsDateiHolen + $AlteEinstellungsDatei = Get-Content $PfadEinstellungsDatei + $NeueEinstellungsDatei = @() + + #Alte Ziel-Dateien loeschen + foreach ($Zeile in $AlteEinstellungsDatei) { + $Einstellung = $Zeile.Split("|") + if ($Einstellung[0] -ne "Datei") { + $NeueEinstellungsDatei += $Zeile + } + } + + #Neue Ziel-Dateien hinzufuegen + foreach ($ZielDatei in $ZielDateien) { + $ZielDateiensatz = $("Datei|" + $ZielDatei.PrefixEingang + "|" + $ZielDatei.PrefixAusgang + "|" + $ZielDatei.DateiName + "|" + $ZielDatei.WandlungsTyp) + $NeueEinstellungsDatei += $ZielDateiensatz + } + + #Einstellungsdatei loeschen und neu befuellen + Clear-Content $PfadEinstellungsDatei + foreach ($Zeile in $NeueEinstellungsdatei) { + Add-Content $PfadEinstellungsDatei $Zeile + } + + # Anzeige in Einstellungen aktualisieren (?) + # UngespeichterteAenderungen reseten! (?) +} + + +#--------------------------------------- Ende Funktionen fuer GUI ------------------------------- + +Function ExcelDateiNameErstellen ($EingestellterName, $PfadUrsprungsdatei, $PfadZielDatei) +{ + $NameUrsprungsdatei = Split-Path $PfadUrsprungsdatei -Leaf + $NameUrsprungsdateiLaenge = $NameUrsprungsdatei.Length + $NameUrsprungsdateiKurz = $NameUrsprungsdatei.Substring(0, $($NameUrsprungsdateiLaenge - 4)) + + $GesamtPfadZielDatei = $PfadZielDatei + "\" + $EingestellterName.Replace("[Ursprungsdatei]",$NameUrsprungsdateiKurz) + ".xlsx" + + return $GesamtPfadZielDatei +} + +Function ExcelDateiBeschreibenSimpel ($PfadUrsprungsdatei, $PrefixEingang, $PrefixAusgang, $ZielDatei) +{ + $Eingaenge = @() + $ZuEingang = @("FDI", "B", "S", "E", "I", "DI", "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BJ", "BK", "BL", "BM", "BN", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", "FA", "FB", "FC", "FD", "FE", "FF", "FG", "FH", "FJ", "FK", "FL", "FM", "FN", "FP", "FQ", "FR", "FS", "FT", "FU", "FV", "FW", "FX", "FY", "FZ", "SA", "SB", "SC", "SD", "SE", "SF", "SG", "SH", "SJ", "SK", "SL", "SM", "SN", "SP", "SQ", "SR", "SS", "ST", "SU", "SV", "SW", "SX", "SY", "SZ") + $Ausgaenge = @() + $ZuAusgang = @("K", "O", "Q", "M", "A", "P", "DQ", "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CJ", "CK", "CL", "CM", "CN", "CP", "CQ", "CR", "CS", "CT", "CU", "CV", "CW", "CX", "CY", "CZ", "EA", "EB", "EC", "ED", "EE", "EF", "EG", "EH", "EJ", "EK", "EL", "EM", "EN", "EP", "EQ", "ER", "ES", "ET", "EU", "EV", "EW", "EX", "EY", "EZ", "GA", "GB", "GC", "GD", "GE", "GF", "GG", "GH", "GJ", "GK", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GV", "GW", "GX", "GY", "GZ", "HA", "HB", "HC", "HD", "HE", "HF", "HG", "HH", "HJ", "HK", "HL", "HM", "HN", "HP", "HQ", "HR", "HS", "HT", "HU", "HV", "HW", "HX", "HY", "HZ", "KA", "KB", "KC", "KD", "KE", "KF", "KG", "KH", "KJ", "KK", "KL", "KM", "KN", "KP", "KQ", "KR", "KS", "KT", "KU", "KV", "KW", "KX", "KY", "KZ", "MA", "MB", "MC", "MD", "ME", "MF", "MG", "MH", "MJ", "MK", "ML", "MM", "MN", "MP", "MQ", "MR", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "PA", "PB", "PC", "PD", "PE", "PF", "PG", "PH", "PJ", "PK", "PL", "PM", "PN", "PP", "PQ", "PR", "PS", "PT", "PU", "PV", "PW", "PX", "PY", "PZ", "QA", "QB", "QC", "QD", "QE", "QF", "QG", "QH", "QJ", "QK", "QL", "QM", "QN", "QP", "QQ", "QR", "QS", "QT", "QU", "QV", "QW", "QX", "QY", "QZ", "RA", "RB", "RC", "RD", "RE", "RF", "RG", "RH", "RJ", "RK", "RL", "RM", "RN", "RP", "RQ", "RR", "RS", "RT", "RU", "RV", "RW", "RX", "RY", "RZ", "TA", "TB", "TC", "TD", "TE", "TF", "TG", "TH", "TJ", "TK", "TL", "TM", "TN", "TP", "TQ", "TR", "TS", "TT", "TU", "TV", "TW", "TX", "TY", "TZ") + $Fehler = @() + + $Ursprungdatei = Get-Content $PfadUrsprungsdatei + + AufgabenAktualisieren "Daten fuer Simpel konvertieren" + $i = 0 + foreach ($Eintrag in $Ursprungdatei) + { + $Eintragszeile = $Eintrag.Split("'") + $BMKZahl = $Eintragszeile[1] + $BMKZahl = $BMKZahl.TrimStart("'") + $Kommentar = $Eintragszeile[3] + $Kommentar = $Kommentar.TrimEnd("'") + + if ($($($BMKZahl -replace "[\d]") -in $ZuEingang)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $PrefixEingang + $BMKZahl + $Eingaenge += @([PSCustomObject]@{ + Name = $BMKZahl + Kommentar = $Kommentar + Zeile = $i + }) + } + elseif ($($($BMKZahl -replace "[\d]") -in $ZuAusgang)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $PrefixAusgang + $BMKZahl + $Ausgaenge += @([PSCustomObject]@{ + Name = $BMKZahl + Kommentar = $Kommentar + Zeile = $i + }) + } + else + { + $BMKZahlLaenge = $($BMKZahl.length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + + $Fehler += @([PSCustomObject]@{ + Name = $BMKZahl + Kommentar = $Kommentar + Zeile = $i + }) + } + + $i++ + } + + AufgabenAktualisieren "Daten fuer Simpel in Excel-Datei schreiben" + #Datei oeffnen und Arbeitsmappen erstellen + $Datei = New-Object -ComObject Excel.Application + $Mappe = $Datei.Workbooks.Add() + $Mappe.SaveAs($ZielDatei) + $Blatt = $Mappe.WorkSheets.item(1) + $Datei.Visible = $false + + #Header erstellen + #(kein Header vorhanden) + + #Schleife fuer Fehler + $i = 1 + $Fehler = $Fehler | Sort-Object "Name" + foreach ($EinzelFehler in $Fehler) { + $Blatt.Cells.Item($i,1) = $EinzelFehler.Name + $Blatt.Cells.Item($i,2) = $EinzelFehler.Kommentar + + DateiBeschreibenAktualisieren + $i++ + } + + #Schleife fuer Eingaenge + $Eingaenge = $Eingaenge | Sort-Object "Name" + foreach ($Eingang in $Eingaenge) { + $Blatt.Cells.Item($i,1) = $Eingang.Name + $Blatt.Cells.Item($i,2) = $Eingang.Kommentar + + DateiBeschreibenAktualisieren + $i++ + } + + #Schleife fuer Ausgaenge + $Ausgaenge = $Ausgaenge | Sort-Object "Name" + foreach ($Ausgang in $Ausgaenge) { + $Blatt.Cells.Item($i,1) = $Ausgang.Name + $Blatt.Cells.Item($i,2) = $Ausgang.Kommentar + + DateiBeschreibenAktualisieren + $i++ + } + + $Mappe.Save() + $Datei.Quit() + + $GleicheEingaenge = GleicheFinden $Eingaenge + $GleicheAusgaenge = GleicheFinden $Ausgaenge + + if ( $($Fehler.Length -eq 0)) + { + $Fehler += @([PSCustomObject]@{ + Name = "Keine" + Zeile = "Alle" + }) + } + + return $GleicheEingaenge, $GleicheAusgaenge, $Fehler +} + +Function ExcelDateiBeschreibenTIA ($PfadUrsprungsdatei, $PrefixEingang, $PrefixAusgang, $ZielDatei) +{ + $Eingaenge = @() + $ZuEingang = @("FDI", "B", "S", "E", "I", "DI", "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BJ", "BK", "BL", "BM", "BN", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", "FA", "FB", "FC", "FD", "FE", "FF", "FG", "FH", "FJ", "FK", "FL", "FM", "FN", "FP", "FQ", "FR", "FS", "FT", "FU", "FV", "FW", "FX", "FY", "FZ", "SA", "SB", "SC", "SD", "SE", "SF", "SG", "SH", "SJ", "SK", "SL", "SM", "SN", "SP", "SQ", "SR", "SS", "ST", "SU", "SV", "SW", "SX", "SY", "SZ") + $Ausgaenge = @() + $ZuAusgang = @("K", "O", "Q", "M", "A", "P", "DQ", "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CJ", "CK", "CL", "CM", "CN", "CP", "CQ", "CR", "CS", "CT", "CU", "CV", "CW", "CX", "CY", "CZ", "EA", "EB", "EC", "ED", "EE", "EF", "EG", "EH", "EJ", "EK", "EL", "EM", "EN", "EP", "EQ", "ER", "ES", "ET", "EU", "EV", "EW", "EX", "EY", "EZ", "GA", "GB", "GC", "GD", "GE", "GF", "GG", "GH", "GJ", "GK", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GV", "GW", "GX", "GY", "GZ", "HA", "HB", "HC", "HD", "HE", "HF", "HG", "HH", "HJ", "HK", "HL", "HM", "HN", "HP", "HQ", "HR", "HS", "HT", "HU", "HV", "HW", "HX", "HY", "HZ", "KA", "KB", "KC", "KD", "KE", "KF", "KG", "KH", "KJ", "KK", "KL", "KM", "KN", "KP", "KQ", "KR", "KS", "KT", "KU", "KV", "KW", "KX", "KY", "KZ", "MA", "MB", "MC", "MD", "ME", "MF", "MG", "MH", "MJ", "MK", "ML", "MM", "MN", "MP", "MQ", "MR", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "PA", "PB", "PC", "PD", "PE", "PF", "PG", "PH", "PJ", "PK", "PL", "PM", "PN", "PP", "PQ", "PR", "PS", "PT", "PU", "PV", "PW", "PX", "PY", "PZ", "QA", "QB", "QC", "QD", "QE", "QF", "QG", "QH", "QJ", "QK", "QL", "QM", "QN", "QP", "QQ", "QR", "QS", "QT", "QU", "QV", "QW", "QX", "QY", "QZ", "RA", "RB", "RC", "RD", "RE", "RF", "RG", "RH", "RJ", "RK", "RL", "RM", "RN", "RP", "RQ", "RR", "RS", "RT", "RU", "RV", "RW", "RX", "RY", "RZ", "TA", "TB", "TC", "TD", "TE", "TF", "TG", "TH", "TJ", "TK", "TL", "TM", "TN", "TP", "TQ", "TR", "TS", "TT", "TU", "TV", "TW", "TX", "TY", "TZ") + $Fehler = @() + + $Ursprungdatei = Get-Content $PfadUrsprungsdatei + + AufgabenAktualisieren "Daten fuer TIA konvertieren" + $i = 0 + foreach ($Eintrag in $Ursprungdatei) + { + $Eintragszeile = $Eintrag.Split("'") + $BMKZahl = $Eintragszeile[1] + $BMKZahl = $BMKZahl.TrimStart("'") + $BMKZahlOriginal = $BMKZahl + $Kommentar = $Eintragszeile[3] + $Kommentar = $Kommentar.TrimEnd("'") + + if ($($($BMKZahl -replace "[\d]") -in $ZuEingang)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKNurZahl = $BMKZahl + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $PrefixEingang + $BMKZahl + + $BMKZahlConstant = "cIn" + $BMKZahlOriginal + + $Eingaenge += @([PSCustomObject]@{ + Name = $BMKZahl + NameOriginal = $BMKZahlOriginal + NameConstant = $BMKZahlConstant + Kommentar = $Kommentar + Zahl = $BMKNurZahl + Zeile = $i + }) + } + elseif ($($($BMKZahl -replace "[\d]") -in $ZuAusgang)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKNurZahl = $BMKZahl + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $PrefixAusgang + $BMKZahl + + $BMKZahlConstant = "cOut" + $BMKZahlOriginal + + $Ausgaenge += @([PSCustomObject]@{ + Name = $BMKZahl + NameOriginal = $BMKZahlOriginal + NameConstant = $BMKZahlConstant + Kommentar = $Kommentar + Zahl = $BMKNurZahl + Zeile = $i + }) + } + else + { + $BMKNurZahl = $i + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + + $BMKZahlConstant = "cErr" + $BMKZahlOriginal + + $Fehler += @([PSCustomObject]@{ + Name = $BMKZahl + NameOriginal = $BMKZahlOriginal + NameConstant = $BMKZahlConstant + Zahl = $BMKNurZahl + Zeile = $i + }) + } + + $i++ + } + + AufgabenAktualisieren "Daten fuer TIA in Excel-Datei schreiben" + #Datei oeffnen, Arbeitsmappen erstellen und umbennenen + $Datei = New-Object -ComObject Excel.Application + $Mappe = $Datei.Workbooks.Add() + $Mappe.SaveAs($ZielDatei) + $BlattConstants = $Mappe.WorkSheets.item(1) + $BlattConstants.Name = "Constants" + $BlattPLCTags = $Mappe.WorkSheets.Add() + $BlattPLCTags.Name = "PLC Tags" + $Datei.Visible = $false + + #Header fuer Blatt "Constants" erstellen + $BlattConstants.Cells.Item(1,1) = "Name" + $BlattConstants.Cells.Item(1,2) = "Path" + $BlattConstants.Cells.Item(1,3) = "Data Type" + $BlattConstants.Cells.Item(1,4) = "Value" + $BlattConstants.Cells.Item(1,5) = "Comment" + + #Header fuer Blatt "PLC Tags" erstellen + $BlattPLCTags.Cells.Item(1,1) = "Name" + $BlattPLCTags.Cells.Item(1,2) = "Path" + $BlattPLCTags.Cells.Item(1,3) = "Data Type" + $BlattPLCTags.Cells.Item(1,4) = "Logical Address" + $BlattPLCTags.Cells.Item(1,5) = "Comment" + $BlattPLCTags.Cells.Item(1,6) = "Hmi Visible" + $BlattPLCTags.Cells.Item(1,7) = "Hmi Accessible" + $BlattPLCTags.Cells.Item(1,8) = "Hmi Writeable" + $BlattPLCTags.Cells.Item(1,9) = "Typeobject ID" + $BlattPLCTags.Cells.Item(1,10) = "Version ID" + + #Schleife fuer Fehler + $i = 2 + $j = 0 + $Fehler = $Fehler | Sort-Object "Zahl" + foreach ($EinzelFehler in $Fehler) { + #In Blatt "Constants" schreiben + $BlattConstants.Cells.Item($i,1) = $EinzelFehler.NameConstant#Name + $BlattConstants.Cells.Item($i,2) = "Import" #Path + $BlattConstants.Cells.Item($i,3) = "Int" #Data Type + $BlattConstants.Cells.Item($i,4) = $j #Value + # $BlattConstants.Cells.Item($i,5) = #Comment + + #In Blatt "PLC Tags" schreiben + $BlattPLCTags.Cells.Item($i,1) = $EinzelFehler.NameOriginal#Name + $BlattPLCTags.Cells.Item($i,2) = "Import" #Path + $BlattPLCTags.Cells.Item($i,3) = "Bool" #Data Type + $BlattPLCTags.Cells.Item($i,4) = $EinzelFehler.Name #Logical Address + $BlattPLCTags.Cells.Item($i,5) = $EinzelFehler.Kommentar #Comment + $BlattPLCTags.Cells.Item($i,6) = "'True" #Hmi Visible + $BlattPLCTags.Cells.Item($i,7) = "'True" #Hmi Accessible + $BlattPLCTags.Cells.Item($i,8) = "'True" #Hmi Writeable + # $BlattPLCTags.Cells.Item($i,9) = #Typeobject ID + # $BlattPLCTags.Cells.Item($i,10) = #Version ID + + DateiBeschreibenAktualisieren + $i++ + $j++ + } + + #Schleife fuer Eingaenge + $j = 0 + $Eingaenge = $Eingaenge | Sort-Object "Zahl" + foreach ($Eingang in $Eingaenge) { + #In Blatt "Constants" schreiben + $BlattConstants.Cells.Item($i,1) = $Eingang.NameConstant #Name + $BlattConstants.Cells.Item($i,2) = "Import" #Path + $BlattConstants.Cells.Item($i,3) = "Int" #Data Type + $BlattConstants.Cells.Item($i,4) = $j #Value + # $BlattConstants.Cells.Item($i,5) = #Comment + + #In Blatt "PLC Tags" schreiben + $BlattPLCTags.Cells.Item($i,1) = $Eingang.NameOriginal #Name + $BlattPLCTags.Cells.Item($i,2) = "Import" #Path + $BlattPLCTags.Cells.Item($i,3) = "Bool" #Data Type + $BlattPLCTags.Cells.Item($i,4) = $Eingang.Name #Logical Address + $BlattPLCTags.Cells.Item($i,5) = $Eingang.Kommentar #Comment + $BlattPLCTags.Cells.Item($i,6) = "'True" #Hmi Visible + $BlattPLCTags.Cells.Item($i,7) = "'True" #Hmi Accessible + $BlattPLCTags.Cells.Item($i,8) = "'True" #Hmi Writeable + # $BlattPLCTags.Cells.Item($i,9) = #Typeobject ID + # $BlattPLCTags.Cells.Item($i,10) = #Version ID + + DateiBeschreibenAktualisieren + $i++ + $j++ + } + + #Schleife fuer Ausgaenge + $j = 0 + $Ausgaenge = $Ausgaenge | Sort-Object "Zahl" + foreach ($Ausgang in $Ausgaenge) { + #In Blatt "Constants" schreiben + $BlattConstants.Cells.Item($i,1) = $Ausgang.NameConstant #Name + $BlattConstants.Cells.Item($i,2) = "Import" #Path + $BlattConstants.Cells.Item($i,3) = "Int" #Data Type + $BlattConstants.Cells.Item($i,4) = $j #Value + # $BlattConstants.Cells.Item($i,5) = #Comment + + #In Blatt "PLC Tags" schreiben + $BlattPLCTags.Cells.Item($i,1) = $Ausgang.NameOriginal #Name + $BlattPLCTags.Cells.Item($i,2) = "Import" #Path + $BlattPLCTags.Cells.Item($i,3) = "Bool" #Data Type + $BlattPLCTags.Cells.Item($i,4) = $Ausgang.Name #Logical Address + $BlattPLCTags.Cells.Item($i,5) = $Ausgang.Kommentar #Comment + $BlattPLCTags.Cells.Item($i,6) = "'True" #Hmi Visible + $BlattPLCTags.Cells.Item($i,7) = "'True" #Hmi Accessible + $BlattPLCTags.Cells.Item($i,8) = "'True" #Hmi Writeable + # $BlattPLCTags.Cells.Item($i,9) = #Typeobject ID + # $BlattPLCTags.Cells.Item($i,10) = #Version ID + + DateiBeschreibenAktualisieren + $i++ + $j++ + } + + $Mappe.Save() + $Datei.Quit() + + $GleicheEingaenge = GleicheFinden $Eingaenge + $GleicheAusgaenge = GleicheFinden $Ausgaenge + + if ( $($Fehler.Length -eq 0)) + { + $Fehler += @([PSCustomObject]@{ + Name = "Keine" + Zeile = "Alle" + }) + } + + return $GleicheEingaenge, $GleicheAusgaenge, $Fehler +} + +Function ExcelDateiBeschreibenWSCAD ($PfadUrsprungsdatei, $PrefixEingang, $PrefixAusgang, $ZielDatei) +{ + $Eingaenge = @() + $ZuEingang = @("FDI", "B", "S", "E", "I", "DI", "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BJ", "BK", "BL", "BM", "BN", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", "FA", "FB", "FC", "FD", "FE", "FF", "FG", "FH", "FJ", "FK", "FL", "FM", "FN", "FP", "FQ", "FR", "FS", "FT", "FU", "FV", "FW", "FX", "FY", "FZ", "SA", "SB", "SC", "SD", "SE", "SF", "SG", "SH", "SJ", "SK", "SL", "SM", "SN", "SP", "SQ", "SR", "SS", "ST", "SU", "SV", "SW", "SX", "SY", "SZ") + $Ausgaenge = @() + $ZuAusgang = @("K", "KF", "O", "Q", "M", "A", "P", "DQ", "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CJ", "CK", "CL", "CM", "CN", "CP", "CQ", "CR", "CS", "CT", "CU", "CV", "CW", "CX", "CY", "CZ", "EA", "EB", "EC", "ED", "EE", "EF", "EG", "EH", "EJ", "EK", "EL", "EM", "EN", "EP", "EQ", "ER", "ES", "ET", "EU", "EV", "EW", "EX", "EY", "EZ", "GA", "GB", "GC", "GD", "GE", "GF", "GG", "GH", "GJ", "GK", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GV", "GW", "GX", "GY", "GZ", "HA", "HB", "HC", "HD", "HE", "HF", "HG", "HH", "HJ", "HK", "HL", "HM", "HN", "HP", "HQ", "HR", "HS", "HT", "HU", "HV", "HW", "HX", "HY", "HZ", "KA", "KB", "KC", "KD", "KE", "KG", "KH", "KJ", "KK", "KL", "KM", "KN", "KP", "KQ", "KR", "KS", "KT", "KU", "KV", "KW", "KX", "KY", "KZ", "MA", "MB", "MC", "MD", "ME", "MF", "MG", "MH", "MJ", "MK", "ML", "MM", "MN", "MP", "MQ", "MR", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "PA", "PB", "PC", "PD", "PE", "PF", "PG", "PH", "PJ", "PK", "PL", "PM", "PN", "PP", "PQ", "PR", "PS", "PT", "PU", "PV", "PW", "PX", "PY", "PZ", "QA", "QB", "QC", "QD", "QE", "QF", "QG", "QH", "QJ", "QK", "QL", "QM", "QN", "QP", "QQ", "QR", "QS", "QT", "QU", "QV", "QW", "QX", "QY", "QZ", "RA", "RB", "RC", "RD", "RE", "RF", "RG", "RH", "RJ", "RK", "RL", "RM", "RN", "RP", "RQ", "RR", "RS", "RT", "RU", "RV", "RW", "RX", "RY", "RZ", "TA", "TB", "TC", "TD", "TE", "TF", "TG", "TH", "TJ", "TK", "TL", "TM", "TN", "TP", "TQ", "TR", "TS", "TT", "TU", "TV", "TW", "TX", "TY", "TZ") + $Fehler = @() + + $Ursprungsdatei = Get-Content $PfadUrsprungsdatei + + AufgabenAktualisieren "Daten fuer WSCAD konvertieren" + + $i = 0 + foreach ($Eintrag in $Ursprungsdatei) { + $Eintragszeile = $Eintrag.Split("'") + $BMKZahl = $Eintragszeile[1] + $BMKZahl = $BMKZahl.TrimStart("'") + $Kommentar = $Eintragszeile[3] + $Kommentar = $Kommentar.TrimEnd("'") + + if ($($($BMKZahl -replace "[\d]") -in $ZuEingang)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + + #Bis zu zwei Voranstehende Nullen entfernen + if ($BMKZahl.Length -ge 4 -and $BMKZahl.Substring(0,1) -eq "0") { + $BMKZahl = $BMKZahl.Substring(1) + if ($BMKZahl.Length -ge 4 -and $BMKZahl.Substring(0,1) -eq "0") { + $BMKZahl = $BMKZahl.Substring(1) + } + } + + $BMKZahl = $PrefixEingang + $BMKZahl + $Eingaenge += @([PSCustomObject]@{ + Name = $BMKZahl + Kommentar = $Kommentar + Zeile = $i + }) + } + elseif ($($($BMKZahl -replace "[\d]") -in $ZuAusgang)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + + #Bis zu zwei Voranstehende Nullen entfernen + if ($BMKZahl.Length -ge 3 -and $BMKZahl.Substring(0,1) -eq "0") { + $BMKZahl = $BMKZahl.Substring(1) + if ($BMKZahl.Length -ge 3 -and $BMKZahl.Substring(0,1) -eq "0") { + $BMKZahl = $BMKZahl.Substring(1) + } + } + + $BMKZahl = $PrefixAusgang + $BMKZahl + $Ausgaenge += @([PSCustomObject]@{ + Name = $BMKZahl + Kommentar = $Kommentar + Zeile = $i + }) + } + else + { + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $Fehler += @([PSCustomObject]@{ + Name = $BMKZahl + Kommentar = $Kommentar + Zeile = $i + }) + } + + $i++ + } + + AufgabenAktualisieren "Anschluesse fuer Eingaenge ergaenzen" + $Eingaenge = AnschluesseErgaenzen $Eingaenge + AufgabenAktualisieren "Anschluesse fuer Ausgaenge ergaenzen" + $Ausgaenge = AnschluesseErgaenzen $Ausgaenge + + AufgabenAktualisieren "Daten fuer WSCAD in Excel-Datei schreiben" + #Datei oeffnen und Arbeitmappe erstellen + $Datei = New-Object -ComObject Excel.Application + $Mappe = $Datei.Workbooks.Add() + $Mappe.SaveAs($ZielDatei) + $Blatt = $Mappe.WorkSheets.item(1) + $Datei.Visible = $false + + #Header erstellen + $Blatt.Cells.Item(1,1) = "Anschluss" + $Blatt.Cells.Item(1,2) = "Kommentar" + $Blatt.Cells.Item(1,3) = "Symboltext" + $Blatt.Cells.Item(1,4) = "Bezug" + $Blatt.Cells.Item(1,5) = "Sondertext 1" + $Blatt.Cells.Item(1,6) = "Sondertext 2" + $Blatt.Cells.Item(1,7) = "Sondertext 3" + $Blatt.Cells.Item(1,8) = "Sondertext 4" + $Blatt.Cells.Item(1,9) = "Sondertext 5" + $Blatt.Cells.Item(1,10) = "Sondertext 6" + $Blatt.Cells.Item(1,11) = "Sondertext 7" + $Blatt.Cells.Item(1,12) = "Sondertext 8" + + #Schleife fuer Fehler + $i = 2 + $Fehler = $Fehler | Sort-Object "Name" + foreach ($EinzelFehler in $Fehler) { + #In Blatt schreiben + $Blatt.Cells.Item($i,1) = $EinzelFehler.Name #Anschluss + $Blatt.Cells.Item($i,2) = $EinzelFehler.Kommentar #Kommentar + # $Blatt.Cells.Item($i,3) = "" #Symboltext + # $Blatt.Cells.Item($i,4) = "" #Bezug + + DateiBeschreibenAktualisieren + $i++ + } + + #Schleife fuer Eingaenge + $Eingaenge = $Eingaenge | Sort-Object "Name" + foreach ($Eingang in $Eingaenge) { + #In Blatt schreiben + $Blatt.Cells.Item($i,1) = $Eingang.Name #Anschluss + $Blatt.Cells.Item($i,2) = $Eingang.Kommentar #Kommentar + # $Blatt.Cells.Item($i,3) = "" #Symboltext + # $Blatt.Cells.Item($i,4) = "" #Bezug + + DateiBeschreibenAktualisieren + $i++ + } + + #Schleife fuer Ausgaenge + $Ausgaenge = $Ausgaenge | Sort-Object "Name" + foreach ($Ausgang in $Ausgaenge) { + #In Blatt schreiben + $Blatt.Cells.Item($i,1) = $Ausgang.Name #Anschluss + $Blatt.Cells.Item($i,2) = $Ausgang.Kommentar #Kommentar + # $Blatt.Cells.Item($i,3) = "" #Symboltext + # $Blatt.Cells.Item($i,4) = "" #Bezug + + DateiBeschreibenAktualisieren + $i++ + } + + $Mappe.Save() + $Datei.Quit() + + $GleicheEingaenge = GleicheFinden $Eingaenge + $GleicheAusgaenge = GleicheFinden $Ausgaenge + + if ( $($Fehler.Length -eq 0)) + { + $Fehler += @([PSCustomObject]@{ + Name = "Keine" + Zeile = "Alle" + }) + } + + return $GleicheEingaenge, $GleicheAusgaenge, $Fehler +} + +Function ExcelDateiBeschreibenWSCAD_Bezug ($PfadUrsprungsdatei, $PrefixEingang, $PrefixAusgang, $ZielDatei) +{ + $Eingaenge = @() + $ZuEingang = @("FDI", "B", "S", "E", "I", "DI", "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BJ", "BK", "BL", "BM", "BN", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", "FA", "FB", "FC", "FD", "FE", "FF", "FG", "FH", "FJ", "FK", "FL", "FM", "FN", "FP", "FQ", "FR", "FS", "FT", "FU", "FV", "FW", "FX", "FY", "FZ", "SA", "SB", "SC", "SD", "SE", "SF", "SG", "SH", "SJ", "SK", "SL", "SM", "SN", "SP", "SQ", "SR", "SS", "ST", "SU", "SV", "SW", "SX", "SY", "SZ") + $Ausgaenge = @() + $ZuAusgang = @("K", "KF", "O", "Q", "M", "A", "P", "DQ", "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CJ", "CK", "CL", "CM", "CN", "CP", "CQ", "CR", "CS", "CT", "CU", "CV", "CW", "CX", "CY", "CZ", "EA", "EB", "EC", "ED", "EE", "EF", "EG", "EH", "EJ", "EK", "EL", "EM", "EN", "EP", "EQ", "ER", "ES", "ET", "EU", "EV", "EW", "EX", "EY", "EZ", "GA", "GB", "GC", "GD", "GE", "GF", "GG", "GH", "GJ", "GK", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GV", "GW", "GX", "GY", "GZ", "HA", "HB", "HC", "HD", "HE", "HF", "HG", "HH", "HJ", "HK", "HL", "HM", "HN", "HP", "HQ", "HR", "HS", "HT", "HU", "HV", "HW", "HX", "HY", "HZ", "KA", "KB", "KC", "KD", "KE", "KG", "KH", "KJ", "KK", "KL", "KM", "KN", "KP", "KQ", "KR", "KS", "KT", "KU", "KV", "KW", "KX", "KY", "KZ", "MA", "MB", "MC", "MD", "ME", "MF", "MG", "MH", "MJ", "MK", "ML", "MM", "MN", "MP", "MQ", "MR", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "PA", "PB", "PC", "PD", "PE", "PF", "PG", "PH", "PJ", "PK", "PL", "PM", "PN", "PP", "PQ", "PR", "PS", "PT", "PU", "PV", "PW", "PX", "PY", "PZ", "QA", "QB", "QC", "QD", "QE", "QF", "QG", "QH", "QJ", "QK", "QL", "QM", "QN", "QP", "QQ", "QR", "QS", "QT", "QU", "QV", "QW", "QX", "QY", "QZ", "RA", "RB", "RC", "RD", "RE", "RF", "RG", "RH", "RJ", "RK", "RL", "RM", "RN", "RP", "RQ", "RR", "RS", "RT", "RU", "RV", "RW", "RX", "RY", "RZ", "TA", "TB", "TC", "TD", "TE", "TF", "TG", "TH", "TJ", "TK", "TL", "TM", "TN", "TP", "TQ", "TR", "TS", "TT", "TU", "TV", "TW", "TX", "TY", "TZ") + $Fehler = @() + + $Ursprungsdatei = Get-Content $PfadUrsprungsdatei + + AufgabenAktualisieren "Daten fuer WSCAD_Bezug konvertieren" + + $i = 0 + foreach ($Eintrag in $Ursprungsdatei) { + $Eintragszeile = $Eintrag.Split("'") + $BMKZahl = $Eintragszeile[1] + $BMKZahl = $BMKZahl.TrimStart("'") + $Kommentar = $Eintragszeile[3] + $Kommentar = $Kommentar.TrimEnd("'") + $Bezug = $Eintragszeile[7] + $Bezug = $Bezug.TrimEnd("'") + #$Bezug = "'" + $Bezug + + if ($($($BMKZahl -replace "[\d]") -in $ZuEingang)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + + #Bis zu zwei Voranstehende Nullen entfernen + if ($BMKZahl.Length -ge 4 -and $BMKZahl.Substring(0,1) -eq "0") { + $BMKZahl = $BMKZahl.Substring(1) + if ($BMKZahl.Length -ge 4 -and $BMKZahl.Substring(0,1) -eq "0") { + $BMKZahl = $BMKZahl.Substring(1) + } + } + + $BMKZahl = $PrefixEingang + $BMKZahl + $Eingaenge += @([PSCustomObject]@{ + Name = $BMKZahl + Kommentar = $Kommentar + Zeile = $i + Bezug = $Bezug + }) + } + elseif ($($($BMKZahl -replace "[\d]") -in $ZuAusgang)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + + #Bis zu zwei Voranstehende Nullen entfernen + if ($BMKZahl.Length -ge 3 -and $BMKZahl.Substring(0,1) -eq "0") { + $BMKZahl = $BMKZahl.Substring(1) + if ($BMKZahl.Length -ge 3 -and $BMKZahl.Substring(0,1) -eq "0") { + $BMKZahl = $BMKZahl.Substring(1) + } + } + + $BMKZahl = $PrefixAusgang + $BMKZahl + $Ausgaenge += @([PSCustomObject]@{ + Name = $BMKZahl + Kommentar = $Kommentar + Zeile = $i + Bezug = $Bezug + }) + } + else + { + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $Fehler += @([PSCustomObject]@{ + Name = $BMKZahl + Kommentar = $Kommentar + Zeile = $i + Bezug = $Bezug + }) + } + + $i++ + } + + AufgabenAktualisieren "Anschluesse fuer Eingaenge ergaenzen" + $Eingaenge = AnschluesseErgaenzen $Eingaenge + AufgabenAktualisieren "Anschluesse fuer Ausgaenge ergaenzen" + $Ausgaenge = AnschluesseErgaenzen $Ausgaenge + + AufgabenAktualisieren "Daten fuer WSCAD_Bezug in Excel-Datei schreiben" + #Datei oeffnen und Arbeitmappe erstellen + $Datei = New-Object -ComObject Excel.Application + $Mappe = $Datei.Workbooks.Add() + $Mappe.SaveAs($ZielDatei) + $Blatt = $Mappe.WorkSheets.item(1) + $Datei.Visible = $false + + $Blatt.Columns("D").NumberFormat = "@" + + #Header erstellen + $Blatt.Cells.Item(1,1) = "Anschluss" + $Blatt.Cells.Item(1,2) = "Kommentar" + $Blatt.Cells.Item(1,3) = "Symboltext" + $Blatt.Cells.Item(1,4) = "Bezug" + $Blatt.Cells.Item(1,5) = "Sondertext 1" + $Blatt.Cells.Item(1,6) = "Sondertext 2" + $Blatt.Cells.Item(1,7) = "Sondertext 3" + $Blatt.Cells.Item(1,8) = "Sondertext 4" + $Blatt.Cells.Item(1,9) = "Sondertext 5" + $Blatt.Cells.Item(1,10) = "Sondertext 6" + $Blatt.Cells.Item(1,11) = "Sondertext 7" + $Blatt.Cells.Item(1,12) = "Sondertext 8" + + #Schleife fuer Fehler + $i = 2 + $Fehler = $Fehler | Sort-Object "Name" + foreach ($EinzelFehler in $Fehler) { + #In Blatt schreiben + $Blatt.Cells.Item($i,1) = $EinzelFehler.Name #Anschluss + $Blatt.Cells.Item($i,2) = $EinzelFehler.Kommentar #Kommentar + # $Blatt.Cells.Item($i,3) = "" #Symboltext + $Blatt.Cells.Item($i,4) = $EinzelFehler.Bezug #Bezug + + DateiBeschreibenAktualisieren + $i++ + } + + #Schleife fuer Eingaenge + $Eingaenge = $Eingaenge | Sort-Object "Name" + foreach ($Eingang in $Eingaenge) { + #In Blatt schreiben + $Blatt.Cells.Item($i,1) = $Eingang.Name #Anschluss + $Blatt.Cells.Item($i,2) = $Eingang.Kommentar #Kommentar + # $Blatt.Cells.Item($i,3) = "" #Symboltext + $Blatt.Cells.Item($i,4) = $Eingang.Bezug #Bezug + + DateiBeschreibenAktualisieren + $i++ + } + + #Schleife fuer Ausgaenge + $Ausgaenge = $Ausgaenge | Sort-Object "Name" + foreach ($Ausgang in $Ausgaenge) { + #In Blatt schreiben + $Blatt.Cells.Item($i,1) = $Ausgang.Name #Anschluss + $Blatt.Cells.Item($i,2) = $Ausgang.Kommentar #Kommentar + # $Blatt.Cells.Item($i,3) = "" #Symboltext + $Blatt.Cells.Item($i,4) = $Ausgang.Bezug #Bezug + + DateiBeschreibenAktualisieren + $i++ + } + + $Mappe.Save() + $Datei.Quit() + + $GleicheEingaenge = GleicheFinden $Eingaenge + $GleicheAusgaenge = GleicheFinden $Ausgaenge + + if ( $($Fehler.Length -eq 0)) + { + $Fehler += @([PSCustomObject]@{ + Name = "Keine" + Zeile = "Alle" + }) + } + + return $GleicheEingaenge, $GleicheAusgaenge, $Fehler +} + +Function GleicheFinden ($ZuUeberpruefen) +{ + $ZuUeberpruefen = $ZuUeberpruefen | Sort-Object "Name" + $Gleiche = @() + for ($i = 0; $i -lt $($ZuUeberpruefen.Count - 1); $i++) + { + $IstGleich = $($ZuUeberpruefen[$i].Name -eq $ZuUeberpruefen[$($i+1)].Name) + if ($IstGleich) + { + # Eintrag hinzufuegen + if (-not $($Gleiche[-1].Zeile -eq $ZuUeberpruefen[$i].Zeile)) + { + $Gleiche += $ZuUeberpruefen[$i] + } + $Gleiche += $ZuUeberpruefen[$($i+1)] + } + } + + if ( $($Gleiche.Length -eq 0)) + { + $Gleiche += @([PSCustomObject]@{ + Name = "Keine" + Zeile = "Alle" + }) + } + + return $Gleiche +} + +Function AnschluesseErgaenzen ($Anschluesse) +{ + $Anschluesse = $Anschluesse | Sort-Object "Name" + + # $Pfad = $TXTPfadFeld.Text + # $Datei = Get-Content $Pfad + # $ZielDateien = ZielDateienHolen + # $GesamtEintraege = $($ZielDateien.count) * $($Datei.Length) + # Write-Host "Initiale GesamtEintraege: " $GesamtEintraege + + # Write-Host "Uebergebene Anschluesse: " $Anschluesse + foreach ($Anschluss in $Anschluesse) { + # Write-Host "Aktueller Anschluss: " $Anschluss.Name + $AnschlussBauteil = $Anschluss.Name.Substring(0,$Anschluss.Name.Length - 2) + $SollAnschluesse = @(0,1,2,3,4,5,6,7) + foreach ($SubAnschluss in $Anschluesse) { + # Write-Host "Aktueller Sub-Anschluss: " $SubAnschluss.Name + $SubAnschlussBauteil = $SubAnschluss.Name.Substring(0,$SubAnschluss.Name.Length - 2) + if ($SubAnschlussBauteil -eq $AnschlussBauteil) { + # Write-Host "Fall eingetreten: Vorletzte Stelle von Anschluss und SubAnschluss sind gleich" + $SubAnschlussLetzteStelle = $($SubAnschluss.Name).Substring($SubAnschluss.Name.Length - 1,1) + # Write-Host "Inhalt von SubAnschlussLetzteStelle: " $SubAnschlussLetzteStelle + # Write-Host "Alte SollAnschluesse: " $SollAnschluesse + $SollAnschluesse = $SollAnschluesse | Where-Object {$_ -ne $SubAnschlussLetzteStelle} + # Write-Host "Neue SollAnschluesse: " $SollAnschluesse + } + } + # Write-Host "Uebergebene fehlende Anschluesse: " $SollAnschluesse + foreach ($FehlenderAnschluss in $SollAnschluesse) { + # Write-Host "Aktuell fehlender Anschluss: " $FehlenderAnschluss + + #Fur die FortschrittsAnzeige die Anzahl der GesamtEintraege nach oben korrigieren + [System.Double] $GesamtEintraege = $FATextfeldGesamtEintraege.Text + $GesamtEintraege++ + $FATextfeldGesamtEintraege.Text = $GesamtEintraege + + $Name = $Anschluss.Name + $BMKZahl = $($($Name.Substring(0,$Name.Length - 1)) + $FehlenderAnschluss) + $Anschluesse += @([PSCustomObject]@{ + Name = $BMKZahl + Kommentar = "" + #Zeile = "" wird nich gebraucht, da hier keine Duplikate auftreten koennen. Ausserdem gibt es ohnehin keine zugehoerige Zeile in der UrsprungsDatei + Bezug = "" + }) + # Write-Host "Neue Anschluesse: " $Anschluesse + } + } + Write-Host "Aktualisierte Zahl GesamtEintraege: " $GesamtEintraege + $Anschluesse = $Anschluesse | Sort-Object "Name" + # Write-Host "Neue Anschluesse: " $Anschluesse + + return $Anschluesse +} + +Main \ No newline at end of file diff --git a/Test-Dateien/BELYARN_20230404.txt b/Test-Dateien/BELYARN_20230404.txt new file mode 100644 index 0000000..0c6c1bc --- /dev/null +++ b/Test-Dateien/BELYARN_20230404.txt @@ -0,0 +1,554 @@ +'DI0023','STEUERSPANNUNG 24V UC200 OK','24V OK','=A01+UH000-KF02i','STEUERSPANNUNG 24V UC200 OK','CONTROL VOLTAGE 24V UC200 OK','TENSION DE MANIOBRA 24V UC200 OK','' +'DI0020','STEUERSPANNUNG 24V UH000 OK','24V OK UH000','=A01+UH000-KF02i','STEUERSPANNUNG 24V UH000 OK','CONTROL VOLTAGE 24V UH000 OK','TENSION DE MANIOBRA 24V UH000 OK','' +'DI0022','STEUERSPANNUNG 24V UC103 ','24V OK','=A01+UH000-KF02i','STEUERSPANNUNG 24V UC103 OK','CONTROL VOLTAGE 24V UC103 OK','TENSION DE MANIOBRA 24V UC103 OK','' +'DI0021','STEUERSPANNUNG 24V UC102-UC101 OK','24V OK','=A01+UH000-KF02i','STEUERSPANNUNG 24V UC102-UC101 OK','CONTROL VOLTAGE 24V UC102-UC101 OK','TENSION DE MANIOBRA 24V UC102-UC101 OK','' +'KF0013','DRUCKL.-WARTUNGSEINH. SCHLIESSEN','COMPR. AIR OFF','=A01+UH000-KF01Q','DRUCKL.-WARTUNGSEINH. SCHLIESSEN','CLOSE PRESS.-MAINTENANCE UNIT','AIRE COMPRIMIDO/VÁLVULA DE AISLAMIENTO C','' +'KF0012','RESET NOT HALT','RESET E-STOP','=A01+UH000-KF01Q','RESET NOT HALT','RESET EMERGENCY STOP','RESET PARO DE EMERGENCIA','' +'PF0011','ÜBERSTROM/SICHERUNGSFALL','IL-YE-LED','=A01+UH000-KF01Q','ÜBERSTROM/SICHERUNGSFALL','OVERCURRENT/MIN. CIRCUIT BREAKERS','SOBREINTENSIDAD/FUSIBLE AUTOMÁTICO','' +'PF0010','DRUCKLUFT FEHLT','IL-YE-LED','=A01+UH000-KF01Q','DRUCKLUFT FEHLT','COMPRESSED AIR MISSING','AIRE COMPRIMIDO DESCONECTADO','' +'PF0002','START NACH STÖRUNG','IPB-CL-LED','=A01+UH000-KF00Q','START NACH STÖRUNG','START AFTER TROUBLE','ARRANQUE DESPUÉS DE AVERÍA','' +'PF0004','STÖRUNG KOMMUNIKATION PC-SPS','IL-YE-LED','=A01+UH000-KF00Q','STÖRUNG KOMMUNIKATION PC-SPS','TROUBLE COMMUNICATION PC-PLC','AVERÍA COMMUNICATIÓN PC-CPP','' +'PF0006','ABHEBEN AKTIV','IL-YE-LED','=A01+UH000-KF00Q','ABHEBEN AKTIV','LIFT OFF ACTIVE','SEPARAR ACTIVO','' +'PF0005','LAUFZEITFEHLER','IPB-YE-LED','=A01+UH000-KF00Q','LAUFZEITFEHLER','TRAVEL TIME ERROR','ERROR DE TIEMPO','' +'PF0003','NOT HALT BETÄTIGT','IL-YE-LED','=A01+UH000-KF00Q','NOT HALT BETÄTIGT','EMERGENCY STOP PUSHED','PARO EMERGENCIA OK','' +'PF0001','ANLAGE EIN','IPB-GN-LED','=A01+UH000-KF00Q','ANLAGE EIN','SYSTEM ON','SISTEMA ENCENDIDO','' +'PF0000','STÖRUNG ALLGEMEIN','IL-YE-LED','=A01+UH000-KF00Q','STÖRUNG ALLGEMEIN','GENERAL TROUBLE','AVERÍA','' +'DI0017','PHASENÜBERWACHUNGSRELAIS 400VAC EIN','MONITOR. RELAY','=A01+UH000-KF01i','PHASENÜBERWACHUNGSRELAIS 400VAC EIN','PHASE MONITORING RELAY 400VAC ON','VIGILANCIA DE FASE EL RELE´','' +'SF0015','RESET AKTIV','PB-BK-NO','=A01+UH000-KF01i','RESET AKTIV','RESET ACTIVE','RESET AKTIVA','' +'DI0014','HAUPTSCHÜTZE EIN','MAIN CONTACT.','=A01+UH000-KF01i','HAUPTSCHÜTZE EIN','MAIN CONTACTORS ON','ENCENDIDO CONTACTOR PRINCIPAL','' +'DI0013','SICHERHEITSRELAIS EIN','SAFETY RELAY','=A01+UH000-KF01i','SICHERHEITSRELAIS EIN','SAFETY RELAY ON','RELÉ DE SEGURIDAD ENCENDIDO','' +'DI0012','SICHERUNGSAUTOMATENFALL','CIRCUIT BR.','=A01+UH000-KF01i','SICHERUNGSAUTOMATENFALL','MINIATURE CIRCUIT BREAKERS','FUSIBLE AUTOMÁTICO','' +'DI0011','ÜBERSTROM','MOTORS','=A01+UH000-KF01i','ÜBERSTROM','OVERCURRENT','SOBREINTENSIDAD','' +'BG0010','DRUCKLUFT OK','COMPR. AIR','=A01+UH000-KF01i','DRUCKLUFT OK','COMPRESSED AIR OK','AIRE COMPRIMIDO OK','' +'SF0004','LAMPENTEST','PB-WH-NO','=A01+UH000-KF00i','LAMPENTEST','LAMP TEST','ENSAYO LAMPARA','' +'SF0006','ANTRIEBE ABHEBEN','SS-BK-NO','=A01+UH000-KF00i','ANTRIEBE ABHEBEN','LIFT OFF CONVEYORS','SEPARAR MOTOR','' +'SF0005','LAUFZEITFEHLER','IPB-YE-N0','=A01+UH000-KF00i','LAUFZEITFEHLER','TRAVEL TIME ERROR','ERROR DE TIEMPO','' +'SF0003','NOT HALT SCHALTSCHRANK','EPB-RD-NC','=A01+UH000-KF00i','NOT HALT','EMERGENCY STOP','PARO DE EMERGENCIA ARMARIO DE DISTRIBUCI','' +'SF0002','START NACH STÖRUNG','IPB-CL-NO','=A01+UH000-KF00i','START NACH STÖRUNG','START AFTER TROUBLE','ARRANQUE DESPUÉS DE AVERÍA','' +'SF0001','ANLAGE EIN','IPB-GN-NO','=A01+UH000-KF00i','ANLAGE EIN','SYSTEM ON','SISTEMA ENCENDIDO','' +'SF0000','ANLAGE AUS','PB-BK-NC','=A01+UH000-KF00i','ANLAGE AUS','SYSTEM OFF','SISTEMA APAGADO','' +'BG1303','SENSOR HAUPTSTR. FB213','LT-FB213','=A01+UC102-KF04i','','','','' +'BG1424','SENSOR HAUPTSTR. EINFAHRT FB211','LT-ENTER FB211','=A01+UH000-KF05i','','','','' +'BG1462','SENSOR HAUPTSTR. AUSFAHRT FB222','LT-EXIT-FB222','=A01+UH000-KF08i','','','','' +'BG3233','SENSOR HAUPTSTR. FB322','LT-FB322','=A01+UH000-KF16i','','','','' +'BG3133','SENSOR HAUPTSTR. FB312','LT-FB312','=A01+UH000-KF12i','','','','' +'MB1487','WEICHE ABZWEIG AUSFAHRT FB222','SW EXIT FB222','=A01+UH000-KF10Q','','','','' +'MA1437','ANTRIEB HAUPTSTR. AUSFAHRT RF - RSM FB212','M-BI FB212','=A01+UH000-KF05Q','','','','' +'MA1436','ANTRIEB HAUPTSTR. EINFAHRT RF - RSM FB211','M-BI FB211','=A01+UH000-KF05Q','','','','' +'BG1460','SENSOR HAUPTSTR. AUSFAHRT FB221','LT- EXIT FB221','=A01+UH000-KF08i','','','','' +'BG1417','SENSOR HAUPTSTR. FLYER 6','LT-ENTER RF6','=A01+UH000-KF04i','','','','' +'MA1480','ANTRIEB HAUPTSTR. EINFAHRT RF - RSM FB221','M-BI FB221','=A01+UH000-KF10Q','','','','' +'QA1525','ANTRIEB HAUPTSTR. RF 8','M-BI RF 8','=A01+UC103-KF02Q','','','','' +'MA1524','ANTRIEB HAUPTSTR. RF 8','M-BI RF 8','=A01+UC103-KF02Q','','','','' +'BG1140','SENSOR HAUPTSTR. FLYER 3 FB215','LT RF3 FB215','=A01+UC101-KF06i','','','','' +'MB1486','WEICHE ABZWEIG HAUPTSTR. EINFAHRT FB73','SW ENTER ','=A01+UH000-KF10Q','','','','' +'QA1483','ANTRIEB HAUPTSTR. RF - RSM','M-BI RSM-RF','=A01+UH000-KF10Q','','','','' +'MA1482','ANTRIEB HAUPTSTR. RF - RSM','M-BI RF-RSM','=A01+UH000-KF10Q','','','','' +'BG1457','SENSOR HAUPTSTR. EINFAHRT FB222','LT-ENTER-FB222','=A01+UH000-KF07i','','','','' +'BG1461','SENSOR HAUPTSTR. EINFAHRT FB221','LT-ENTER-FB221','=A01+UH000-KF08i','','','','' +'BG1420','SENSOR HAUPTSTR. AUSFAHRT FB213','LT- EXIT FB213','=A01+UH000-KF05i','','','','' +'MA1484','ANTRIEB HAUPTSTR. AUSFAHRT RF - RSM FB222','M-BI FB222','=A01+UH000-KF10Q','','','','' +'BG1421','SENSOR HAUPTSTR. FB212','LT-FB212','=A01+UH000-KF05i','','','','' +'QA1477','ANTRIEB EIN-AUSFAHRT HAUPTSTR. RF - RSM','M-BI RSM-RF','=A01+UH000-KF09Q','','','','' +'MA1476','ANTRIEB EIN-AUSFAHRT HAUPTSTR. RF - RSM','M-BI RF-RSM','=A01+UH000-KF09Q','','','','' +'MB3236','WEICHE GERADE FB320','STRAIGHT','=A01+UH000-KF20Q','','','','' +'MB3237','WEICHE ABZWEIG FB320','BRANCH ','=A01+UH000-KF20Q','','','','' +'BG3231','SENSOR HAUPTSTR. FB321','LT-FB321','=A01+UH000-KF16i','','','','' +'BG3132','SENSOR HAUPTSTR. FB310-FB320','LT-FB310-FB320','=A01+UH000-KF12i','','','','' +'MB3136','WEICHE GERADE FB310','STRAIGHT','=A01+UH000-KF14Q','','','','' +'MB3137','WEICHE ABZWEIG FB310','BRANCH ','=A01+UH000-KF14Q','','','','' +'QA1433','ANTRIEB EIN-AUSFAHRT HAUPTSTR. RF - RSM','M-BI RSM-RF','=A01+UH000-KF05Q','','','','' +'MA1432','ANTRIEB EIN-AUSFAHRT HAUPTSTR. RF - RSM','M-BI RF-RSM','=A01+UH000-KF05Q','','','','' +'MB1422','WEICHE ABZWEIG PUFFER FB212','SW EXIT FB212','=A01+UH000-KF04Q','','','','' +'BG1423','SENSOR HAUPTSTR. AUSFAHRT FB212','LT-EXIT FB212','=A01+UH000-KF05i','','','','' +'QA3235','ANTRIEB HAUPTSTRECKE -> RSM 28-21 ','RA-BI','=A01+UH000-KF20Q','','','','' +'MA3234','ANTRIEB HAUPTSTRECKE -> RSM 21-28 ','RA-BI','=A01+UH000-KF20Q','','','','A' +'QA3135','ANTRIEB HAUPTSTRECKE -> RSM 10-1','RA-BI','=A01+UH000-KF14Q','','','','' +'MA3134','ANTRIEB HAUPTSTRECKE -> RSM 1-10','RA-BI','=A01+UH000-KF14Q','','','','A' +'QA3035','ANTRIEB HAUPTSTRECKE -> RSM 10-1','RA-BI','=A01+UC200-KF03Q','','','','' +'MA3034','ANTRIEB HAUPTSTRECKE -> RSM 1-10','RA-BI','=A01+UC200-KF03Q','','','','A' +'PF3214','RUNDUMLEUCHTE STÖRUNG RSM 11-20','LED-YE_FAULT','=A01+UH000-KF18Q','','','','' +'SF3216','RESET/START NACH NOT HALT RSM 21-25','IPB-YE-NO','=A01+UH000-KF14i','RESET','RESET','RESET','' +'PF3216','RESET/START NACH NOT HALT RSM 21-25','IPB-YE-LED ','=A01+UH000-KF18Q','','','','' +'SF3215','NOT HALT RSM 21-25','EPB-NC','=A01+UH000-KF14i','NOT-HALT','E-STOP','E-STOP','' +'PF3114','RUNDUMLEUCHTE STÖRUNG RSM 11-20','LED-YE_FAULT','=A01+UH000-KF12Q','','','','' +'SF3116','RESET/START NACH NOT HALT RSM 11-20','IPB-YE-NO','=A01+UH000-KF10i','RESET','RESET','RESET','' +'PF3116','RESET/START NACH NOT HALT RSM 11-20','IPB-YE-LED ','=A01+UH000-KF12Q','','','','' +'SF3115','NOT HALT RSM 11-20','EPB-NC','=A01+UH000-KF10i','NOT-HALT','E-STOP','E-STOP','' +'SF3226','ZUG WECHSELN RSM 30','LDT-GN-NO','=A01+UH000-KF15i','-UZ3226','-UZ3226','','' +'PF3254','ZUG WECHSELN RSM 30','LDT-GN-LED ','=A01+UH000-KF22Q','','','','' +'QA3257','ANTRIEB AUSFAHREN RSM 30','RA-BI','=A01+UH000-KF22Q','','','','' +'MA3256','ANTRIEB EINFAHREN RSM 30','RA-BI','=A01+UH000-KF22Q','','','','A' +'BG3227','SENSOR OPTISCH RSM 30','OPT. AP110','=A01+UH000-KF15i','','','','' +'SF3224','ZUG WECHSELN RSM 29','LDT-GN-NO','=A01+UH000-KF15i','-UZ3224','-UZ3224','','' +'PF3250','ZUG WECHSELN RSM 29','LDT-GN-LED ','=A01+UH000-KF22Q','','','','' +'MB3251','WEICHE ABZWEIG RSM 29','SW RSM 29','=A01+UH000-KF22Q','','','','' +'QA3253','ANTRIEB AUSFAHREN RSM 29','RA-BI','=A01+UH000-KF22Q','','','','' +'MA3252','ANTRIEB EINFAHREN RSM 29','RA-BI','=A01+UH000-KF22Q','','','','A' +'BG3225','SENSOR OPTISCH RSM 29','OPT. AP110','=A01+UH000-KF15i','','','','' +'MB3241','WEICHE ABZWEIG RSM 27','SW RSM 27','=A01+UH000-KF21Q','','','','' +'MB3231','WEICHE ABZWEIG RSM 26','SW RSM 26','=A01+UH000-KF20Q','','','','' +'MB3245','WEICHE ABZWEIG RSM 28','SW RSM 28','=A01+UH000-KF21Q','','','','' +'QA3247','ANTRIEB AUSFAHREN RSM 28','RA-BI','=A01+UH000-KF21Q','','','','' +'MA3246','ANTRIEB EINFAHREN RSM 28','RA-BI','=A01+UH000-KF21Q','','','','A' +'BG3223','SENSOR OPTISCH RSM 28','OPT. AP110','=A01+UH000-KF15i','','','','' +'QA3243','ANTRIEB AUSFAHREN RSM 27','RA-BI','=A01+UH000-KF21Q','','','','' +'MA3242','ANTRIEB EINFAHREN RSM 27','RA-BI','=A01+UH000-KF21Q','','','','A' +'BG3221','SENSOR OPTISCH RSM 27','OPT. AP110','=A01+UH000-KF15i','','','','' +'QA3233','ANTRIEB AUSFAHREN RSM 26','RA-BI','=A01+UH000-KF20Q','','','','' +'MA3232','ANTRIEB EINFAHREN RSM 26','RA-BI','=A01+UH000-KF20Q','','','','A' +'BG3213','SENSOR OPTISCH RSM 26','OPT. AP110','=A01+UH000-KF14i','','','','' +'MB3225','WEICHE ABZWEIG RSM 25','SW RSM 25','=A01+UH000-KF19Q','','','','' +'QA3227','ANTRIEB AUSFAHREN RSM 25','RA-BI','=A01+UH000-KF19Q','','','','' +'MA3226','ANTRIEB EINFAHREN RSM 25','RA-BI','=A01+UH000-KF19Q','','','','A' +'BG3211','SENSOR OPTISCH RSM 25','OPT. AP110','=A01+UH000-KF14i','','','','' +'QA3223','ANTRIEB AUSFAHREN RSM 24','RA-BI','=A01+UH000-KF19Q','','','','' +'MA3222','ANTRIEB EINFAHREN RSM 24','RA-BI','=A01+UH000-KF19Q','','','','A' +'BG3207','SENSOR OPTISCH RSM 24','OPT. AP110','=A01+UH000-KF13i','','','','' +'MB3221','WEICHE ABZWEIG RSM 24','SW RSM 24','=A01+UH000-KF19Q','','','','' +'QA3213','ANTRIEB AUSFAHREN RSM 23','RA-BI','=A01+UH000-KF18Q','','','','' +'MA3212','ANTRIEB EINFAHREN RSM 23','RA-BI','=A01+UH000-KF18Q','','','','A' +'BG3205','SENSOR OPTISCH RSM 23','OPT. AP110','=A01+UH000-KF13i','','','','' +'QA3207','ANTRIEB AUSFAHREN RSM 22','RA-BI','=A01+UH000-KF17Q','','','','' +'MA3206','ANTRIEB EINFAHREN RSM 22','RA-BI','=A01+UH000-KF17Q','','','','A' +'BG3203','SENSOR OPTISCH RSM 22','OPT. AP110','=A01+UH000-KF13i','','','','' +'QA3203','ANTRIEB AUSFAHREN RSM 21','RA-BI','=A01+UH000-KF17Q','','','','' +'MA3202','ANTRIEB EINFAHREN RSM 21','RA-BI','=A01+UH000-KF17Q','','','','A' +'BG3201','SENSOR OPTISCH RSM 21','OPT. AP110','=A01+UH000-KF13i','','','','' +'MB3211','WEICHE ABZWEIG RSM 23','SW RSM 23','=A01+UH000-KF18Q','','','','' +'MB3205','WEICHE ABZWEIG RSM 22','SW RSM 22','=A01+UH000-KF17Q','','','','' +'MB3201','WEICHE ABZWEIG RSM 21','SW RSM 21','=A01+UH000-KF17Q','','','','' +'SF3222','ZUG WECHSELN RSM 28','LDT-GN-NO','=A01+UH000-KF15i','-UZ3222','-UZ3222','','' +'PF3244','ZUG WECHSELN RSM 28','LDT-GN-LED ','=A01+UH000-KF21Q','','','','' +'SF3220','ZUG WECHSELN RSM 27','LDT-GN-NO','=A01+UH000-KF15i','-UZ3220','-UZ3220','','' +'PF3240','ZUG WECHSELN RSM 27','LDT-GN-LED ','=A01+UH000-KF21Q','','','','' +'SF3212','ZUG WECHSELN RSM 26','LDT-GN-NO','=A01+UH000-KF14i','-UZ3300','-UZ3300','','' +'PF3230','ZUG WECHSELN RSM 26','LDT-GN-LED ','=A01+UH000-KF20Q','','','','' +'SF3210','ZUG WECHSELN RSM 25','LDT-GN-NO','=A01+UH000-KF14i','-UZ3210','-UZ3210','','' +'PF3224','ZUG WECHSELN RSM 25','LDT-GN-LED ','=A01+UH000-KF19Q','','','','' +'SF3206','ZUG WECHSELN RSM 24','LDT-GN-NO','=A01+UH000-KF13i','-UZ3206','-UZ3206','','' +'PF3220','ZUG WECHSELN RSM 24','LDT-GN-LED ','=A01+UH000-KF19Q','','','','' +'SF3204','ZUG WECHSELN RSM 23','LDT-GN-NO','=A01+UH000-KF13i','-UZ3204','-UZ3204','','' +'PF3210','ZUG WECHSELN RSM 23','LDT-GN-LED ','=A01+UH000-KF18Q','','','','' +'SF3202','ZUG WECHSELN RSM 22','LDT-GN-NO','=A01+UH000-KF13i','-UZ3202','-UZ3202','','' +'PF3204','ZUG WECHSELN RSM 22','LDT-GN-LED ','=A01+UH000-KF17Q','','','','' +'SF3200','ZUG WECHSELN RSM 21','LDT-GN-NO','=A01+UH000-KF13i','-UZ3200','-UZ3200','','' +'PF3200','ZUG WECHSELN RSM 21','LDT-GN-LED ','=A01+UH000-KF17Q','','','','' +'MB3155','WEICHE ABZWEIG RSM 20','SW RSM 20','=A01+UH000-KF16Q','','','','' +'QA3157','ANTRIEB AUSFAHREN RSM 20','RA-BI','=A01+UH000-KF16Q','','','','' +'MA3156','ANTRIEB EINFAHREN RSM 20','RA-BI','=A01+UH000-KF16Q','','','','A' +'BG3127','SENSOR OPTISCH RSM 20','OPT. AP110','=A01+UH000-KF11i','','','','' +'QA3153','ANTRIEB AUSFAHREN RSM 19','RA-BI','=A01+UH000-KF16Q','','','','' +'MA3152','ANTRIEB EINFAHREN RSM 19','RA-BI','=A01+UH000-KF16Q','','','','A' +'BG3125','SENSOR OPTISCH RSM 19','OPT. AP110','=A01+UH000-KF11i','','','','' +'QA3147','ANTRIEB AUSFAHREN RSM 18','RA-BI','=A01+UH000-KF15Q','','','','' +'MA3146','ANTRIEB EINFAHREN RSM 18','RA-BI','=A01+UH000-KF15Q','','','','A' +'BG3123','SENSOR OPTISCH RSM 18','OPT. AP110','=A01+UH000-KF11i','','','','' +'QA3143','ANTRIEB AUSFAHREN RSM 17','RA-BI','=A01+UH000-KF15Q','','','','' +'MA3142','ANTRIEB EINFAHREN RSM 17','RA-BI','=A01+UH000-KF15Q','','','','A' +'BG3121','SENSOR OPTISCH RSM 17','OPT. AP110','=A01+UH000-KF11i','','','','' +'QA3133','ANTRIEB AUSFAHREN RSM 16','RA-BI','=A01+UH000-KF14Q','','','','' +'MA3132','ANTRIEB EINFAHREN RSM 16','RA-BI','=A01+UH000-KF14Q','','','','A' +'BG3113','SENSOR OPTISCH RSM 16','OPT. AP110','=A01+UH000-KF10i','','','','' +'QA3127','ANTRIEB AUSFAHREN RSM 15','RA-BI','=A01+UH000-KF13Q','','','','' +'MA3126','ANTRIEB EINFAHREN RSM 15','RA-BI','=A01+UH000-KF13Q','','','','A' +'BG3111','SENSOR OPTISCH RSM 15','OPT. AP110','=A01+UH000-KF10i','','','','' +'QA3123','ANTRIEB AUSFAHREN RSM 14','RA-BI','=A01+UH000-KF13Q','','','','' +'MA3122','ANTRIEB EINFAHREN RSM 14','RA-BI','=A01+UH000-KF13Q','','','','A' +'BG3107','SENSOR OPTISCH RSM 14','OPT. AP110','=A01+UH000-KF09i','','','','' +'MB3151','WEICHE ABZWEIG RSM 19','SW RSM 19','=A01+UH000-KF16Q','','','','' +'MB3145','WEICHE ABZWEIG RSM 18','SW RSM 18','=A01+UH000-KF15Q','','','','' +'MB3141','WEICHE ABZWEIG RSM 17','SW RSM 17','=A01+UH000-KF15Q','','','','' +'MB3131','WEICHE ABZWEIG RSM 16','SW RSM 16','=A01+UH000-KF14Q','','','','' +'MB3125','WEICHE ABZWEIG RSM 15','SW RSM 15','=A01+UH000-KF13Q','','','','' +'MB3121','WEICHE ABZWEIG RSM 14','SW RSM 14','=A01+UH000-KF13Q','','','','' +'SF3126','ZUG WECHSELN RSM 20','LDT-GN-NO','=A01+UH000-KF11i','-UZ3122','-UZ3122','','' +'PF3154','ZUG WECHSELN RSM 20','LDT-GN-LED ','=A01+UH000-KF16Q','','','','' +'SF3124','ZUG WECHSELN RSM 19','LDT-GN-NO','=A01+UH000-KF11i','-UZ3120','-UZ3120','','' +'PF3150','ZUG WECHSELN RSM 19','LDT-GN-LED ','=A01+UH000-KF16Q','','','','' +'SF3122','ZUG WECHSELN RSM 18','LDT-GN-NO','=A01+UH000-KF11i','-UZ3116','-UZ3116','','' +'PF3144','ZUG WECHSELN RSM 18','LDT-GN-LED ','=A01+UH000-KF15Q','','','','' +'SF3120','ZUG WECHSELN RSM 17','LDT-GN-NO','=A01+UH000-KF11i','-UZ3120','-UZ3102','','' +'PF3140','ZUG WECHSELN RSM 17','LDT-GN-LED ','=A01+UH000-KF15Q','','','','' +'SF3112','ZUG WECHSELN RSM 16','LDT-GN-NO','=A01+UH000-KF10i','-UZ3112','-UZ3112','','' +'PF3130','ZUG WECHSELN RSM 16','LDT-GN-LED ','=A01+UH000-KF14Q','','','','' +'SF3110','ZUG WECHSELN RSM 15','LDT-GN-NO','=A01+UH000-KF10i','-UZ3110','-UZ3110','','' +'PF3124','ZUG WECHSELN RSM 15','LDT-GN-LED ','=A01+UH000-KF13Q','','','','' +'SF3106','ZUG WECHSELN RSM 14','LDT-GN-NO','=A01+UH000-KF09i','-UZ3106','-UZ3106','','' +'PF3120','ZUG WECHSELN RSM 14','LDT-GN-LED ','=A01+UH000-KF13Q','','','','' +'QA3113','ANTRIEB AUSFAHREN RSM 13','RA-BI','=A01+UH000-KF12Q','','','','' +'MA3112','ANTRIEB EINFAHREN RSM 13','RA-BI','=A01+UH000-KF12Q','','','','A' +'BG3105','SENSOR OPTISCH RSM 13','OPT. AP110','=A01+UH000-KF09i','','','','' +'MB3111','WEICHE ABZWEIG RSM 13','SW RSM 13','=A01+UH000-KF12Q','','','','' +'SF3104','ZUG WECHSELN RSM 13','LDT-GN-NO','=A01+UH000-KF09i','-UZ3104','-UZ3104','','' +'PF3110','ZUG WECHSELN RSM 13','LDT-GN-LED ','=A01+UH000-KF12Q','','','','' +'QA3107','ANTRIEB AUSFAHREN RSM 12','RA-BI','=A01+UH000-KF11Q','','','','' +'MA3106','ANTRIEB EINFAHREN RSM 12','RA-BI','=A01+UH000-KF11Q','','','','A' +'BG3103','SENSOR OPTISCH RSM 12','OPT. AP110','=A01+UH000-KF09i','','','','' +'MB3105','WEICHE ABZWEIG RSM 12','SW RSM 12','=A01+UH000-KF11Q','','','','' +'SF3102','ZUG WECHSELN RSM 12','LDT-GN-NO','=A01+UH000-KF09i','-UZ3102','-UZ3102','','' +'PF3104','ZUG WECHSELN RSM 12','LDT-GN-LED ','=A01+UH000-KF11Q','','','','' +'SF3100','ZUG WECHSELN RSM 11','LDT-GN-NO','=A01+UH000-KF09i','-UZ3100','-UZ3100','','' +'PF3100','ZUG WECHSELN RSM 11','LDT-GN-LED ','=A01+UH000-KF11Q','','','','' +'QA3103','ANTRIEB AUSFAHREN RSM 11','RA-BI','=A01+UH000-KF11Q','','','','' +'MA3102','ANTRIEB EINFAHREN RSM 11','RA-BI','=A01+UH000-KF11Q','','','','A' +'BG3101','SENSOR OPTISCH RSM 11','OPT. AP110','=A01+UH000-KF09i','','','','' +'MB3101','WEICHE ABZWEIG RSM 11','SW RSM 11','=A01+UH000-KF11Q','','','','' +'BG3130','SENSOR HAUPTSTR. FB310 ','LT-FB310','=A01+UH000-KF12i','','','','' +'BG3230','SENSOR HAUPTSTR. FB320 ','LT-FB320','=A01+UH000-KF16i','','','','' +'BG3131','SENSOR HAUPTSTR. FB311','LT-FB311','=A01+UH000-KF12i','','','','' +'BG1541','SENSOR AUSFAHRT PUFFER F0902 FLYER 9','LT-EXIT F0902','=A01+UC103-KF02i','','','','' +'BG1540','SENSOR AUSFAHRT PUFFER F0901 FLYER 9','LT-EXIT F0901','=A01+UC103-KF02i','','','','' +'MB1574','ANPRESSEN NACHPUFFER F0901 FLYER 9','PRESS F0901','=A01+UC103-KF07Q','','','','' +'MB1575','ANPRESSEN NACHPUFFER F0902 FLYER 9','PRESS F0902','=A01+UC103-KF07Q','','','','' +'QA1571','ANTRIEB NACHPUFFER F0707 FLYER 9','M-BI-LE','=A01+UC103-KF07Q','','','','' +'MA1570','ANTRIEB NACHPUFFER F0901 FLYER 9','M-BI-RI','=A01+UC103-KF07Q','','','','' +'MB1544','ANPRESSEN PUFFER F0901 FLYER 9','PRESS F0901','=A01+UC103-KF04Q','','','','' +'MB1545','ANPRESSEN PUFFER F0902 FLYER 9','PRESS F0902','=A01+UC103-KF04Q','','','','' +'QA1561','ANTRIEB PUFFER F0901 FLYER 9','M-BI-RI','=A01+UC103-KF06Q','','','','' +'MA1560','ANTRIEB PUFFER F0901 FLYER 9','M-BI-LE','=A01+UC103-KF06Q','','','','' +'BG1546','SENSOR AUSFAHRT NACHPUFFER F0902 RF 9','LT-EXIT F0902','=A01+UC103-KF02i','','','','' +'BG1545','SENSOR AUSFAHRT NACHPUFFER F0901 RF 9','LT-EXIT F0901','=A01+UC103-KF02i','','','','' +'MB1541','WEICHE ABZWEIG EINFAHRT PUFFER F0902 FLYER 9','SW ENTER F0901','=A01+UC103-KF04Q','','','','' +'MB1540','WEICHE ABZWEIG EINFAHRT RF 9','SW ENTER RF 9','=A01+UC103-KF04Q','','','','' +'MB1567','WEICHE ABZWEIG EINFAHRT NACHP. RF 9','SW-STRAIGHT','=A01+UC103-KF06Q','','','','' +'MB1566','WEICHE ABZWEIG EINFAHRT NACHP. RF 9','SW-BRANCH','=A01+UC103-KF06Q','','','','' +'KF1555','IF RF 09: START SPULENWECHSEL 2','IF-RELAIS','=A01+UC103-KF05Q','IF RF 09: START SPULENWECHSEL 2','IF RF 09: START EXCHANGE 2','','' +'DI1554','IF RF 09 : NEUE SPULE','IF-RELAIS','=A01+UC103-KF03i','IF RF 09: NEUE SPULE ','IF RF 09: NEW BOBBIN','','' +'KF1554','IF RF 09: START SPULENWECHSEL 1','IF-RELAIS','=A01+UC103-KF05Q','IF RF 09: START SPULENWECHSEL 1','IF RF 09: START EXCHANGE 1','','' +'PF1547','RUNDUMLEUCHTE STÖRUNG FLYER 9','LED-YE_FAULT','=A01+UC103-KF04Q','','','','' +'SF1553','RESET FLYER 9','IPB-YE-NO','=A01+UC103-KF03i','RESET','RESET','RESET','' +'PF1553','RESET FLYER 9','IPB-YE-LED','=A01+UC103-KF05Q','','','','' +'SF1552','NOT HALT FLYER 9','EPB-NC','=A01+UC103-KF03i','NOT-HALT','E-STOP','E-STOP','' +'BG1556','SENSOR SPULE IN POSITION FLYER 9','BOBBIN IN POS','=A01+UC103-KF03i','','','','' +'BG1544','SENSOR ZUG IN DOFFER FLYER 9','LT-TRAIN IN DOF','=A01+UC103-KF02i','','','','' +'BG1543','SENSOR ZUG IN DOFFER PM 9','LT-TRAIN IN DOF','=A01+UC103-KF02i','','','','' +'MB1551','ABHEBEN ANTRIEBE PM 9','LIFT OFF BS 9','=A01+UC103-KF05Q','','','','' +'MA1556','ANTRIEBE FLYER 9','M-BI','=A01+UC103-KF05Q','','','','' +'MB1502','WEICHE ABZWEIG EINFAHRT PUFFER F0802 FLYER 8','SW ENTER F0802','=A01+UC103-KF00Q','','','','' +'MB1500','WEICHE ABZWEIG EINFAHRT FLYER 8','SW ENTER RF 8','=A01+UC103-KF00Q','','','','' +'MB1501','WEICHE ABZWEIG EINFAHRT RF 8','SW ENTER RF 8','=A01+UC103-KF00Q','','','','' +'MB1534','ANPRESSEN NACHPUFFER F0801 FLYER 8','PRESS F0801','=A01+UC103-KF03Q','','','','' +'MB1535','ANPRESSEN NACHPUFFER F0802 FLYER 8','PRESS F0802','=A01+UC103-KF03Q','','','','' +'QA1531','ANTRIEB NACHPUFFER F0802 RF 8','M-BI','=A01+UC103-KF03Q','','','','' +'MA1530','ANTRIEB NACHPUFFER F0801 RF 8','M-BI','=A01+UC103-KF03Q','','','','' +'MB1504','ANPRESSEN PUFFER F0801 FLYER 8','PRESS F0801','=A01+UC103-KF00Q','','','','' +'MB1505','ANPRESSEN PUFFER F0802 FLYER 8','PRESS F0802','=A01+UC103-KF00Q','','','','' +'QA1521','ANTRIEB PUFFER F0802 FLYER 8','M-BI-RI','=A01+UC103-KF02Q','','','','' +'MA1520','ANTRIEB PUFFER F0801 FLYER 8','M-BI-LE','=A01+UC103-KF02Q','','','','' +'BG1505','SENSOR AUSFAHRT NACHPUFFER F0801 FLYER 8','LT-EXIT F0801','=A01+UC103-KF00i','','','','' +'BG1506','SENSOR AUSFAHRT NACHPUFFER F0802 FLYER 8','LT-EXIT F0802','=A01+UC103-KF00i','','','','' +'BG1501','SENSOR AUSFAHRT PUFFER F0802 FLYER 8','LT-EXIT F0802','=A01+UC103-KF00i','','','','' +'BG1500','SENSOR AUSFAHRT PUFFER F0801 FLYER 8','LT-EXIT F0801','=A01+UC103-KF00i','','','','' +'SF1511','HAUPTSCHALTER EIN +UC103','I-MS ON','=A01+UC103-KF01i','HAUPTSCHALTER EIN','MAIN SWITCH ON','','' +'SF1510','MOTORSCHUTZSCHALTER HAT AUSGELÖST','I-CB OK','=A01+UC103-KF01i','MSS IN ORDNUNG','MPS OK','','' +'PF1510','LM-ÜBERSTROM +UC103','IL-YE-LED','=A01+UC103-KF01Q','LM ÜBERSTROM','IL OVERCURRENT','','' +'MB1527','WEICHE ABZWEIG EINFAHRT NACHP. RF 8','SW-BRANCH','=A01+UC103-KF02Q','','','','' +'MB1526','WEICHE ABZWEIG EINFAHRT NACHP. RF 8','SW-STRAIGHT','=A01+UC103-KF02Q','','','','' +'BG1503','SENSOR ZUG IN DOFFER PM 8','LT-TRAIN IN DOF','=A01+UC103-KF00i','','','','' +'BG1516','SENSOR SPULE IN POSITION FLYER 8','BOBBIN IN POS','=A01+UC103-KF01i','','','','' +'BG1504','SENSOR ZUG IN DOFFER FLYER 8','LT-TRAIN IN DOF','=A01+UC103-KF00i','','','','' +'MB1511','ABHEBEN ANTRIEBE PM 8','LIFT OFF BS 8','=A01+UC103-KF01Q','','','','' +'MA1516','ANTRIEBE FLYER 8','M-BI','=A01+UC103-KF01Q','','','','' +'KF1515','IF RF 08: START SPULENWECHSEL 2','IF-RELAIS','=A01+UC103-KF01Q','IF RF 08: START SPULENWECHSEL 2','IF RF 08: START EXCHANGE 2','','' +'DI1514','IF RF 08 : NEUE SPULE','IF-RELAIS','=A01+UC103-KF01i','IF RF 08: NEUE SPULE ','IF RF 08: NEW BOBBIN','','' +'KF1514','IF RF 08: START SPULENWECHSEL 1','IF-RELAIS','=A01+UC103-KF01Q','IF RF 08: START SPULENWECHSEL 1','IF RF 08: START EXCHANGE 1','','' +'PF1507','RUNDUMLEUCHTE STÖRUNG FLYER 8','LED-YE_FAULT','=A01+UC103-KF00Q','','','','' +'SF1513','RESET FLYER 8','IPB-YE-NO','=A01+UC103-KF01i','RESET','RESET','RESET','' +'PF1513','RESET FLYER 8','IPB-YE-LED','=A01+UC103-KF01Q','','','','' +'SF1512','NOT HALT FLYER 8','EPB-NC','=A01+UC103-KF01i','NOT-HALT','E-STOP','E-STOP','' +'BG1446','SENSOR AUSFAHRT NACHPUFFER F0702 RF 7','LT-EXIT F0702','=A01+UH000-KF06i','','','','' +'BG1445','SENSOR AUSFAHRT NACHPUFFER F0701 RF 7','LT-EXIT F0701','=A01+UH000-KF06i','','','','' +'MB1441','WEICHE ABZWEIG EINFAHRT F0701 RF 7','SW ENTER F0701 ','=A01+UH000-KF06Q','','','','' +'MB1443','WEICHE ABZWEIG AUSFAHRT NACHP. FLYER 7','SW EXIT RF7','=A01+UH000-KF06Q','','','','' +'MB1440','WEICHE ABZWEIG EINFAHRT RF 7','SW ENTER RF 7','=A01+UH000-KF06Q','','','','' +'MB1442','WEICHE ABZWEIG EINFAHRT F0702 RF 7','SW ENTER F0702','=A01+UH000-KF06Q','','','','' +'MB1474','ANPRESSEN NACHPUFFER F0701 FLYER 7','PRESS F0701','=A01+UH000-KF09Q','','','','' +'MB1475','ANPRESSEN NACHPUFFER F0702 FLYER 7','PRESS F0702','=A01+UH000-KF09Q','','','','' +'QA1471','ANTRIEB NACHPUFFER F0707 FLYER 7','M-BI-LE','=A01+UH000-KF09Q','','','','' +'MA1470','ANTRIEB NACHPUFFER F0701 FLYER 7','M-BI-RI','=A01+UH000-KF09Q','','','','' +'MB1444','ANPRESSEN PUFFER F0701 FLYER 7','PRESS F0701','=A01+UH000-KF06Q','','','','' +'MB1445','ANPRESSEN PUFFER F0702 FLYER 7','PRESS F0702','=A01+UH000-KF06Q','','','','' +'QA1461','ANTRIEB PUFFER F0701 FLYER 7','M-BI-RI','=A01+UH000-KF08Q','','','','' +'MA1460','ANTRIEB PUFFER F0701 FLYER 7','M-BI-LE','=A01+UH000-KF08Q','','','','' +'BG1441','SENSOR AUSFAHRT PUFFER F0702 FLYER 7','LT-EXIT F0702','=A01+UH000-KF06i','','','','' +'BG1440','SENSOR AUSFAHRT PUFFER F0701 FLYER 7','LT-EXIT F0701','=A01+UH000-KF06i','','','','' +'BG1456','SENSOR SPULE IN POSITION FLYER 7','BOBBIN IN POS','=A01+UH000-KF07i','','','','' +'BG1444','SENSOR ZUG IN DOFFER FLYER 7','LT-TRAIN IN DOF','=A01+UH000-KF06i','','','','' +'BG1443','SENSOR ZUG IN DOFFER PM 7','LT-TRAIN IN DOF','=A01+UH000-KF06i','','','','' +'MB1451','ABHEBEN ANTRIEBE PM 7','LIFT OFF BS 7','=A01+UH000-KF07Q','','','','' +'MA1456','ANTRIEBE FLYER 7','M-BI','=A01+UH000-KF07Q','','','','' +'MB1467','WEICHE ABZWEIG EINFAHRT NACHP. RF7','SW-STRAIGHT','=A01+UH000-KF08Q','','','','' +'MB1466','WEICHE ABZWEIG EINFAHRT NACHP. RF7','SW-BRANCH','=A01+UH000-KF08Q','','','','' +'KF1455','IF RF 07: START SPULENWECHSEL 2','IF-RELAIS','=A01+UH000-KF07Q','IF RF 07: START SPULENWECHSEL 2','IF RF 07: START EXCHANGE 2','','' +'DI1454','IF RF 07 : NEUE SPULE','IF-RELAIS','=A01+UH000-KF07i','IF RF 07: NEUE SPULE ','IF RF 07: NEW BOBBIN','','' +'KF1454','IF RF 07: START SPULENWECHSEL 1','IF-RELAIS','=A01+UH000-KF07Q','IF RF 07: START SPULENWECHSEL 1','IF RF 07: START EXCHANGE 1','','' +'PF1447','RUNDUMLEUCHTE STÖRUNG FLYER 7','LED-YE_FAULT','=A01+UH000-KF06Q','','','','' +'SF1453','RESET FLYER 7','IPB-YE-NO','=A01+UH000-KF07i','RESET','RESET','RESET','' +'PF1453','RESET FLYER 7','IPB-YE-LED','=A01+UH000-KF07Q','','','','' +'SF1452','NOT HALT FLYER 7','EPB-NC','=A01+UH000-KF07i','NOT-HALT','E-STOP','E-STOP','' +'SF3026','ZUG WECHSELN RSM 10','LDT-GN-NO','=A01+UC200-KF02i','-UZ3026','-UZ3026','','' +'PF3054','ZUG WECHSELN RSM 10','LDT-GN-LED ','=A01+UC200-KF05Q','','','','' +'SF3024','ZUG WECHSELN RSM 9','LDT-GN-NO','=A01+UC200-KF02i','-UZ3024','-UZ3024','','' +'PF3050','ZUG WECHSELN RSM 9','LDT-GN-LED ','=A01+UC200-KF05Q','','','','' +'QA3057','ANTRIEB AUSFAHREN RSM 10','RA-BI','=A01+UC200-KF05Q','','','','' +'MA3056','ANTRIEB EINFAHREN RSM 10','RA-BI','=A01+UC200-KF05Q','','','','A' +'BG3027','SENSOR OPTISCH RSM 10','OPT. AP110','=A01+UC200-KF02i','','','','' +'MB3055','WEICHE ABZWEIG RSM 10','SW RSM 10','=A01+UC200-KF05Q','','','','' +'QA3053','ANTRIEB AUSFAHREN RSM 9','RA-BI','=A01+UC200-KF05Q','','','','' +'MA3052','ANTRIEB EINFAHREN RSM 9','RA-BI','=A01+UC200-KF05Q','','','','A' +'BG3025','SENSOR OPTISCH RSM 9','OPT. AP110','=A01+UC200-KF02i','','','','' +'MB3051','WEICHE ABZWEIG RSM 9','SW RSM 09','=A01+UC200-KF05Q','','','','' +'SF3014','HAUPTSCHALTER EIN +UC200','I-MS ON','=A01+UC200-KF01i','HAUPTSCHALTER EIN','MAIN SWITCH ON','','' +'SF3017','MOTORSCHUTZSCHALTER HAT AUSGELÖST','I-CB OK','=A01+UC200-KF01i','MSS IN ORDNUNG','MPS OK','','' +'PF3017','LM-ÜBERSTROM +UC200 RSM 1-10','IL-YE-LED','=A01+UC200-KF01Q','LM ÜBERSTROM','IL OVERCURRENT','','' +'SF3020','ZUG WECHSELN RSM 7','LDT-GN-NO','=A01+UC200-KF02i','-UZ3020','-UZ3020','','' +'PF3040','ZUG WECHSELN RSM 7','LDT-GN-LED ','=A01+UC200-KF04Q','','','','' +'QA3043','ANTRIEB AUSFAHREN RSM 7','RA-BI','=A01+UC200-KF04Q','','','','' +'MA3042','ANTRIEB EINFAHREN RSM 7','RA-BI','=A01+UC200-KF04Q','','','','A' +'BG3021','SENSOR OPTISCH RSM 7','OPT. AP110','=A01+UC200-KF02i','','','','' +'MB3041','WEICHE ABZWEIG RSM 7','SW RSM 07','=A01+UC200-KF04Q','','','','' +'SF3022','ZUG WECHSELN RSM 8','LDT-GN-NO','=A01+UC200-KF02i','-UZ3022','-UZ3022','','' +'PF3044','ZUG WECHSELN RSM 8','LDT-GN-LED ','=A01+UC200-KF04Q','','','','' +'QA3047','ANTRIEB AUSFAHREN RSM 8','RA-BI','=A01+UC200-KF04Q','','','','' +'MA3046','ANTRIEB EINFAHREN RSM 8','RA-BI','=A01+UC200-KF04Q','','','','A' +'BG3023','SENSOR OPTISCH RSM 8','OPT. AP110','=A01+UC200-KF02i','','','','' +'MB3045','WEICHE ABZWEIG RSM 8','SW RSM 08','=A01+UC200-KF04Q','','','','' +'PF3014','RUNDUMLEUCHTE STÖRUNG RSM 01-10','LED-YE_FAULT','=A01+UC200-KF01Q','','','','' +'SF3016','RESET/START NACH NOT HALT RSM 1-10','IPB-YE-NO','=A01+UC200-KF01i','RESET','RESET','RESET','' +'PF3016','RESET/START NACH NOT HALT RSM 1-10','IPB-YE-LED ','=A01+UC200-KF01Q','','','','' +'SF3015','NOT HALT RSM 1-10','EPB-NC','=A01+UC200-KF01i','NOT-HALT','E-STOP','E-STOP','' +'SF3012','ZUG WECHSELN RSM 6','LDT-GN-NO','=A01+UC200-KF01i','-UZ3012','-UZ3012','','' +'PF3030','ZUG WECHSELN RSM 6','LDT-GN-LED ','=A01+UC200-KF03Q','','','','' +'QA3033','ANTRIEB AUSFAHREN RSM 6','RA-BI','=A01+UC200-KF03Q','','','','' +'MA3032','ANTRIEB EINFAHREN RSM 6','RA-BI','=A01+UC200-KF03Q','','','','A' +'BG3013','SENSOR OPTISCH RSM 6','OPT. AP110','=A01+UC200-KF01i','','','','' +'MB3031','WEICHE ABZWEIG RSM 6','SW RSM 06','=A01+UC200-KF03Q','','','','' +'SF3010','ZUG WECHSELN RSM 5','LDT-GN-NO','=A01+UC200-KF01i','-UZ3010','-UZ3010','','' +'PF3024','ZUG WECHSELN RSM 5','LDT-GN-LED ','=A01+UC200-KF02Q','','','','' +'QA3027','ANTRIEB AUSFAHREN RSM 5','RA-BI','=A01+UC200-KF02Q','','','','' +'MA3026','ANTRIEB EINFAHREN RSM 5','RA-BI','=A01+UC200-KF02Q','','','','A' +'BG3011','SENSOR OPTISCH RSM 5','OPT. AP110','=A01+UC200-KF01i','','','','' +'MB3025','WEICHE ABZWEIG RSM 5','SW RSM 05','=A01+UC200-KF02Q','','','','' +'SF3006','ZUG WECHSELN RSM 4','LDT-GN-NO','=A01+UC200-KF00i','-UZ3006','-UZ3006','','' +'PF3020','ZUG WECHSELN RSM 4','LDT-GN-LED ','=A01+UC200-KF02Q','','','','' +'SF3004','ZUG WECHSELN RSM 3','LDT-GN-NO','=A01+UC200-KF00i','-UZ3004','-UZ3004','','' +'PF3010','ZUG WECHSELN RSM 3','LDT-GN-LED ','=A01+UC200-KF01Q','','','','' +'QA3023','ANTRIEB AUSFAHREN RSM 4','RA-BI','=A01+UC200-KF02Q','','','','' +'MA3022','ANTRIEB EINFAHREN RSM 4','RA-BI','=A01+UC200-KF02Q','','','','A' +'BG3007','SENSOR OPTISCH RSM 4','OPT. AP110','=A01+UC200-KF00i','','','','' +'MB3021','WEICHE ABZWEIG RSM 4','SW RSM 04','=A01+UC200-KF02Q','','','','' +'QA3013','ANTRIEB AUSFAHREN RSM 3','RA-BI','=A01+UC200-KF01Q','','','','' +'MA3012','ANTRIEB EINFAHREN RSM 3','RA-BI','=A01+UC200-KF01Q','','','','A' +'BG3005','SENSOR OPTISCH RSM 3','OPT. AP110','=A01+UC200-KF00i','','','','' +'MB3011','WEICHE ABZWEIG RSM 3','SW RSM 03','=A01+UC200-KF01Q','','','','' +'SF3002','ZUG WECHSELN RSM 2','LDT-GN-NO','=A01+UC200-KF00i','-UZ3002','-UZ3002','','' +'PF3004','ZUG WECHSELN RSM 2','LDT-GN-LED ','=A01+UC200-KF00Q','','','','' +'QA3007','ANTRIEB AUSFAHREN RSM 2','RA-BI','=A01+UC200-KF00Q','','','','' +'MA3006','ANTRIEB EINFAHREN RSM 2','RA-BI','=A01+UC200-KF00Q','','','','A' +'BG3003','SENSOR OPTISCH RSM 2','OPT. AP110','=A01+UC200-KF00i','','','','' +'MB3005','WEICHE ABZWEIG RSM 2','SW RSM 02','=A01+UC200-KF00Q','','','','' +'SF3000','ZUG WECHSELN RSM 1','LDT-GN-NO','=A01+UC200-KF00i','-UZ3000','-UZ3000','','' +'PF3000','ZUG WECHSELN RSM 1 ','LDT-GN-LED ','=A01+UC200-KF00Q','','','','' +'QA3003','ANTRIEB AUSFAHREN RSM 1','RA-BI','=A01+UC200-KF00Q','','','','' +'MA3002','ANTRIEB EINFAHREN RSM 1','RA-BI','=A01+UC200-KF00Q','','','','A' +'BG3001','SENSOR OPTISCH RSM 1 ','OPT. AP110','=A01+UC200-KF00i','','','','' +'MA1464','ANTRIEB HAUPTSTR. AUSFAHRT RF - RSM FB212','M-BI FB212','=A01+UH000-KF08Q','','','','' +'MA1462','ANTRIEB HAUPTSTR. EINFAHRT FB211','M-BI FB211','=A01+UH000-KF08Q','','','','' +'MB1423','WEICHE ABZWEIG FB213','SW FB213','=A01+UH000-KF04Q','','','','' +'QA1425','ANTRIEB HAUPTSTECKE RF 6','M-BI-RF6 FB63','=A01+UH000-KF04Q','','','','' +'MA1424','ANTRIEB HAUPTSTECKE RF 6','M-BI-RF6 FB63','=A01+UH000-KF04Q','','','','' +'BG1405','SENSOR AUSFAHRT NACHPUFFER F0601 FLYER 6','LT-EXIT F0601','=A01+UH000-KF03i','','','','' +'BG1406','SENSOR AUSFAHRT NACHPUFFER F0602 FLYER 6','LT-EXIT F0602','=A01+UH000-KF03i','','','','' +'MB1401','WEICHE ABZWEIG EINFAHRT PUFFER F0601 FLYER 6','SW F0601','=A01+UH000-KF02Q','','','','' +'BG1422','SENSOR HAUPTSTR. FB212','LT-FB212','=A01+UH000-KF05i','','','','' +'MB1400','WEICHE ABZWEIG EINFAHRT FLYER 6','SW ENTER RF6','=A01+UH000-KF02Q','','','','' +'MB1403','WEICHE ABZWEIG NACHPUFFER F0601-F0602 ','SW EXIT','=A01+UH000-KF02Q','','','','' +'MB1434','ANPRESSEN NACHPUFFER F0601 FLYER 6','PRESS F0601','=A01+UH000-KF05Q','','','','' +'MB1435','ANPRESSEN NACHPUFFER F0602 FLYER 6','PRESS F0602','=A01+UH000-KF05Q','','','','' +'QA1431','ANTRIEB NACHPUFFER F0602 RF6','M-BI','=A01+UH000-KF05Q','','','','' +'MA1430','ANTRIEB NACHPUFFER F0601 RF6','M-BI','=A01+UH000-KF05Q','','','','' +'MB1404','ANPRESSEN PUFFER F0601 FLYER 6','PRESS F0601','=A01+UH000-KF02Q','','','','' +'MB1405','ANPRESSEN PUFFER F0602 FLYER 6','PRESS F0602','=A01+UH000-KF02Q','','','','' +'QA1421','ANTRIEB PUFFER F0602 FLYER 6','M-BI-RI','=A01+UH000-KF04Q','','','','' +'MA1420','ANTRIEB PUFFER F0601 FLYER 6','M-BI-LE','=A01+UH000-KF04Q','','','','' +'MB1427','WEICHE ABZWEIG EINFAHRT NACHP. RF 6','SW-BRANCH','=A01+UH000-KF04Q','','','','' +'MB1426','WEICHE ABZWEIG EINFAHRT NACHP. RF 6','SW-STRAIGHT','=A01+UH000-KF04Q','','','','' +'BG1401','SENSOR AUSFAHRT PUFFER F0602 FLYER 6','LT-EXIT F0602','=A01+UH000-KF03i','','','','' +'BG1400','SENSOR AUSFAHRT PUFFER F0601 FLYER 6','LT-EXIT F0601','=A01+UH000-KF03i','','','','' +'KF1415','IF RF 06: START SPULENWECHSEL 2','IF-RELAIS','=A01+UH000-KF03Q','IF RF 06: START SPULENWECHSEL 2','IF RF 06: START EXCHANGE 2','','' +'DI1414','IF RF 06 : NEUE SPULE','IF-RELAIS','=A01+UH000-KF04i','IF RF 06: NEUE SPULE ','IF RF 06: NEW BOBBIN','','' +'KF1414','IF RF 06: START SPULENWECHSEL 1','IF-RELAIS','=A01+UH000-KF03Q','IF RF 06: START SPULENWECHSEL 1','IF RF 06: START EXCHANGE 1','','' +'PF1407','RUNDUMLEUCHTE STÖRUNG FLYER 6','LED-YE_FAULT','=A01+UH000-KF02Q','','','','' +'SF1413','RESET FLYER 6','IPB-YE-NO','=A01+UH000-KF04i','RESET','RESET','RESET','' +'PF1413','RESET FLYER 6','IPB-YE-LED','=A01+UH000-KF03Q','','','','' +'SF1412','NOT HALT FLYER 6','EPB-NC','=A01+UH000-KF04i','NOT-HALT','E-STOP','E-STOP','' +'BG1403','SENSOR ZUG IN DOFFER PM 6','LT-TRAIN IN DOF','=A01+UH000-KF03i','','','','' +'BG1416','SENSOR SPULE IN POSITION FLYER 6','BOBBIN IN POS','=A01+UH000-KF04i','','','','' +'BG1404','SENSOR ZUG IN DOFFER FLYER 6','LT-TRAIN IN DOF','=A01+UH000-KF03i','','','','' +'MB1411','ABHEBEN ANTRIEBE PM 6','LIFT OFF RF 6','=A01+UH000-KF03Q','','','','' +'MA1416','ANTRIEBE FLYER 6','M-BI','=A01+UH000-KF03Q','','','','' +'KF1295','IF RF 05: START SPULENWECHSEL 2','IF-RELAIS','=A01+UC102-KF05Q','IF RF 05: START SPULENWECHSEL 2','IF RF 05: START EXCHANGE 2','','' +'DI1294','IF RF 05 : NEUE SPULE','IF-RELAIS','=A01+UC102-KF03i','IF RF 05: NEUE SPULE ','IF RF 05: NEW BOBBIN','','' +'KF1294','IF RF 05: START SPULENWECHSEL 1','IF-RELAIS','=A01+UC102-KF05Q','IF RF 05: START SPULENWECHSEL 1','IF RF 05: START EXCHANGE 1','','' +'PF1287','RUNDUMLEUCHTE STÖRUNG FLYER 5','LED-YE_FAULT','=A01+UC102-KF04Q','','','','' +'SF1293','RESET FLYER 5','IPB-YE-NO','=A01+UC102-KF03i','RESET','RESET','RESET','' +'PF1293','RESET FLYER 5','IPB-YE-LED','=A01+UC102-KF05Q','','','','' +'SF1292','NOT HALT FLYER 5','EPB-NC','=A01+UC102-KF03i','NOT-HALT','E-STOP','E-STOP','' +'BG1286','SENSOR AUSFAHRT NACHPUFFER F0501 RF 5','LT-EXIT F0501','=A01+UC102-KF02i','','','','' +'BG1285','SENSOR AUSFAHRT NACHPUFFER F0502 RF 5','LT-EXIT F0502','=A01+UC102-KF02i','','','','' +'BG1302','SENSOR HAUPTSTR. FB214','LT-FB214','=A01+UC102-KF04i','','','','' +'BG1301','SENSOR HAUPTSTR. FB214','LT-FB214','=A01+UC102-KF04i','','','','' +'BG1300','SENSOR HAUPTSTR. FB213','LT-FB213','=A01+UC102-KF04i','','','','' +'MB1316','WEICHE ABZWEIG FB214','SW FB214','=A01+UC102-KF07Q','','','','' +'MA1304','ANTRIEB HAUPTSTR. FB214','M-BI FB214','=A01+UC102-KF06Q','','','','' +'MA1302','ANTRIEB HAUPTSTR. FB213','M-BI FB213','=A01+UC102-KF06Q','','','','' +'MB1314','ANPRESSEN NACHPUFFER F0501 FLYER 5','PRESS F0501','=A01+UC102-KF07Q','','','','' +'MB1315','ANPRESSEN NACHPUFFER F0502 FLYER 5','PRESS F0502','=A01+UC102-KF07Q','','','','' +'QA1311','ANTRIEB NACHPUFFER F0502 FLYER 5','M-BI-RI','=A01+UC102-KF07Q','','','','' +'MA1310','ANTRIEB NACHPUFFER F0501 FLYER 5','M-BI-LE','=A01+UC102-KF07Q','','','','' +'MB1284','ANPRESSEN PUFFER F0501 FLYER 5','PRESS F0501','=A01+UC102-KF04Q','','','','' +'MB1285','ANPRESSEN PUFFER F0502 FLYER 5','PRESS F0502','=A01+UC102-KF04Q','','','','' +'QA1301','ANTRIEB PUFFER F0502 FLYER 5','M-BI-RI','=A01+UC102-KF06Q','','','','' +'MA1300','ANTRIEB PUFFER F0501 FLYER 5','M-BI-LE','=A01+UC102-KF06Q','','','','' +'BG1257','SENSOR HAUPTSTR. FLYER 4','LT-ENTER RF 4','=A01+UC102-KF01i','','','','' +'BG1281','SENSOR AUSFAHRT PUFFER F0502 FLYER 5','LT-EXIT F0502','=A01+UC102-KF02i','','','','' +'BG1280','SENSOR AUSFAHRT PUFFER F0501 FLYER 5','LT-EXIT F0501','=A01+UC102-KF02i','','','','' +'MB1282','WEICHE ABZWEIG EINFAHRT RF 5','SW ENTER RF 5','=A01+UC102-KF04Q','','','','' +'MB1281','WEICHE ABZWEIG EINFAHRT PUFFER F0501 FLYER 5','SW RF5 F501','=A01+UC102-KF04Q','','','','' +'MB1280','WEICHE ABZWEIG EINFAHRT PUFFER RF 5','SW ENTER RF 5','=A01+UC102-KF04Q','','','','' +'MB1307','WEICHE ABZWEIG EINFAHRT NACHP. RF 5','SW-BRANCH','=A01+UC102-KF06Q','','','','' +'MB1306','WEICHE ABZWEIG EINFAHRT NACHP. RF 5','SW-STRAIGHT','=A01+UC102-KF06Q','','','','' +'BG1296','SENSOR SPULE IN POSITION FLYER 5','BOBBIN IN POS','=A01+UC102-KF03i','','','','' +'BG1284','SENSOR ZUG IN DOFFER FLYER 5','LT-TRAIN IN DOF','=A01+UC102-KF02i','','','','' +'BG1283','SENSOR ZUG IN DOFFER PM 5','LT-TRAIN IN DOF','=A01+UC102-KF02i','','','','' +'MB1291','ABHEBEN ANTRIEBE PM 5','LIFT OFF BS 5','=A01+UC102-KF05Q','','','','' +'MA1296','ANTRIEBE FLYER 5','M-BI','=A01+UC102-KF05Q','','','','' +'MB1274','ANPRESSEN NACHPUFFER F0401 FLYER 4','PRESS F0401','=A01+UC102-KF03Q','','','','' +'MB1275','ANPRESSEN NACHPUFFER F0402 FLYER 4','PRESS F0402','=A01+UC102-KF03Q','','','','' +'QA1271','ANTRIEB NACHPUFFER F0402 FLYER 4','M-BI','=A01+UC102-KF03Q','','','','' +'MA1270','ANTRIEB NACHPUFFER F0401 FLYER 4','M-BI','=A01+UC102-KF03Q','','','','' +'MB1244','ANPRESSEN PUFFER F0401 FLYER 4','PRESS F0401','=A01+UC102-KF00Q','','','','' +'MB1245','ANPRESSEN PUFFER F0402 FLYER 4','PRESS F0402','=A01+UC102-KF00Q','','','','' +'QA1261','ANTRIEB PUFFER F0402 FLYER 4','M-BI-RI','=A01+UC102-KF02Q','','','','' +'MA1260','ANTRIEB PUFFER F0401 FLYER 4','M-BI-LE','=A01+UC102-KF02Q','','','','' +'MB1240','WEICHE ABZWEIG EINFAHRT FLYER 4','SW ENTER RF4','=A01+UC102-KF00Q','','','','' +'MB1241','WEICHE ABZWEIG EINFAHRT FLYER 4 F0401','SW ENTER F0401','=A01+UC102-KF00Q','','','','' +'MB1242','WEICHE ABZWEIG EINFAHRT RF 4','SW ENTER RF 4','=A01+UC102-KF00Q','','','','' +'BG1246','SENSOR AUSFAHRT NACHPUFFER F0402 RF 4','LT-EXIT F0402','=A01+UC102-KF00i','','','','' +'BG1245','SENSOR AUSFAHRT NACHPUFFER F0401 RF 4','LT-EXIT F0401','=A01+UC102-KF00i','','','','' +'SF1251','HAUPTSCHALTER EIN +UC102','I-MS ON','=A01+UC102-KF01i','HAUPTSCHALTER EIN','MAIN SWITCH ON','','' +'SF1250','MOTORSCHUTZSCHALTER HAT AUSGELÖST','I-CB OK','=A01+UC102-KF01i','MSS IN ORDNUNG','MPS OK','','' +'PF1250','LM-ÜBERSTROM +UC102','IL-YE-LED','=A01+UC102-KF01Q','LM ÜBERSTROM','IL OVERCURRENT','','' +'KF1255','IF RF 04: START SPULENWECHSEL 2','IF-RELAIS','=A01+UC102-KF01Q','IF RF 04: START SPULENWECHSEL 2','IF RF 04: START EXCHANGE 2','','' +'DI1254','IF RF 04 : NEUE SPULE','IF-RELAIS','=A01+UC102-KF01i','IF RF 04: NEUE SPULE ','IF RF 04: NEW BOBBIN','','' +'KF1254','IF RF 04: START SPULENWECHSEL 1','IF-RELAIS','=A01+UC102-KF01Q','IF RF 04: START SPULENWECHSEL 1','IF RF 04: START EXCHANGE 1','','' +'PF1247','RUNDUMLEUCHTE STÖRUNG FLYER 4','LED-YE_FAULT','=A01+UC102-KF00Q','','','','' +'SF1253','RESET FLYER 4','IPB-YE-NO','=A01+UC102-KF01i','RESET','RESET','RESET','' +'PF1253','RESET FLYER 4','IPB-YE-LED','=A01+UC102-KF01Q','','','','' +'SF1252','NOT HALT FLYER 4','EPB-NC','=A01+UC102-KF01i','NOT-HALT','E-STOP','E-STOP','' +'MB1267','WEICHE ABZWEIG EINFAHRT NACHP. RF 4','SW-BRANCH','=A01+UC102-KF02Q','','','','' +'MB1266','WEICHE ABZWEIG EINFAHRT NACHP. RF 4','SW-STRAIGHT','=A01+UC102-KF02Q','','','','' +'BG1241','SENSOR AUSFAHRT PUFFER F0402 FLYER 4','LT-EXIT F0402','=A01+UC102-KF00i','','','','' +'BG1240','SENSOR AUSFAHRT PUFFER F0401 FLYER 4','LT-EXIT F0401','=A01+UC102-KF00i','','','','' +'BG1243','SENSOR ZUG IN DOFFER PM 4','LT-TRAIN IN DOF','=A01+UC102-KF00i','','','','' +'BG1256','SENSOR SPULE IN POSITION FLYER 4','BOBBIN IN POS','=A01+UC102-KF01i','','','','' +'BG1244','SENSOR ZUG IN DOFFER FLYER 4 ','LT-TRAIN IN DOF','=A01+UC102-KF00i','','','','' +'MB1251','ABHEBEN ANTRIEBE PM 4','LIFT OFF RF 4','=A01+UC102-KF01Q','','','','' +'MA1256','ANTRIEBE FLYER 4','M-BI','=A01+UC102-KF01Q','','','','' +'BG1141','SENSOR HAUPTSTR. FLYER 3 FB216','LT RF3 FB216','=A01+UC101-KF06i','','','','' +'MB1147','WEICHE ABZWEIG EINFAHRT NACHP. RF 3','SW-BRANCH','=A01+UC101-KF10Q','','','','' +'MB1146','WEICHE ABZWEIG EINFAHRT NACHP. RF 3','SW-STRAIGHT','=A01+UC101-KF10Q','','','','' +'KF1135','IF RF 03: START SPULENWECHSEL 2','IF-RELAIS','=A01+UC101-KF09Q','IF RF 03: START SPULENWECHSEL 2','IF RF 03: START EXCHANGE 2','','' +'DI1134','IF RF 03 : NEUE SPULE','IF-RELAIS','=A01+UC101-KF05i','IF RF 03: NEUE SPULE ','IF RF 03: NEW BOBBIN','','' +'KF1134','IF RF 03: START SPULENWECHSEL 1','IF-RELAIS','=A01+UC101-KF09Q','IF RF 03: START SPULENWECHSEL 1','IF RF 03: START EXCHANGE 1','','' +'PF1127','RUNDUMLEUCHTE STÖRUNG FLYER 3','LED-YE_FAULT','=A01+UC101-KF08Q','','','','' +'SF1133','RESET FLYER 3','IPB-YE-NO','=A01+UC101-KF05i','RESET','RESET','RESET','' +'PF1133','RESET FLYER 3','IPB-YE-LED','=A01+UC101-KF09Q','','','','' +'SF1132','NOT HALT FLYER 3','EPB-NC','=A01+UC101-KF05i','NOT-HALT','E-STOP','E-STOP','' +'BG1005','SENSOR AUSFAHRT NACHPUFFER F0101 RF 1','LT-EXIT F101 ','=A01+UC101-KF00i','','','','' +'BG1126','SENSOR AUSFAHRT NACHPUFFER F0302 FLYER 3','LT-EXIT F0302','=A01+UC101-KF04i','','','','' +'BG1125','SENSOR AUSFAHRT NACHPUFFER F0301 FLYER 3','LT-EXIT F0301','=A01+UC101-KF04i','','','','' +'MB1122','WEICHE ABZWEIG EINFAHRT RF 3','SW ENTER RF 3','=A01+UC101-KF08Q','','','','' +'MB1121','WEICHE ABZWEIG EINFAHRT PUFFER F0301 FLYER 3','SW ENTER F0301 ','=A01+UC101-KF08Q','','','','' +'MB1143','WEICHE ABZWEIG EINFAHRT RF3 FB216 ','SW RF3 FB216','=A01+UC101-KF10Q','','','','' +'MA1144','ANTRIEB HAUPTSTECKE FB215 ','M-BI FB215','=A01+UC101-KF10Q','','','','' +'MA1156','ANTRIEB HAUPTSTECKE FB216','M-BI FB216','=A01+UC101-KF11Q','','','','' +'MB1120','WEICHE ABZWEIG EINFAHRT FLYER 3 ','SW ENTER RF 3','=A01+UC101-KF08Q','','','','' +'MB1154','ANPRESSEN NACHPUFFER F0301 FLYER 3','PRESS F0301','=A01+UC101-KF11Q','','','','' +'MB1155','ANPRESSEN NACHPUFFER F0302 FLYER 3','PRESS F0302','=A01+UC101-KF11Q','','','','' +'QA1151','ANTRIEB NACHPUFFER F0302 FLYER 3','M-BI','=A01+UC101-KF11Q','','','','' +'MA1150','ANTRIEB NACHPUFFER F0301 FLYER 3','M-BI','=A01+UC101-KF11Q','','','','' +'MB1124','ANPRESSEN PUFFER F0301 FLYER 3','PRESS F0301','=A01+UC101-KF08Q','','','','' +'MB1125','ANPRESSEN PUFFER F0302 FLYER 3','PRESS F0302','=A01+UC101-KF08Q','','','','' +'QA1141','ANTRIEB PUFFER F0301 FLYER 3','M-BI-RI','=A01+UC101-KF10Q','','','','' +'MA1140','ANTRIEB PUFFER F0301 FLYER 3','M-BI-LE','=A01+UC101-KF10Q','','','','' +'BG1121','SENSOR AUSFAHRT PUFFER F0302 FLYER 3','LT-EXIT F0302','=A01+UC101-KF04i','','','','' +'BG1120','SENSOR AUSFAHRT PUFFER F0301 FLYER 3','LT-EXIT F0301','=A01+UC101-KF04i','','','','' +'MB1131','ABHEBEN ANTRIEBE PM 3','LIFT OFF BS 3','=A01+UC101-KF09Q','','','','' +'MA1136','ANTRIEBE FLYER 3','M-BI','=A01+UC101-KF09Q','','','','' +'BG1136','SENSOR SPULE IN POSITION FLYER 3 ','BOBBIN IN POS','=A01+UC101-KF05i','','','','' +'BG1124','SENSOR ZUG IN DOFFER FLYER 3','LT-TRAIN IN DOF','=A01+UC101-KF04i','','','','' +'BG1123','SENSOR ZUG IN DOFFER PM 3','LT-TRAIN IN DOF','=A01+UC101-KF04i','','','','' +'MB1114','ANPRESSEN NACHPUFFER F0201 FLYER 2','PRESS F0201','=A01+UC101-KF07Q','','','','' +'MB1115','ANPRESSEN NACHPUFFER F0202 FLYER 2','PRESS F0202','=A01+UC101-KF07Q','','','','' +'QA1111','ANTRIEB NACHPUFFER F0202 FLYER 2','M-BI-RI','=A01+UC101-KF07Q','','','','' +'MA1110','ANTRIEB NACHPUFFER F0201 FLYER 2','M-BI-LE','=A01+UC101-KF07Q','','','','' +'MB1084','ANPRESSEN PUFFER F0201 FLYER 2','PRESS F0201','=A01+UC101-KF04Q','','','','' +'MB1085','ANPRESSEN PUFFER F0202 FLYER 2','PRESS F0202','=A01+UC101-KF04Q','','','','' +'QA1101','ANTRIEB PUFFER F0202 FLYER 2','M-BI-RI','=A01+UC101-KF06Q','','','','' +'MA1100','ANTRIEB PUFFER F0201 FLYER 2','M-BI-LE','=A01+UC101-KF06Q','','','','' +'BG1080','SENSOR AUSFAHRT PUFFER F0201 FLYER 2','LT-EXIT F0201','=A01+UC101-KF02i','','','','' +'BG1081','SENSOR AUSFAHRT PUFFER F0202 FLYER 2','LT-EXIT F0202','=A01+UC101-KF02i','','','','' +'MB1081','WEICHE ABZWEIG EINFAHRT PUFFER F0201 FLYER 2','SW ENTER F0201','=A01+UC101-KF04Q','','','','' +'BG1086','SENSOR AUSFAHRT NACHPUFFER F0202 RF 2','LT-EXIT F0202','=A01+UC101-KF02i','','','','' +'BG1085','SENSOR AUSFAHRT NACHPUFFER F0201 RF 2','LT-EXIT F0201','=A01+UC101-KF02i','','','','' +'MB1082','WEICHE ABZWEIG EINFAHRT RF 2','SW ENTER RF 2','=A01+UC101-KF04Q','','','','' +'BG1097','SENSOR HAUPTSTR. FLYER 2 ','LT-ENTER FB ','=A01+UC101-KF03i','','','','' +'MB1080','WEICHE ABZWEIG EINFAHRT RF 2','SW ENTER RF2','=A01+UC101-KF04Q','','','','' +'SF1091','HAUPTSCHALTER EIN +UC101','I-MS ON','=A01+UC101-KF03i','HAUPTSCHALTER EIN','MAIN SWITCH ON','','' +'SF1090','MOTORSCHUTZSCHALTER HAT AUSGELÖST','I-CB OK','=A01+UC101-KF03i','MSS IN ORDNUNG','MPS OK','','' +'PF1090','LM-ÜBERSTROM +UC101','IL-YE-LED','=A01+UC101-KF05Q','LM ÜBERSTROM','IL OVERCURRENT','','' +'MB1107','WEICHE ABZWEIG EINFAHRT NACHP. RF 2','SW-BRANCH','=A01+UC101-KF06Q','','','','' +'MB1106','WEICHE ABZWEIG EINFAHRT NACHP. RF 2','SW-STRAIGHT','=A01+UC101-KF06Q','','','','' +'KF1095','IF RF 02: START SPULENWECHSEL 2','IF-RELAIS','=A01+UC101-KF05Q','IF RF 02: START SPULENWECHSEL 2','IF RF 02: START EXCHANGE 2','','' +'DI1094','IF RF 02 : NEUE SPULE','IF-RELAIS','=A01+UC101-KF03i','IF RF 02: NEUE SPULE ','IF RF 02: NEW BOBBIN','','' +'PF1087','RUNDUMLEUCHTE STÖRUNG FLYER 2','LED-YE_FAULT','=A01+UC101-KF04Q','','','','' +'KF1094','IF RF 02: START SPULENWECHSEL 1','IF-RELAIS','=A01+UC101-KF05Q','IF RF 02: START SPULENWECHSEL 1','IF RF 02: START EXCHANGE 1','','' +'SF1093','RESET FLYER 2','IPB-YE-NO','=A01+UC101-KF03i','RESET','RESET','RESET','' +'PF1093','RESET FLYER 2','IPB-YE-LED','=A01+UC101-KF05Q','','','','' +'SF1092','NOT HALT FLYER 2','EPB-NC','=A01+UC101-KF03i','NOT-HALT','E-STOP','E-STOP','' +'BG1096','SENSOR SPULE IN POSITION FLYER 2 ','BOBBIN IN POS','=A01+UC101-KF03i','','','','' +'BG1084','SENSOR ZUG IN DOFFER FLYER 2 ','LT-TRAIN IN DOF','=A01+UC101-KF02i','','','','' +'BG1083','SENSOR ZUG IN DOFFER PM 2','LT-TRAIN IN DOF','=A01+UC101-KF02i','','','','' +'MB1091','ABHEBEN ANTRIEBE PM 2','LIFT OFF RF 2','=A01+UC101-KF05Q','','','','' +'MA1096','ANTRIEB FLYER 2','M-BI','=A01+UC101-KF05Q','','','','' +'QA1025','ANTRIEB HAUPTSTR. RF 1','M RF1','=A01+UC101-KF02Q','','','','' +'MA1024','ANTRIEB HAUPTSTR. RF 1','M RF1','=A01+UC101-KF02Q','','','','' +'MB1027','WEICHE ABZWEIG EINFAHRT NACHP. RF 1','SW-STRAIGHT','=A01+UC101-KF02Q','','','','' +'MB1026','WEICHE ABZWEIG EINFAHRT NACHP. RF 1','SW-BRANCH','=A01+UC101-KF02Q','','','','' +'PF1007','RUNDUMLEUCHTE STÖRUNG FLYER 1','LED-YE_FAULT','=A01+UC101-KF00Q','','','','' +'SF1013','RESET FLYER 1','IPB-YE-NO','=A01+UC101-KF01i','RESET','RESET','RESET','' +'PF1013','RESET FLYER 1','IPB-YE-LED','=A01+UC101-KF01Q','','','','' +'SF1012','NOT HALT FLYER 1','EPB-NC','=A01+UC101-KF01i','NOT-HALT','E-STOP','E-STOP','' +'KF1015','IF RF 01: START SPULENWECHSEL 2','IF-RELAIS','=A01+UC101-KF01Q','IF RF 01: START SPULENWECHSEL 2','IF RF 01: START EXCHANGE 2','CUANDO 01: LIBERAR CAMBIOS DE BOBINAS 2','' +'DI1014','IF RF 01 : NEUE SPULE','IF-RELAIS','=A01+UC101-KF01i','IF RF 01: NEUE SPULE ','IF RF 01: NEW BOBBIN','CUANDO 01: LLAMAR NUEVA BOBINA','' +'KF1014','IF RF 01: START SPULENWECHSEL 1','IF-RELAIS','=A01+UC101-KF01Q','IF RF 01: START SPULENWECHSEL 1','IF RF 01: START EXCHANGE 1','CUANDO 01: LIBERAR CAMBIOS DE BOBINAS 1','' +'MB1034','ANPRESSEN NACHPUFFER F0101 FLYER 1','PRESS F0101','=A01+UC101-KF03Q','','','','' +'MB1035','ANPRESSEN NACHPUFFER F0102 FLYER 1','PRESS F0102','=A01+UC101-KF03Q','','','','' +'QA1031','ANTRIEB NACHPUFFER F0102 FLYER 1','M-BI','=A01+UC101-KF03Q','','','','' +'MA1030','ANTRIEB NACHPUFFER F0101 FLYER 1','M-BI','=A01+UC101-KF03Q','','','','' +'MB1004','ANPRESSEN PUFFER F0101 FLYER 1 ','PRESS F0101','=A01+UC101-KF00Q','','','','' +'MB1005','ANPRESSEN PUFFER F0102 FLYER 1 ','PRESS F0102','=A01+UC101-KF00Q','','','','' +'QA1021','ANTRIEB PUFFER F0102 FLYER 1','M-BI-RI','=A01+UC101-KF02Q','','','','' +'MA1020','ANTRIEB PUFFER F0101 FLYER 1','M-BI-LE','=A01+UC101-KF02Q','','','','' +'BG1000','SENSOR AUSFAHRT PUFFER F0101 FLYER 1','LT-EXIT F0101','=A01+UC101-KF00i','','','','' +'BG1001','SENSOR AUSFAHRT PUFFER F0102 FLYER 1','LT-EXIT F0102','=A01+UC101-KF00i','','','','' +'MB1001','WEICHE ABZWEIG EINFAHRT PUFFER F0101 FLYER 1','SW ENTER F0101','=A01+UC101-KF00Q','','','','' +'MB1000','WEICHE ABZWEIG EINFAHRT RF 1','SW ENTER RF 1','=A01+UC101-KF00Q','','','','' +'BG1006','SENSOR AUSFAHRT NACHPUFFER F0102 RF 1','LT-EXIT F102','=A01+UC101-KF00i','','','','' +'MB1011','ABHEBEN ANTRIEBE PM 1 ','LIFT OFF BS 1','=A01+UC101-KF01Q','','','','' +'BG1003','SENSOR ZUG IN DOFFER PM 1','LT-TRAIN IN DOF','=A01+UC101-KF00i','','','','' +'MA1016','ANTRIEB FLYER 1 ','M-BI','=A01+UC101-KF01Q','','','','' +'BG1016','SENSOR SPULE IN POSITION RF 1','BOBBIN IN POS','=A01+UC101-KF01i','','','','' +'BG1004','SENSOR ZUG IN DOFFER FLYER 1','LT-TRAIN IN DOF','=A01+UC101-KF00i','','','','' diff --git a/Test-Dateien/BENIN_20221208.txt b/Test-Dateien/BENIN_20221208.txt new file mode 100644 index 0000000..504cde6 --- /dev/null +++ b/Test-Dateien/BENIN_20221208.txt @@ -0,0 +1,636 @@ +'QA1113','ANTRIEB NACHPUFFER FLYER 2','M-BI-RI','=A01+UC101-KF03Q','','','','' +'MA1112','ANTRIEB NACHPUFFER FLYER 2','M-BI-LE','=A01+UC101-KF03Q','','','','' +'MB1612','ABHEBEN ANTRIEBE FLYER 10','LIFT OFF RF 10','=A01+UC105-KF01Q','','','','' +'MB1552','ABHEBEN ANTRIEBE FLYER 9','LIFT OFF RF 9','=A01+UC104-KF05Q','','','','' +'MB1512','ABHEBEN ANTRIEBE FLYER 8','LIFT OFF RF 8','=A01+UC104-KF01Q','','','','' +'MB1452','ABHEBEN ANTRIEBE FLYER 7','LIFT OFF RF 7','=A01+UC103-KF05Q','','','','' +'MB1412','ABHEBEN ANTRIEBE FLYER 6','LIFT OFF RF 6','=A01+UC103-KF01Q','','','','' +'MB1292','ABHEBEN ANTRIEBE FLYER 5','LIFT OFF RF 5','=A01+UC102-KF05Q','','','','' +'MB1252','ABHEBEN ANTRIEBE FLYER 4','LIFT OFF RF 4','=A01+UC102-KF01Q','','','','' +'MB1132','ABHEBEN ANTRIEBE FLYER 3','LIFT OFF RF 3','=A01+UC101-KF05Q','','','','' +'MB1092','ABHEBEN ANTRIEB RF 2','LIFT OFF RF 2','=A01+UC101-KF01Q','','','','' +'MB1012','ABHEBEN ANTRIEBE PM 1 ','LIFT OFF RF 1','=A01+UC100-KF01Q','','','','' +'SF0007','STEUERSPANNUNG 24V OK ','24V OK','=A01+UH001-KF00i','STEUERSPANNUNG 24V OK ','CONTROL VOLTAGE 24V OK ','STEUERSPANNUNG 24V OK ','' +'SF1011','HAUPTSCHALTER EIN +UC100','I-MS ON','=A01+UC100-KF01i','HAUPTSCHALTER EIN','MAIN SWITCH ON','','' +'SF1010','MOTORSCHUTZSCHALTER HAT AUSGELÖST','I-CB OK','=A01+UC100-KF01i','MSS IN ORDNUNG','MPS OK','','' +'PF1010','LM-ÜBERSTROM +UC100','IL-YE-LED','=A01+UC100-KF01Q','LM ÜBERSTROM','IL OVERCURRENT','','' +'MB1603','WEICHE ABZWEIG EINFAHRT PUFFER F1002 FLYER 10','SW ENTER F1002','=A01+UC105-KF00Q','','','','' +'QA3157','ANTRIEB HAUPTSTRECKE 1 AUSFAHRT RSM 20-28','RA-BI-RE','=A01+UC201-KF05Q','','','','' +'MA3156','ANTRIEB HAUPTSTRECKE 1 EINFAHRT RSM 20-28','RA-BI-LI','=A01+UC201-KF05Q','','','','A' +'QA5015','ANTRIEB EIN-AUSFAHRT HAUPTSTECKE RF 4','M-BI-RSM','=A01+UC102-KF09Q','','','','' +'MA5014','ANTRIEB EIN-AUSFAHRT HAUPTSTECKE RF 4','M-BI-RSM','=A01+UC102-KF09Q','','','','' +'QA1263','ANTRIEB HAUPTSTECKE RF 4 ','M-BI-RF ','=A01+UC102-KF02Q','','','','' +'MA1262','ANTRIEB HAUPTSTECKE RF 4','M-BI-RF ','=A01+UC102-KF02Q','','','','' +'MB1243','WEICHE ABZWEIG EINFAHRT F402 FLYER 4','SW F0401-F0402 ','=A01+UC102-KF00Q','','','','' +'BG3130','SENSOR OPTISCH 1 RSM 21/28','LT-RSM','=A01+UC201-KF03i','','','','' +'BG1122','SENSOR HAUPTSTR. VOR FLYER 3 ','LT-EXIT F0301','=A01+UC101-KF02i','','','','' +'BG1002','SENSOR HAUPTSTR. VOR FLYER 1 ','LT-EXIT F0101','=A01+UC100-KF00i','','','','' +'BG1260','SENSOR EINFAHRT. RF','LT-ENTER ','=A01+UC102-KF02i','','','','' +'BG1287','SENSOR HAUPTSTR. EINFAHRT FB201','LT- FB201','=A01+UC102-KF03i','','','','' +'BG1282','SENSOR EINFAHRT PUFFER F502 FLYER 5 ','LT- ENTER F0502','=A01+UC102-KF03i','','','','' +'BG5002','SENSOR EINFAHRT RF-PUFFER','LT- ENTER','=A01+UC102-KF05i','','','','' +'BG5003','SENSOR EINFAHRT. RF-RSM','LT- ENTRY','=A01+UC102-KF05i','','','','' +'BG1261','SENSOR EINFAHRT. RF-PUFFER','LT-ENTER ','=A01+UC102-KF02i','','','','' +'BG1262','SENSOR HAUPTSTR. FLYER 5','LT-ENTER ','=A01+UC102-KF02i','','','','' +'MB3151','WEICHE 1 ABZWEIG RSM 20','SW1 RSM 20','=A01+UC201-KF05Q','','','','' +'BG3030','SENSOR OPTISCH 1 RSM 12/20','LT-RSM','=A01+UC200-KF03i','','','','' +'BG3031','SENSOR OPTISCH 1 RSM 1/9','LT-RSM','=A01+UC200-KF03i','','','','' +'MB3036','WEICHE ABZWEIG RSM 1-25','SW RSM','=A01+UC200-KF03Q','','','','' +'QA5013','ANTRIEB EIN-AUSFAHRT HAUPTSTECKE RF 4','M-BI-RSM','=A01+UC102-KF09Q','','','','' +'MA5012','ANTRIEB EIN-AUSFAHRT HAUPTSTECKE RF 4','M-BI-RSM','=A01+UC102-KF09Q','','','','' +'MB1277','WEICHE ABZWEIG EINFAHRT RF-PUFFER','SW RF 4','=A01+UC102-KF03Q','','','','' +'DI0025','STEUERSPANNUNG 24V +UC202 OK','24V OK','=A01+UH001-KF02i','STEUERSPANNUNG 24V +UC202 OK','CONTROL VOLTAGE 24V +UC202 OK','TENSION DE MANIOBRA 24V +UC202 OK','' +'DI0024','STEUERSPANNUNG 24V UC201 - UC200 OK','24V OK','=A01+UH001-KF02i','STEUERSPANNUNG 24V UC201 - UC200 OK','CONTROL VOLTAGE 24V +UC201 - +UC200 OK','TENSION DE MANIOBRA 24V +UC200 - +UC201 ','' +'DI0023','STEUERSPANNUNG 24V UC104 - UC105 OK','24V OK','=A01+UH001-KF02i','STEUERSPANNUNG 24V UC104-UC105 OK','CONTROL VOLTAGE 24V +UC104 - +UC105 OK','TENSION DE MANIOBRA 24V UC105 OK','' +'DI0020','STEUERSPANNUNG 24V UH001 OK','24V OK UH001','=A01+UH001-KF02i','STEUERSPANNUNG 24V UH001 OK','CONTROL VOLTAGE 24V UH001 OK','TENSION DE MANIOBRA 24V UH001 OK','' +'DI0022','STEUERSPANNUNG 24V UC103 - UC102 OK','24V OK','=A01+UH001-KF02i','STEUERSPANNUNG 24V UC103-UC102 OK','CONTROL VOLTAGE 24V UC103-UC102 OK','TENSION DE MANIOBRA 24V UC103-UC104 OK','' +'DI0021','STEUERSPANNUNG 24V UC101-UC100 OK','24V OK','=A01+UH001-KF02i','STEUERSPANNUNG 24V UC101-UC100 OK','CONTROL VOLTAGE 24V UC101-UC100 OK','TENSION DE MANIOBRA 24V UC101-UC102 OK','' +'KF0013','DRUCKL.-WARTUNGSEINH. SCHLIESSEN','COMPR. AIR OFF','=A01+UH001-KF01Q','DRUCKL.-WARTUNGSEINH. SCHLIESSEN','CLOSE PRESS.-MAINTENANCE UNIT','AIRE COMPRIMIDO/VÁLVULA DE AISLAMIENTO C','' +'KF0012','RESET NOT HALT','RESET E-STOP','=A01+UH001-KF01Q','RESET NOT HALT','RESET EMERGENCY STOP','RESET PARO DE EMERGENCIA','' +'PF0011','ÜBERSTROM/SICHERUNGSFALL','IL-YE-LED','=A01+UH001-KF01Q','ÜBERSTROM/SICHERUNGSFALL','OVERCURRENT/MIN. CIRCUIT BREAKERS','SOBREINTENSIDAD/FUSIBLE AUTOMÁTICO','' +'PF0010','DRUCKLUFT FEHLT','IL-YE-LED','=A01+UH001-KF01Q','DRUCKLUFT FEHLT','COMPRESSED AIR MISSING','AIRE COMPRIMIDO DESCONECTADO','' +'PF0002','START NACH STÖRUNG','IPB-CL-LED','=A01+UH001-KF00Q','START NACH STÖRUNG','START AFTER TROUBLE','ARRANQUE DESPUÉS DE AVERÍA','' +'PF0004','STÖRUNG KOMMUNIKATION PC-SPS','IL-YE-LED','=A01+UH001-KF00Q','STÖRUNG KOMMUNIKATION PC-SPS','TROUBLE COMMUNICATION PC-PLC','AVERÍA COMMUNICATIÓN PC-CPP','' +'PF0006','ABHEBEN AKTIV','IL-YE-LED','=A01+UH001-KF00Q','ABHEBEN AKTIV','LIFT OFF ACTIVE','SEPARAR ACTIVO','' +'PF0005','LAUFZEITFEHLER','IPB-YE-LED','=A01+UH001-KF00Q','LAUFZEITFEHLER','TRAVEL TIME ERROR','ERROR DE TIEMPO','' +'PF0003','NOT HALT BETÄTIGT','IL-YE-LED','=A01+UH001-KF00Q','NOT HALT BETÄTIGT','EMERGENCY STOP PUSHED','PARO EMERGENCIA OK','' +'PF0001','ANLAGE EIN','IPB-GN-LED','=A01+UH001-KF00Q','ANLAGE EIN','SYSTEM ON','SISTEMA ENCENDIDO','' +'PF0000','STÖRUNG ALLGEMEIN','IL-YE-LED','=A01+UH001-KF00Q','STÖRUNG ALLGEMEIN','GENERAL TROUBLE','AVERÍA','' +'DI0017','PHASENÜBERWACHUNGSRELAIS 400VAC EIN','MONITOR. RELAY','=A01+UH001-KF01i','PHASENÜBERWACHUNGSRELAIS 400VAC EIN','PHASE MONITORING RELAY 400VAC ON','VIGILANCIA DE FASE EL RELE´','' +'SF0015','RESET AKTIV','PB-BK-NO','=A01+UH001-KF01i','RESET AKTIV','RESET ACTIVE','RESET AKTIVA','' +'DI0014','HAUPTSCHÜTZE EIN','MAIN CONTACT.','=A01+UH001-KF01i','HAUPTSCHÜTZE EIN','MAIN CONTACTORS ON','ENCENDIDO CONTACTOR PRINCIPAL','' +'DI0013','SICHERHEITSRELAIS EIN','SAFETY RELAY','=A01+UH001-KF01i','SICHERHEITSRELAIS EIN','SAFETY RELAY ON','RELÉ DE SEGURIDAD ENCENDIDO','' +'DI0012','SICHERUNGSAUTOMATENFALL','CIRCUIT BR.','=A01+UH001-KF01i','SICHERUNGSAUTOMATENFALL','MINIATURE CIRCUIT BREAKERS','FUSIBLE AUTOMÁTICO','' +'DI0011','ÜBERSTROM','MOTORS','=A01+UH001-KF01i','ÜBERSTROM','OVERCURRENT','SOBREINTENSIDAD','' +'BG0010','DRUCKLUFT OK','COMPR. AIR','=A01+UH001-KF01i','DRUCKLUFT OK','COMPRESSED AIR OK','AIRE COMPRIMIDO OK','' +'SF0004','LAMPENTEST','PB-WH-NO','=A01+UH001-KF00i','LAMPENTEST','LAMP TEST','ENSAYO LAMPARA','' +'SF0006','ANTRIEBE ABHEBEN','SS-BK-NO','=A01+UH001-KF00i','ANTRIEBE ABHEBEN','LIFT OFF CONVEYORS','SEPARAR MOTOR','' +'SF0005','LAUFZEITFEHLER','IPB-YE-N0','=A01+UH001-KF00i','LAUFZEITFEHLER','TRAVEL TIME ERROR','ERROR DE TIEMPO','' +'SF0003','NOT HALT SCHALTSCHRANK','EPB-RD-NC','=A01+UH001-KF00i','NOT HALT','EMERGENCY STOP','PARO DE EMERGENCIA ARMARIO DE DISTRIBUCI','' +'SF0002','START NACH STÖRUNG','IPB-CL-NO','=A01+UH001-KF00i','START NACH STÖRUNG','START AFTER TROUBLE','ARRANQUE DESPUÉS DE AVERÍA','' +'SF0001','ANLAGE EIN','IPB-GN-NO','=A01+UH001-KF00i','ANLAGE EIN','SYSTEM ON','SISTEMA ENCENDIDO','' +'SF0000','ANLAGE AUS','PB-BK-NC','=A01+UH001-KF00i','ANLAGE AUS','SYSTEM OFF','SISTEMA APAGADO','' +'BG1266','SENSOR HAUPTSTR. EINFAHRT','LT-ENTRY','=A01+UC102-KF03i','','','','' +'BG1265','SENSOR EINFAHRT. PUFFER','LT- ENTER','=A01+UC102-KF02i','','','','' +'BG1264','SENSOR HAUPTSTR. EINFAHRT FB201','LT- ENTER ','=A01+UC102-KF02i','','','','' +'BG1267','SENSOR HAUPTSTR. AUSFAHRT','LT- EXIT','=A01+UC102-KF03i','','','','' +'BG1297','SENSOR HAUPTSTR. FLYER 5 ','LT-RF5','=A01+UC102-KF04i','','','','' +'BG1286','SENSOR AUSFAHRT NACHPUFFER F0502 RF 5','LT-EXIT F0502','=A01+UC102-KF03i','','','','' +'BG1285','SENSOR AUSFAHRT NACHPUFFER F0501 RF 5','LT-EXIT F0501','=A01+UC102-KF03i','','','','' +'BG1257','SENSOR HAUPTSTR. FLYER 4','LT-RF4','=A01+UC102-KF01i','','','','' +'BG1246','SENSOR AUSFAHRT NACHPUFFER F0402 RF 4','LT-EXIT F0402','=A01+UC102-KF00i','','','','' +'BG1245','SENSOR AUSFAHRT NACHPUFFER F0401 RF 4','LT-EXIT F0401','=A01+UC102-KF00i','','','','' +'BG1241','SENSOR AUSFAHRT PUFFER F0402 FLYER 4','LT-EXIT F0402','=A01+UC102-KF00i','','','','' +'BG1240','SENSOR AUSFAHRT PUFFER F0401 FLYER 4','LT-EXIT F0401','=A01+UC102-KF00i','','','','' +'MB1542','WEICHE ABZWEIG EINFAHRT F0902 FLYER 9','SW ENTER F0902 ','=A01+UC104-KF04Q','','','','' +'MB1442','WEICHE ABZWEIG EINFAHRT F0702 FLYER 7','SW ENTER F0702 ','=A01+UC103-KF04Q','','','','' +'MB1273','WEICHE ABZWEIG EINFAHRT RF-PUFFER','SW ENTER','=A01+UC102-KF03Q','','','','' +'MB1280','WEICHE ABZWEIG KREUZUNGSWEICHE FLYER 4','SW ENTER RF 5','=A01+UC102-KF04Q','','','','' +'MB1122','WEICHE ABZWEIG EINFAHRT F302 FLYER 3 ','SW ENTER F302','=A01+UC101-KF04Q','','','','' +'MB1282','WEICHE ABZWEIG EINFAHRT F0502 FLYER 5','SW F0502','=A01+UC102-KF04Q','','','','' +'MB1241','WEICHE ABZWEIG EINFAHRT F402 FLYER 4','SW F0401-F0402 ','=A01+UC102-KF00Q','','','','' +'MB5002','WEICHE GERADE FB210','STRAIGHT','=A01+UC102-KF08Q','','','','' +'MB5003','WEICHE ABZWEIG FB210','BRANCH ','=A01+UC102-KF08Q','','','','' +'BG5012','SENSOR ZUG IN PUFFER E0107','IN-E0107','=A01+UC102-KF06i','','','','' +'BG5011','SENSOR ZUG IN PUFFER E0106','IN-E0106','=A01+UC102-KF06i','','','','' +'BG5010','SENSOR ZUG IN PUFFER E0105','IN-E0105','=A01+UC102-KF06i','','','','' +'BG5007','SENSOR ZUG IN PUFFER E0104','IN-E0104','=A01+UC102-KF05i','','','','' +'BG5006','SENSOR ZUG IN PUFFER E0103','IN-E0103','=A01+UC102-KF05i','','','','' +'BG5005','SENSOR ZUG IN PUFFER E0102','IN-E0102','=A01+UC102-KF05i','','','','' +'BG5004','SENSOR ZUG IN PUFFER E0101','IN-E0101','=A01+UC102-KF05i','','','','' +'MB5007','WEICHE ABZWEIG EINFAHRT PUFFER E0102-E0103','SW E0105-E0106','=A01+UC102-KF08Q','','','','' +'MB5005','WEICHE ABZWEIG EINFAHRT PUFFER E0102-E0103','SW E0103-E0104','=A01+UC102-KF08Q','','','','' +'MB5004','WEICHE ABZWEIG EINFAHRT PUFFER E0102-E0103','SW E0102','=A01+UC102-KF08Q','','','','' +'MB5011','WEICHE ABZWEIG EINFAHRT PUFFER E0107','SW E0107','=A01+UC102-KF09Q','','','','' +'MB5006','WEICHE ABZWEIG EINFAHRT PUFFER E0104','SW E0104','=A01+UC102-KF08Q','','','','' +'MB5010','WEICHE ABZWEIG EINFAHRT PUFFER E0106','SW E0106','=A01+UC102-KF09Q','','','','' +'QA5037','ANTRIEB PUFFER E0107','M-BI-RI','=A01+UC102-KF11Q','','','','' +'MA5036','ANTRIEB PUFFER E0106','M-BI-LE','=A01+UC102-KF11Q','','','','' +'QA5033','ANTRIEB PUFFER E0105','M-BI-RI','=A01+UC102-KF11Q','','','','' +'MA5032','ANTRIEB PUFFER E0104','M-BI-LE','=A01+UC102-KF11Q','','','','' +'MB5035','ANPRESSEN PUFFER E0107','PRESS E0107','=A01+UC102-KF11Q','','','','' +'MB5034','ANPRESSEN PUFFER E0106','PRESS E0106','=A01+UC102-KF11Q','','','','' +'MB5031','ANPRESSEN PUFFER E0105','PRESS E0105','=A01+UC102-KF11Q','','','','' +'MB5030','ANPRESSEN PUFFER E0104','PRESS E0104','=A01+UC102-KF11Q','','','','' +'QA5027','ANTRIEB PUFFER E0103','M-BI-RI','=A01+UC102-KF10Q','','','','' +'MA5026','ANTRIEB PUFFER E0102','M-BI-LE','=A01+UC102-KF10Q','','','','' +'QA5023','ANTRIEB PUFFER E0101 RECHTS','M-BI-RI','=A01+UC102-KF10Q','','','','' +'MA5022','ANTRIEB PUFFER E0101 LINKS','M-BI-LE','=A01+UC102-KF10Q','','','','' +'MB5025','ANPRESSEN PUFFER E0103','PRESS E0103','=A01+UC102-KF10Q','','','','' +'MB5024','ANPRESSEN PUFFER E0102','PRESS E0102','=A01+UC102-KF10Q','','','','' +'MB5020','ANPRESSEN PUFFER E0101','PRESS E0101','=A01+UC102-KF10Q','','','','' +'QA3245','ANTRIEB HAUPTSTRECKE 1 AUSFAHRT RSM 21-28','RA-BI-RE','=A01+UC202-KF04Q','','','','' +'MA3244','ANTRIEB HAUPTSTRECKE 1 EINFAHRT RSM 21-28','RA-BI-LI','=A01+UC202-KF04Q','','','','A' +'QA3035','ANTRIEB HAUPTSTRECKE 1 AUSFAHRT RSM 1-10','RA-BI-RE','=A01+UC200-KF03Q','','','','' +'MA3034','ANTRIEB HAUPTSTRECKE 1 EINFAHRT RSM 1-10','RA-BI-LI','=A01+UC200-KF03Q','','','','A' +'QA3155','ANTRIEB HAUPTSTRECKE 1 AUSFAHRT RSM 11-20','RA-BI-RE','=A01+UC201-KF05Q','','','','' +'MA3154','ANTRIEB HAUPTSTRECKE 1 EINFAHRT RSM 11-20','RA-BI-LI','=A01+UC201-KF05Q','','','','A' +'PF3114','RUNDUMLEUCHTE STÖRUNG RSM 11-20','LED-YE_FAULT','=A01+UC201-KF01Q','','','','' +'SF3116','RESET/START NACH NOT HALT RSM 11-20','IPB-YE-NO','=A01+UC201-KF01i','RESET','RESET','RESET','' +'PF3116','RESET/START NACH NOT HALT RSM 11-20','IPB-YE-LED ','=A01+UC201-KF01Q','','','','' +'SF3115','NOT HALT RSM 11-20','EPB-NC','=A01+UC201-KF01i','NOT-HALT','E-STOP','E-STOP','' +'SF3114','HAUPTSCHALTER EIN +UC201','I-MS ON','=A01+UC201-KF01i','HAUPTSCHALTER EIN','MAIN SWITCH ON','','' +'SF3117','MOTORSCHUTZSCHALTER HAT AUSGELÖST','I-CB OK','=A01+UC201-KF01i','MSS IN ORDNUNG','MPS OK','','' +'PF3117','LM-ÜBERSTROM +UC201 RSM 11-20','IL-YE-LED','=A01+UC201-KF01Q','LM ÜBERSTROM','IL OVERCURRENT','','' +'PF3014','RUNDUMLEUCHTE STÖRUNG RSM 01-10','LED-YE_FAULT','=A01+UC200-KF01Q','','','','' +'SF3016','RESET/START NACH NOT HALT RSM 1-10','IPB-YE-NO','=A01+UC200-KF01i','RESET','RESET','RESET','' +'PF3016','RESET/START NACH NOT HALT RSM 1-10','IPB-YE-LED ','=A01+UC200-KF01Q','','','','' +'SF3015','NOT HALT RSM 1-10','EPB-NC','=A01+UC200-KF01i','NOT-HALT','E-STOP','E-STOP','' +'SF3014','HAUPTSCHALTER EIN +UC200','I-MS ON','=A01+UC200-KF01i','HAUPTSCHALTER EIN','MAIN SWITCH ON','','' +'SF3017','MOTORSCHUTZSCHALTER HAT AUSGELÖST','I-CB OK','=A01+UC200-KF01i','MSS IN ORDNUNG','MPS OK','','' +'PF3017','LM-ÜBERSTROM +UC200 RSM 1-10','IL-YE-LED','=A01+UC200-KF01Q','LM ÜBERSTROM','IL OVERCURRENT','','' +'PF3214','RUNDUMLEUCHTE STÖRUNG RSM 21-28','LED-YE_FAULT','=A01+UC202-KF01Q','','','','' +'SF3216','RESET/START NACH NOT HALT RSM 21-25','IPB-YE-NO','=A01+UC202-KF01i','RESET','RESET','RESET','' +'PF3216','RESET/START NACH NOT HALT RSM 21-28','IPB-YE-LED ','=A01+UC202-KF01Q','','','','' +'SF3215','NOT HALT RSM 21-25','EPB-NC','=A01+UC202-KF01i','NOT-HALT','E-STOP','E-STOP','' +'SF3214','HAUPTSCHALTER EIN +UC202','I-MS ON','=A01+UC202-KF01i','HAUPTSCHALTER EIN','MAIN SWITCH ON','','' +'SF3217','MOTORSCHUTZSCHALTER HAT AUSGELÖST','I-CB OK','=A01+UC202-KF01i','MSS IN ORDNUNG','MPS OK','','' +'PF3217','LM-ÜBERSTROM +UC202','IL-YE-LED','=A01+UC202-KF01Q','LM ÜBERSTROM','IL OVERCURRENT','','' +'SF3222','ZUG WECHSELN 1 RSM 28','LDT-GN-NO','=A01+UC202-KF02i','-UZ3222','-UZ3222','','' +'PF3240','ZUG WECHSELN 1 RSM 28','LDT-GN-LED ','=A01+UC202-KF04Q','','','','' +'SF3220','ZUG WECHSELN 1 RSM 27','LDT-GN-NO','=A01+UC202-KF02i','-UZ3220','-UZ3220','','' +'PF3234','ZUG WECHSELN 1 RSM 27','LDT-GN-LED ','=A01+UC202-KF03Q','','','','' +'SF3212','ZUG WECHSELN 1 RSM 26','LDT-GN-NO','=A01+UC202-KF01i','-UZ3300','-UZ3300','','' +'PF3230','ZUG WECHSELN 1 RSM 26','LDT-GN-LED ','=A01+UC202-KF03Q','','','','' +'SF3210','ZUG WECHSELN 1 RSM 25','LDT-GN-NO','=A01+UC202-KF01i','-UZ3210','-UZ3210','','' +'PF3224','ZUG WECHSELN 1 RSM 25','LDT-GN-LED ','=A01+UC202-KF02Q','','','','' +'SF3206','ZUG WECHSELN 1 RSM 24','LDT-GN-NO','=A01+UC202-KF00i','-UZ3206','-UZ3206','','' +'PF3220','ZUG WECHSELN 1 RSM 24','LDT-GN-LED ','=A01+UC202-KF02Q','','','','' +'SF3204','ZUG WECHSELN 1 RSM 23','LDT-GN-NO','=A01+UC202-KF00i','-UZ3204','-UZ3204','','' +'PF3210','ZUG WECHSELN 1 RSM 23','LDT-GN-LED ','=A01+UC202-KF01Q','','','','' +'SF3202','ZUG WECHSELN 1 RSM 22','LDT-GN-NO','=A01+UC202-KF00i','-UZ3202','-UZ3202','','' +'PF3204','ZUG WECHSELN 1 RSM 22','LDT-GN-LED ','=A01+UC202-KF00Q','','','','' +'SF3200','ZUG WECHSELN 1 RSM 21','LDT-GN-NO','=A01+UC202-KF00i','-UZ3200','-UZ3200','','' +'PF3200','ZUG WECHSELN 1 RSM 21','LDT-GN-LED ','=A01+UC202-KF00Q','','','','' +'SF3126','ZUG WECHSELN 1 RSM 20','LDT-GN-NO','=A01+UC201-KF02i','-UZ3122','-UZ3122','','' +'PF3150','ZUG WECHSELN 1 RSM 20','LDT-GN-LED ','=A01+UC201-KF05Q','','','','' +'SF3124','ZUG WECHSELN 1 RSM 19','LDT-GN-NO','=A01+UC201-KF02i','-UZ3120','-UZ3120','','' +'PF3144','ZUG WECHSELN 1 RSM 19','LDT-GN-LED ','=A01+UC201-KF04Q','','','','' +'SF3122','ZUG WECHSELN 1 RSM 18','LDT-GN-NO','=A01+UC201-KF02i','-UZ3116','-UZ3116','','' +'PF3140','ZUG WECHSELN 1 RSM 18','LDT-GN-LED ','=A01+UC201-KF04Q','','','','' +'SF3120','ZUG WECHSELN 1 RSM 17','LDT-GN-NO','=A01+UC201-KF02i','-UZ3120','-UZ3102','','' +'PF3134','ZUG WECHSELN 1 RSM 17','LDT-GN-LED ','=A01+UC201-KF03Q','','','','' +'SF3112','ZUG WECHSELN 1 RSM 16','LDT-GN-NO','=A01+UC201-KF01i','-UZ3112','-UZ3112','','' +'PF3130','ZUG WECHSELN 1 RSM 16','LDT-GN-LED ','=A01+UC201-KF03Q','','','','' +'SF3110','ZUG WECHSELN 1 RSM 15','LDT-GN-NO','=A01+UC201-KF01i','-UZ3110','-UZ3110','','' +'PF3124','ZUG WECHSELN 1 RSM 15','LDT-GN-LED ','=A01+UC201-KF02Q','','','','' +'SF3106','ZUG WECHSELN 1 RSM 14','LDT-GN-NO','=A01+UC201-KF00i','-UZ3106','-UZ3106','','' +'PF3120','ZUG WECHSELN 1 RSM 14','LDT-GN-LED ','=A01+UC201-KF02Q','','','','' +'SF3104','ZUG WECHSELN 1 RSM 13','LDT-GN-NO','=A01+UC201-KF00i','-UZ3104','-UZ3104','','' +'PF3110','ZUG WECHSELN 1 RSM 13','LDT-GN-LED ','=A01+UC201-KF01Q','','','','' +'SF3102','ZUG WECHSELN 1 RSM 12','LDT-GN-NO','=A01+UC201-KF00i','-UZ3102','-UZ3102','','' +'PF3104','ZUG WECHSELN 1 RSM 12','LDT-GN-LED ','=A01+UC201-KF00Q','','','','' +'SF3100','ZUG WECHSELN 1 RSM 11','LDT-GN-NO','=A01+UC201-KF00i','-UZ3100','-UZ3100','','' +'PF3100','ZUG WECHSELN 1 RSM 11','LDT-GN-LED ','=A01+UC201-KF00Q','','','','' +'SF3026','ZUG WECHSELN 1 RSM 10','LDT-GN-NO','=A01+UC200-KF02i','-UZ3026','-UZ3026','','' +'PF3054','ZUG WECHSELN 1 RSM 10','LDT-GN-LED ','=A01+UC200-KF05Q','','','','' +'SF3024','ZUG WECHSELN 1 RSM 9','LDT-GN-NO','=A01+UC200-KF02i','-UZ3024','-UZ3024','','' +'PF3050','ZUG WECHSELN 1 RSM 9','LDT-GN-LED ','=A01+UC200-KF05Q','','','','' +'SF3022','ZUG WECHSELN 1 RSM 8','LDT-GN-NO','=A01+UC200-KF02i','-UZ3022','-UZ3022','','' +'PF3044','ZUG WECHSELN 1 RSM 8','LDT-GN-LED ','=A01+UC200-KF04Q','','','','' +'SF3020','ZUG WECHSELN 1 RSM 7','LDT-GN-NO','=A01+UC200-KF02i','-UZ3020','-UZ3020','','' +'PF3040','ZUG WECHSELN 1 RSM 7','LDT-GN-LED ','=A01+UC200-KF04Q','','','','' +'SF3012','ZUG WECHSELN 1 RSM 6','LDT-GN-NO','=A01+UC200-KF01i','-UZ3012','-UZ3012','','' +'PF3030','ZUG WECHSELN 1 RSM 6','LDT-GN-LED ','=A01+UC200-KF03Q','','','','' +'SF3010','ZUG WECHSELN 1 RSM 5','LDT-GN-NO','=A01+UC200-KF01i','-UZ3010','-UZ3010','','' +'PF3024','ZUG WECHSELN 1 RSM 5','LDT-GN-LED ','=A01+UC200-KF02Q','','','','' +'SF3006','ZUG WECHSELN 1 RSM 4','LDT-GN-NO','=A01+UC200-KF00i','-UZ3006','-UZ3006','','' +'PF3020','ZUG WECHSELN 1 RSM 4','LDT-GN-LED ','=A01+UC200-KF02Q','','','','' +'SF3004','ZUG WECHSELN 1 RSM 3','LDT-GN-NO','=A01+UC200-KF00i','-UZ3004','-UZ3004','','' +'PF3010','ZUG WECHSELN 1 RSM 3','LDT-GN-LED ','=A01+UC200-KF01Q','','','','' +'SF3002','ZUG WECHSELN 1 RSM 2','LDT-GN-NO','=A01+UC200-KF00i','-UZ3002','-UZ3002','','' +'PF3004','ZUG WECHSELN 1 RSM 2','LDT-GN-LED ','=A01+UC200-KF00Q','','','','' +'SF3000','ZUG WECHSELN 1 RSM 1','LDT-GN-NO','=A01+UC200-KF00i','-UZ3000','-UZ3000','','' +'PF3000','ZUG WECHSELN 1 RSM 1','LDT-GN-LED ','=A01+UC200-KF00Q','','','','' +'MB3225','WEICHE 1 ABZWEIG RSM 26','SW1 RSM 25','=A01+UC202-KF02Q','','','','' +'QA3057','ANTRIEB 1 AUSFAHREN RSM 10','RA-BI','=A01+UC200-KF05Q','','','','' +'MA3056','ANTRIEB 1 EINFAHREN RSM 10','RA-BI','=A01+UC200-KF05Q','','','','A' +'BG3027','SENSOR OPTISCH 1 RSM 10','OPT. AP110','=A01+UC200-KF02i','','','','' +'MB3055','WEICHE 1 ABZWEIG RSM 10','SW1 RSM 10','=A01+UC200-KF05Q','','','','' +'MB3231','WEICHE 1 ABZWEIG RSM 26','SW1 RSM 26','=A01+UC202-KF03Q','','','','' +'MB3235','WEICHE 1 ABZWEIG RSM 27','SW1 RSM 27','=A01+UC202-KF03Q','','','','' +'QA3243','ANTRIEB 1 AUSFAHREN RSM 28','RA-BI','=A01+UC202-KF04Q','','','','' +'MA3242','ANTRIEB 1 EINFAHREN RSM 28','RA-BI','=A01+UC202-KF04Q','','','','A' +'BG3223','SENSOR OPTISCH 1 RSM 28','OPT. AP110','=A01+UC202-KF02i','','','','' +'QA3237','ANTRIEB 1 AUSFAHREN RSM 27','RA-BI','=A01+UC202-KF03Q','','','','' +'MA3236','ANTRIEB 1 EINFAHREN RSM 27','RA-BI','=A01+UC202-KF03Q','','','','A' +'BG3221','SENSOR OPTISCH 1 RSM 27','OPT. AP110','=A01+UC202-KF02i','','','','' +'QA3233','ANTRIEB 1 AUSFAHREN RSM 26','RA-BI','=A01+UC202-KF03Q','','','','' +'MA3232','ANTRIEB 1 EINFAHREN RSM 26','RA-BI','=A01+UC202-KF03Q','','','','A' +'BG3213','SENSOR OPTISCH 1 RSM 26','OPT. AP110','=A01+UC202-KF01i','','','','' +'QA3227','ANTRIEB 1 AUSFAHREN RSM 25','RA-BI','=A01+UC202-KF02Q','','','','' +'MA3226','ANTRIEB 1 EINFAHREN RSM 25','RA-BI','=A01+UC202-KF02Q','','','','A' +'BG3211','SENSOR OPTISCH 1 RSM 25','OPT. AP110','=A01+UC202-KF01i','','','','' +'QA3223','ANTRIEB 1 AUSFAHREN RSM 24','RA-BI','=A01+UC202-KF02Q','','','','' +'MA3222','ANTRIEB 1 EINFAHREN RSM 24','RA-BI','=A01+UC202-KF02Q','','','','A' +'BG3207','SENSOR OPTISCH 1 RSM 24','OPT. AP110','=A01+UC202-KF00i','','','','' +'QA3213','ANTRIEB 1 AUSFAHREN RSM 23','RA-BI','=A01+UC202-KF01Q','','','','' +'MA3212','ANTRIEB 1 EINFAHREN RSM 23','RA-BI','=A01+UC202-KF01Q','','','','A' +'BG3205','SENSOR OPTISCH 1 RSM 23','OPT. AP110','=A01+UC202-KF00i','','','','' +'QA3207','ANTRIEB 1 AUSFAHREN RSM 22','RA-BI','=A01+UC202-KF00Q','','','','' +'MA3206','ANTRIEB 1 EINFAHREN RSM 22','RA-BI','=A01+UC202-KF00Q','','','','A' +'BG3203','SENSOR OPTISCH 1 RSM 22','OPT. AP110','=A01+UC202-KF00i','','','','' +'QA3203','ANTRIEB 1 AUSFAHREN RSM 21','RA-BI','=A01+UC202-KF00Q','','','','' +'MA3202','ANTRIEB 1 EINFAHREN RSM 21','RA-BI','=A01+UC202-KF00Q','','','','A' +'BG3201','SENSOR OPTISCH 1 RSM 21','OPT. AP110','=A01+UC202-KF00i','','','','' +'MB3221','WEICHE 1 ABZWEIG RSM 24','SW1 RSM 24','=A01+UC202-KF02Q','','','','' +'MB3211','WEICHE 1 ABZWEIG RSM 23','SW1 RSM 23','=A01+UC202-KF01Q','','','','' +'MB3205','WEICHE 1 ABZWEIG RSM 22','SW1 RSM 22','=A01+UC202-KF00Q','','','','' +'MB3201','WEICHE 1 ABZWEIG RSM 21','SW1 RSM 21','=A01+UC202-KF00Q','','','','' +'QA3153','ANTRIEB 1 AUSFAHREN RSM 20','RA-BI','=A01+UC201-KF05Q','','','','' +'MA3152','ANTRIEB 1 EINFAHREN RSM 20','RA-BI','=A01+UC201-KF05Q','','','','A' +'BG3127','SENSOR OPTISCH 1 RSM 20','OPT. AP110','=A01+UC201-KF02i','','','','' +'QA3147','ANTRIEB 1 AUSFAHREN RSM 19','RA-BI','=A01+UC201-KF04Q','','','','' +'MA3146','ANTRIEB 1 EINFAHREN RSM 19','RA-BI','=A01+UC201-KF04Q','','','','A' +'BG3125','SENSOR OPTISCH 1 RSM 19','OPT. AP110','=A01+UC201-KF02i','','','','' +'QA3143','ANTRIEB 1 AUSFAHREN RSM 18','RA-BI','=A01+UC201-KF04Q','','','','' +'MA3142','ANTRIEB 1 EINFAHREN RSM 18','RA-BI','=A01+UC201-KF04Q','','','','A' +'BG3123','SENSOR OPTISCH 1 RSM 18','OPT. AP110','=A01+UC201-KF02i','','','','' +'QA3137','ANTRIEB 1 AUSFAHREN RSM 17','RA-BI','=A01+UC201-KF03Q','','','','' +'MA3136','ANTRIEB 1 EINFAHREN RSM 17','RA-BI','=A01+UC201-KF03Q','','','','A' +'BG3121','SENSOR OPTISCH 1 RSM 17','OPT. AP110','=A01+UC201-KF02i','','','','' +'QA3133','ANTRIEB 1 AUSFAHREN RSM 16','RA-BI','=A01+UC201-KF03Q','','','','' +'MA3132','ANTRIEB 1 EINFAHREN RSM 16','RA-BI','=A01+UC201-KF03Q','','','','A' +'BG3113','SENSOR OPTISCH 1 RSM 16','OPT. AP110','=A01+UC201-KF01i','','','','' +'QA3127','ANTRIEB 1 AUSFAHREN RSM 15','RA-BI','=A01+UC201-KF02Q','','','','' +'MA3126','ANTRIEB 1 EINFAHREN RSM 15','RA-BI','=A01+UC201-KF02Q','','','','A' +'BG3111','SENSOR OPTISCH 1 RSM 15','OPT. AP110','=A01+UC201-KF01i','','','','' +'QA3123','ANTRIEB 1 AUSFAHREN RSM 14','RA-BI','=A01+UC201-KF02Q','','','','' +'MA3122','ANTRIEB 1 EINFAHREN RSM 14','RA-BI','=A01+UC201-KF02Q','','','','A' +'BG3107','SENSOR OPTISCH 1 RSM 14','OPT. AP110','=A01+UC201-KF00i','','','','' +'QA3113','ANTRIEB 1 AUSFAHREN RSM 13','RA-BI','=A01+UC201-KF01Q','','','','' +'MA3112','ANTRIEB 1 EINFAHREN RSM 13','RA-BI','=A01+UC201-KF01Q','','','','A' +'BG3105','SENSOR OPTISCH 1 RSM 13','OPT. AP110','=A01+UC201-KF00i','','','','' +'QA3107','ANTRIEB 1 AUSFAHREN RSM 12','RA-BI','=A01+UC201-KF00Q','','','','' +'MA3106','ANTRIEB 1 EINFAHREN RSM 12','RA-BI','=A01+UC201-KF00Q','','','','A' +'BG3103','SENSOR OPTISCH 1 RSM 12','OPT. AP110','=A01+UC201-KF00i','','','','' +'QA3103','ANTRIEB 1 AUSFAHREN RSM 11','RA-BI','=A01+UC201-KF00Q','','','','' +'MA3102','ANTRIEB 1 EINFAHREN RSM 11','RA-BI','=A01+UC201-KF00Q','','','','A' +'BG3101','SENSOR OPTISCH 1 RSM 11','OPT. AP110','=A01+UC201-KF00i','','','','' +'MB3145','WEICHE 1 ABZWEIG RSM 19','SW1 RSM 19','=A01+UC201-KF04Q','','','','' +'MB3141','WEICHE 1 ABZWEIG RSM 18','SW1 RSM 18','=A01+UC201-KF04Q','','','','' +'MB3135','WEICHE 1 ABZWEIG RSM 17','SW1 RSM 17','=A01+UC201-KF03Q','','','','' +'MB3131','WEICHE 1 ABZWEIG RSM 16','SW1 RSM 16','=A01+UC201-KF03Q','','','','' +'MB3125','WEICHE 1 ABZWEIG RSM 15','SW1 RSM 15','=A01+UC201-KF02Q','','','','' +'MB3121','WEICHE 1 ABZWEIG RSM 14','SW1 RSM 14','=A01+UC201-KF02Q','','','','' +'MB3111','WEICHE 1 ABZWEIG RSM 13','SW1 RSM 13','=A01+UC201-KF01Q','','','','' +'MB3105','WEICHE 1 ABZWEIG RSM 12','SW1 RSM 12','=A01+UC201-KF00Q','','','','' +'MB3101','WEICHE 1 ABZWEIG RSM 11','SW1 RSM 11','=A01+UC201-KF00Q','','','','' +'QA3053','ANTRIEB 1 AUSFAHREN RSM 9','RA-BI','=A01+UC200-KF05Q','','','','' +'MA3052','ANTRIEB 1 EINFAHREN RSM 9','RA-BI','=A01+UC200-KF05Q','','','','A' +'BG3025','SENSOR OPTISCH 1 RSM 9','OPT. AP110','=A01+UC200-KF02i','','','','' +'QA3047','ANTRIEB 1 AUSFAHREN RSM 8','RA-BI','=A01+UC200-KF04Q','','','','' +'MA3046','ANTRIEB 1 EINFAHREN RSM 8','RA-BI','=A01+UC200-KF04Q','','','','A' +'BG3023','SENSOR OPTISCH 1 RSM 8','OPT. AP110','=A01+UC200-KF02i','','','','' +'QA3043','ANTRIEB 1 AUSFAHREN RSM 7','RA-BI','=A01+UC200-KF04Q','','','','' +'MA3042','ANTRIEB 1 EINFAHREN RSM 7','RA-BI','=A01+UC200-KF04Q','','','','A' +'BG3021','SENSOR OPTISCH 1 RSM 7','OPT. AP110','=A01+UC200-KF02i','','','','' +'QA3033','ANTRIEB 1 AUSFAHREN RSM 6','RA-BI','=A01+UC200-KF03Q','','','','' +'MA3032','ANTRIEB 1 EINFAHREN RSM 6','RA-BI','=A01+UC200-KF03Q','','','','A' +'BG3013','SENSOR OPTISCH 1 RSM 6','OPT. AP110','=A01+UC200-KF01i','','','','' +'QA3027','ANTRIEB 1 AUSFAHREN RSM 5','RA-BI','=A01+UC200-KF02Q','','','','' +'MA3026','ANTRIEB 1 EINFAHREN RSM 5','RA-BI','=A01+UC200-KF02Q','','','','A' +'BG3011','SENSOR OPTISCH 1 RSM 5','OPT. AP110','=A01+UC200-KF01i','','','','' +'QA3023','ANTRIEB 1 AUSFAHREN RSM 4','RA-BI','=A01+UC200-KF02Q','','','','' +'MA3022','ANTRIEB 1 EINFAHREN RSM 4','RA-BI','=A01+UC200-KF02Q','','','','A' +'BG3007','SENSOR OPTISCH 1 RSM 4','OPT. AP110','=A01+UC200-KF00i','','','','' +'QA3013','ANTRIEB 1 AUSFAHREN RSM 3','RA-BI','=A01+UC200-KF01Q','','','','' +'MA3012','ANTRIEB 1 EINFAHREN RSM 3','RA-BI','=A01+UC200-KF01Q','','','','A' +'BG3005','SENSOR OPTISCH 1 RSM 3','OPT. AP110','=A01+UC200-KF00i','','','','' +'QA3007','ANTRIEB 1 AUSFAHREN RSM 2','RA-BI','=A01+UC200-KF00Q','','','','' +'MA3006','ANTRIEB 1 EINFAHREN RSM 2','RA-BI','=A01+UC200-KF00Q','','','','A' +'BG3003','SENSOR OPTISCH 1 RSM 2','OPT. AP110','=A01+UC200-KF00i','','','','' +'QA3003','ANTRIEB 1 AUSFAHREN RSM 1','RA-BI','=A01+UC200-KF00Q','','','','' +'MA3002','ANTRIEB 1 EINFAHREN RSM 1','RA-BI','=A01+UC200-KF00Q','','','','A' +'BG3001','SENSOR OPTISCH 1 RSM 1 ','OPT. AP110','=A01+UC200-KF00i','','','','' +'MB3051','WEICHE 1 ABZWEIG RSM 9','SW1 RSM 09','=A01+UC200-KF05Q','','','','' +'MB3045','WEICHE 1 ABZWEIG RSM 8','SW1 RSM 08','=A01+UC200-KF04Q','','','','' +'MB3031','WEICHE 1 ABZWEIG RSM 6','SW1 RSM 06','=A01+UC200-KF03Q','','','','' +'MB3041','WEICHE 1 ABZWEIG RSM 7','SW1 RSM 07','=A01+UC200-KF04Q','','','','' +'MB3025','WEICHE 1 ABZWEIG RSM 5','SW1 RSM 05','=A01+UC200-KF02Q','','','','' +'MB3021','WEICHE 1 ABZWEIG RSM 4','SW1 RSM 04','=A01+UC200-KF02Q','','','','' +'MB3011','WEICHE 1 ABZWEIG RSM 3','SW1 RSM 03','=A01+UC200-KF01Q','','','','' +'MB3005','WEICHE 1 ABZWEIG RSM 2','SW1 RSM 02','=A01+UC200-KF00Q','','','','' +'MB1240','WEICHE ABZWEIG EINFAHRT FLYER 4 ','SW ENTER RF 4','=A01+UC102-KF00Q','','','','' +'MB1242','WEICHE ABZWEIG EINFAHRT F402 FLYER 4','SW F0402 ','=A01+UC102-KF00Q','','','','' +'QA1111','ANTRIEB NACHPUFFER F0202 FLYER 2','M-BI-RI','=A01+UC101-KF03Q','','','','' +'QA1101','ANTRIEB PUFFER F0202 FLYER 2','M-BI-RI','=A01+UC101-KF02Q','','','','' +'MA1100','ANTRIEB PUFFER F0201 FLYER 2','M-BI-LE','=A01+UC101-KF02Q','','','','' +'QA1265','ANTRIEB HAUPTSTECKE RF 5 ','M-BI-RF ','=A01+UC102-KF02Q','','','','' +'MA1264','ANTRIEB HAUPTSTECKE RF 5','M-BI-RF ','=A01+UC102-KF02Q','','','','' +'MA1276','ANTRIEB EIN-AUSFAHRT PUFFERSTRECKE RF 4','M-BI-RF 5','=A01+UC102-KF03Q','','','','' +'MB1257','WEICHE ABZWEIG KREUZUNGSWEICHE FLYER 4','SW RF 4','=A01+UC102-KF01Q','','','','' +'MB1283','WEICHE ABZWEIG AUSFAHRT NACHP. RF5','SW EXIT RF5','=A01+UC102-KF04Q','','','','' +'QA1305','ANTRIEB HAUPTSTECKE RF 5 ','M RF -> RSM','=A01+UC102-KF06Q','','','','' +'MA1304','ANTRIEB HAUPTSTECKE RF 5 ','M RSM -> RF','=A01+UC102-KF06Q','','','','' +'MA1272','ANTRIEB EIN-AUSFAHRT PUFFERSTRECKE RF 5','M-BI-RF 5','=A01+UC102-KF03Q','','','','' +'MB1274','ANPRESSEN NACHPUFFER F0401 FLYER 4','PRESS F0401','=A01+UC102-KF03Q','','','','' +'MB1275','ANPRESSEN NACHPUFFER F0402 FLYER 4','PRESS F0402','=A01+UC102-KF03Q','','','','' +'QA1271','ANTRIEB NACHPUFFER F0402 FLYER 4','M-BI-RI','=A01+UC102-KF03Q','','','','' +'MA1270','ANTRIEB NACHPUFFER F0401 FLYER 4','M-BI-LE','=A01+UC102-KF03Q','','','','' +'MB1244','ANPRESSEN PUFFER F0401 FLYER 4','PRESS F0401','=A01+UC102-KF00Q','','','','' +'MB1245','ANPRESSEN PUFFER F0402 FLYER 4','PRESS F0402','=A01+UC102-KF00Q','','','','' +'QA1261','ANTRIEB PUFFER F0402 FLYER 4','M-BI-RI','=A01+UC102-KF02Q','','','','' +'MA1260','ANTRIEB PUFFER F0401 FLYER 4','M-BI-LE','=A01+UC102-KF02Q','','','','' +'SF1251','HAUPTSCHALTER EIN +UC102','I-MS ON','=A01+UC102-KF01i','HAUPTSCHALTER EIN','MAIN SWITCH ON','','' +'SF1250','MOTORSCHUTZSCHALTER HAT AUSGELÖST','I-CB OK','=A01+UC102-KF01i','MSS IN ORDNUNG','MPS OK','','' +'PF1250','LM-ÜBERSTROM +UC102','IL-YE-LED','=A01+UC102-KF01Q','LM ÜBERSTROM','IL OVERCURRENT','','' +'KF1255','IF RF 04: START SPULENWECHSEL 2','IF-RELAIS','=A01+UC102-KF01Q','IF RF 04: START SPULENWECHSEL 2','IF RF 04: START EXCHANGE 2','','' +'DI1254','IF RF 04 : NEUE SPULE','IF-RELAIS','=A01+UC102-KF01i','IF RF 04: NEUE SPULE ','IF RF 04: NEW BOBBIN','','' +'KF1254','IF RF 04: START SPULENWECHSEL 1','IF-RELAIS','=A01+UC102-KF01Q','IF RF 04: START SPULENWECHSEL 1','IF RF 04: START EXCHANGE 1','','' +'PF1247','RUNDUMLEUCHTE STÖRUNG FLYER 4','LED-YE_FAULT','=A01+UC102-KF00Q','','','','' +'SF1253','RESET FLYER 4','IPB-YE-NO','=A01+UC102-KF01i','RESET','RESET','RESET','' +'PF1253','RESET FLYER 4','IPB-YE-LED','=A01+UC102-KF01Q','','','','' +'SF1252','NOT HALT FLYER 4','EPB-NC','=A01+UC102-KF01i','NOT-HALT','E-STOP','E-STOP','' +'MB1267','WEICHE ABZWEIG EINFAHRT NACHP. RF 4','SW-BRANCH','=A01+UC102-KF02Q','','','','' +'MB1266','WEICHE ABZWEIG EINFAHRT NACHP. RF 4','SW-STRAIGHT','=A01+UC102-KF02Q','','','','' +'BG1255','SENSOR SPULE IN POSITION PM 4','BOBBIN IN POS','=A01+UC102-KF01i','','','','' +'BG1243','SENSOR ZUG IN DOFFER PM 4','LT-TRAIN IN DOF','=A01+UC102-KF00i','','','','' +'BG1256','SENSOR SPULE IN POSITION FLYER 4','BOBBIN IN POS','=A01+UC102-KF01i','','','','' +'BG1244','SENSOR ZUG IN DOFFER FLYER 4 ','LT-TRAIN IN DOF','=A01+UC102-KF00i','','','','' +'MB1251','ABHEBEN ANTRIEBE FLYER 4','LIFT OFF BS 4','=A01+UC102-KF01Q','','','','' +'MA1256','ANTRIEBE FLYER 4','M-BI','=A01+UC102-KF01Q','','','','' +'MB1307','WEICHE ABZWEIG EINFAHRT NACHP. RF 5','SW-BRANCH','=A01+UC102-KF06Q','','','','' +'MB1306','WEICHE ABZWEIG EINFAHRT NACHP. RF 5','SW-STRAIGHT','=A01+UC102-KF06Q','','','','' +'KF1295','IF RF 05: START SPULENWECHSEL 2','IF-RELAIS','=A01+UC102-KF05Q','IF RF 05: START SPULENWECHSEL 2','IF RF 05: START EXCHANGE 2','','' +'DI1294','IF RF 05 : NEUE SPULE','IF-RELAIS','=A01+UC102-KF04i','IF RF 05: NEUE SPULE ','IF RF 05: NEW BOBBIN','','' +'KF1294','IF RF 05: START SPULENWECHSEL 1','IF-RELAIS','=A01+UC102-KF05Q','IF RF 05: START SPULENWECHSEL 1','IF RF 05: START EXCHANGE 1','','' +'PF1287','RUNDUMLEUCHTE STÖRUNG FLYER 5','LED-YE_FAULT','=A01+UC102-KF04Q','','','','' +'SF1293','RESET FLYER 5','IPB-YE-NO','=A01+UC102-KF04i','RESET','RESET','RESET','' +'PF1293','RESET FLYER 5','IPB-YE-LED','=A01+UC102-KF05Q','','','','' +'SF1292','NOT HALT FLYER 5','EPB-NC','=A01+UC102-KF04i','NOT-HALT','E-STOP','E-STOP','' +'BG1296','SENSOR SPULE IN POSITION FLYER 5','BOBBIN IN POS','=A01+UC102-KF04i','','','','' +'BG1284','SENSOR ZUG IN DOFFER FLYER 5','LT-TRAIN IN DOF','=A01+UC102-KF03i','','','','' +'BG1295','SENSOR SPULE IN POSITION PM 5','BOBBIN IN POS','=A01+UC102-KF04i','','','','' +'BG1283','SENSOR ZUG IN DOFFER PM 5','LT-TRAIN IN DOF','=A01+UC102-KF03i','','','','' +'MB1291','ABHEBEN ANTRIEBE FLYER 5','LIFT OFF BS 5','=A01+UC102-KF05Q','','','','' +'MA1296','ANTRIEBE FLYER 5','M-BI','=A01+UC102-KF05Q','','','','' +'BG1281','SENSOR AUSFAHRT PUFFER F0502 FLYER 5','LT-EXIT F0502','=A01+UC102-KF03i','','','','' +'BG1280','SENSOR AUSFAHRT PUFFER F0501 FLYER 5','LT-EXIT F0501','=A01+UC102-KF03i','','','','' +'MB1314','ANPRESSEN NACHPUFFER F0501 FLYER 5','PRESS F0501','=A01+UC102-KF07Q','','','','' +'MB1315','ANPRESSEN NACHPUFFER F0502 FLYER 5','PRESS F0502','=A01+UC102-KF07Q','','','','' +'QA1311','ANTRIEB NACHPUFFER F0502 FLYER 5','M-BI-RI','=A01+UC102-KF07Q','','','','' +'MA1310','ANTRIEB NACHPUFFER F0501 FLYER 5','M-BI-LE','=A01+UC102-KF07Q','','','','' +'MB1284','ANPRESSEN PUFFER F0501 FLYER 5','PRESS F0501','=A01+UC102-KF04Q','','','','' +'MB1285','ANPRESSEN PUFFER F0502 FLYER 5','PRESS F0502','=A01+UC102-KF04Q','','','','' +'QA1301','ANTRIEB PUFFER F0502 FLYER 5','M-BI-RI','=A01+UC102-KF06Q','','','','' +'MA1300','ANTRIEB PUFFER F0501 FLYER 5','M-BI-LE','=A01+UC102-KF06Q','','','','' +'MB1602','WEICHE ABZWEIG EINFAHRT F1001-F1002 FLYER 10','SW ENTER F1001','=A01+UC105-KF00Q','','','','' +'MB1601','WEICHE ABZWEIG EINFAHRT PUFFER F1001 FLYER 10','SW ENTER RF 10','=A01+UC105-KF00Q','','','','' +'BG1606','SENSOR AUSFAHRT NACHPUFFER F1002 RF 10','LT-EXIT F1002','=A01+UC105-KF00i','','','','' +'BG1605','SENSOR AUSFAHRT NACHPUFFER F1001 RF 10','LT-EXIT F1001','=A01+UC105-KF00i','','','','' +'QA1625','ANTRIEB HAUPTSTECKE RF 10 ','M RF 10','=A01+UC105-KF02Q','','','','' +'MA1624','ANTRIEB HAUPTSTECKE RF 10 ','M RF 10','=A01+UC105-KF02Q','','','','' +'MB1634','ANPRESSEN NACHPUFFER F1001 FLYER 10','PRESS F1001','=A01+UC105-KF03Q','','','','' +'MB1635','ANPRESSEN NACHPUFFER F1002 FLYER 10','PRESS F1002','=A01+UC105-KF03Q','','','','' +'QA1631','ANTRIEB NACHPUFFER F1001 RF 10','M-BI-LE','=A01+UC105-KF03Q','','','','' +'MA1630','ANTRIEB NACHPUFFER F1001 RF 10','M-BI-RI','=A01+UC105-KF03Q','','','','' +'MB1604','ANPRESSEN PUFFER F1001 FLYER 10','PRESS F1001','=A01+UC105-KF00Q','','','','' +'MB1605','ANPRESSEN PUFFER F1002 FLYER 10','PRESS F1002','=A01+UC105-KF00Q','','','','' +'QA1621','ANTRIEB PUFFER F1002 FLYER 10','M-BI-RI','=A01+UC105-KF02Q','','','','' +'MA1620','ANTRIEB PUFFER F1001 FLYER 10','M-BI-LE','=A01+UC105-KF02Q','','','','' +'MB1627','WEICHE ABZWEIG EINFAHRT NACHP. RF 10','SW-BRANCH','=A01+UC105-KF02Q','','','','' +'MB1626','WEICHE ABZWEIG EINFAHRT NACHP. RF 10','SW-STRAIGHT','=A01+UC105-KF02Q','','','','' +'BG1601','SENSOR AUSFAHRT PUFFER F1002 FLYER 10','LT-EXIT F1002','=A01+UC105-KF00i','','','','' +'BG1600','SENSOR AUSFAHRT PUFFER F1001 FLYER 10','LT-EXIT F1001','=A01+UC105-KF00i','','','','' +'BG1616','SENSOR SPULE IN POSITION FLYER 10','BOBBIN IN POS','=A01+UC105-KF01i','','','','' +'BG1604','SENSOR ZUG IN DOFFER FLYER 10','LT-TRAIN IN DOF','=A01+UC105-KF00i','','','','' +'BG1615','SENSOR SPULE IN POSITION PM 10','BOBBIN IN POS','=A01+UC105-KF01i','','','','' +'BG1603','SENSOR ZUG IN DOFFER PM 10','LT-TRAIN IN DOF','=A01+UC105-KF00i','','','','' +'MB1611','ABHEBEN ANTRIEBE FLYER 10','LIFT OFF BS 10','=A01+UC105-KF01Q','','','','' +'MA1616','ANTRIEB FLYER 10 ','M-BI','=A01+UC105-KF01Q','','','','' +'SF1611','HAUPTSCHALTER EIN +UC105','I-MS ON','=A01+UC105-KF01i','HAUPTSCHALTER EIN','MAIN SWITCH ON','','' +'SF1610','MOTORSCHUTZSCHALTER HAT AUSGELÖST','I-CB OK','=A01+UC105-KF01i','MSS IN ORDNUNG','MPS OK','','' +'PF1610','LM-ÜBERSTROM +UC105','IL-YE-LED','=A01+UC105-KF01Q','LM ÜBERSTROM','IL OVERCURRENT','','' +'KF1615','IF RF 10: START SPULENWECHSEL 2','IF-RELAIS','=A01+UC105-KF01Q','IF RF 10: START SPULENWECHSEL 2','IF RF 10: START EXCHANGE 2','','' +'DI1614','IF RF 10 : NEUE SPULE','IF-RELAIS','=A01+UC105-KF01i','IF RF 10: NEUE SPULE ','IF RF 10: NEW BOBBIN','','' +'KF1614','IF RF 10: START SPULENWECHSEL 1','IF-RELAIS','=A01+UC105-KF01Q','IF RF 10: START SPULENWECHSEL 1','IF RF 10: START EXCHANGE 1','','' +'PF1607','RUNDUMLEUCHTE STÖRUNG FLYER 10','LED-YE_FAULT','=A01+UC105-KF00Q','','','','' +'SF1613','RESET FLYER 10','IPB-YE-NO','=A01+UC105-KF01i','RESET','RESET','RESET','' +'PF1613','RESET FLYER 10','IPB-YE-LED','=A01+UC105-KF01Q','','','','' +'SF1612','NOT HALT FLYER 10','EPB-NC','=A01+UC105-KF01i','NOT-HALT','E-STOP','E-STOP','' +'QA1565','ANTRIEB HAUPTSTECKE RF 9','M-BI','=A01+UC104-KF06Q','','','','' +'MA1564','ANTRIEB HAUPTSTECKE RF 9','M-BI','=A01+UC104-KF06Q','','','','' +'QA1465','ANTRIEB HAUPTSTECKE RF 7','M-BI','=A01+UC103-KF06Q','','','','' +'MA1464','ANTRIEB HAUPTSTECKE RF 7','M-BI','=A01+UC103-KF06Q','','','','' +'SF1511','HAUPTSCHALTER EIN +UC104','I-MS ON','=A01+UC104-KF01i','HAUPTSCHALTER EIN','MAIN SWITCH ON','','' +'SF1510','MOTORSCHUTZSCHALTER HAT AUSGELÖST','I-CB OK','=A01+UC104-KF01i','MSS IN ORDNUNG','MPS OK','','' +'PF1510','LM-ÜBERSTROM +UC104','IL-YE-LED','=A01+UC104-KF01Q','LM ÜBERSTROM','IL OVERCURRENT','','' +'BG1557','SENSOR HAUPTSTR. FLYER 9','LT-ENTER RF 9','=A01+UC104-KF03i','','','','' +'BG1517','SENSOR HAUPTSTR. FLYER 8','LT-ENTER RF 8','=A01+UC104-KF01i','','','','' +'BG1505','SENSOR AUSFAHRT NACHPUFFER F0801 FLYER 8','LT-EXIT F0801','=A01+UC104-KF00i','','','','' +'BG1506','SENSOR AUSFAHRT NACHPUFFER F0802 FLYER 8','LT-EXIT F0802','=A01+UC104-KF00i','','','','' +'BG1501','SENSOR AUSFAHRT PUFFER F0802 FLYER 8','LT-EXIT F0802','=A01+UC104-KF00i','','','','' +'BG1500','SENSOR AUSFAHRT PUFFER F0801 FLYER 8','LT-EXIT F0801','=A01+UC104-KF00i','','','','' +'MB1500','WEICHE ABZWEIG EINFAHRT FLYER 8','SW ENTER RF 8','=A01+UC104-KF00Q','','','','' +'MB1501','WEICHE ABZWEIG EINFAHRT F0801-F0802 ','SW F0801-F0802','=A01+UC104-KF00Q','','','','' +'MB1503','WEICHE ABZWEIG AUSFAHRT NACHP. RF 8','SW EXIT RF 8','=A01+UC104-KF00Q','','','','' +'BG1546','SENSOR AUSFAHRT NACHPUFFER F0902 RF 9','LT-EXIT F0902','=A01+UC104-KF02i','','','','' +'BG1545','SENSOR AUSFAHRT NACHPUFFER F0901 RF 9','LT-EXIT F0901','=A01+UC104-KF02i','','','','' +'MB1543','WEICHE ABZWEIG AUSFAHRT NACHP. FLYER 9','SW EXIT RF9','=A01+UC104-KF04Q','','','','' +'MB1540','WEICHE ABZWEIG EINFAHRT FLYER 9','SW ENTER RF 9','=A01+UC104-KF04Q','','','','' +'MB1527','WEICHE ABZWEIG EINFAHRT NACHP. RF 8','SW-BRANCH','=A01+UC104-KF02Q','','','','' +'MB1526','WEICHE ABZWEIG EINFAHRT NACHP. RF 8','SW-STRAIGHT','=A01+UC104-KF02Q','','','','' +'BG1515','SENSOR SPULE IN POSITION PM 8','BOBBIN IN POS','=A01+UC104-KF01i','','','','' +'BG1503','SENSOR ZUG IN DOFFER PM 8','LT-TRAIN IN DOF','=A01+UC104-KF00i','','','','' +'BG1516','SENSOR SPULE IN POSITION FLYER 8','BOBBIN IN POS','=A01+UC104-KF01i','','','','' +'BG1504','SENSOR ZUG IN DOFFER FLYER 8','LT-TRAIN IN DOF','=A01+UC104-KF00i','','','','' +'MB1511','ABHEBEN ANTRIEBE FLYER 8','LIFT OFF BS 8','=A01+UC104-KF01Q','','','','' +'MA1516','ANTRIEBE FLYER 8','M-BI','=A01+UC104-KF01Q','','','','' +'KF1515','IF RF 08: START SPULENWECHSEL 2','IF-RELAIS','=A01+UC104-KF01Q','IF RF 08: START SPULENWECHSEL 2','IF RF 08: START EXCHANGE 2','','' +'DI1514','IF RF 08 : NEUE SPULE','IF-RELAIS','=A01+UC104-KF01i','IF RF 08: NEUE SPULE ','IF RF 08: NEW BOBBIN','','' +'KF1514','IF RF 08: START SPULENWECHSEL 1','IF-RELAIS','=A01+UC104-KF01Q','IF RF 08: START SPULENWECHSEL 1','IF RF 08: START EXCHANGE 1','','' +'PF1507','RUNDUMLEUCHTE STÖRUNG FLYER 8','LED-YE_FAULT','=A01+UC104-KF00Q','','','','' +'SF1513','RESET FLYER 8','IPB-YE-NO','=A01+UC104-KF01i','RESET','RESET','RESET','' +'PF1513','RESET FLYER 8','IPB-YE-LED','=A01+UC104-KF01Q','','','','' +'SF1512','NOT HALT FLYER 8','EPB-NC','=A01+UC104-KF01i','NOT-HALT','E-STOP','E-STOP','' +'BG1541','SENSOR AUSFAHRT PUFFER F0902 FLYER 9','LT-EXIT F0902','=A01+UC104-KF02i','','','','' +'BG1540','SENSOR AUSFAHRT PUFFER F0901 FLYER 9','LT-EXIT F0901','=A01+UC104-KF02i','','','','' +'BG1556','SENSOR SPULE IN POSITION FLYER 9','BOBBIN IN POS','=A01+UC104-KF03i','','','','' +'BG1544','SENSOR ZUG IN DOFFER FLYER 9','LT-TRAIN IN DOF','=A01+UC104-KF02i','','','','' +'BG1555','SENSOR SPULE IN POSITION PM 9','BOBBIN IN POS','=A01+UC104-KF03i','','','','' +'BG1543','SENSOR ZUG IN DOFFER PM 9','LT-TRAIN IN DOF','=A01+UC104-KF02i','','','','' +'MB1551','ABHEBEN ANTRIEBE FLYER 9','LIFT OFF BS 9','=A01+UC104-KF05Q','','','','' +'MA1556','ANTRIEBE FLYER 9','M-BI','=A01+UC104-KF05Q','','','','' +'MB1567','WEICHE ABZWEIG EINFAHRT NACHP. RF 9','SW-STRAIGHT','=A01+UC104-KF06Q','','','','' +'MB1566','WEICHE ABZWEIG EINFAHRT NACHP. RF 9','SW-BRANCH','=A01+UC104-KF06Q','','','','' +'KF1555','IF RF 09: START SPULENWECHSEL 2','IF-RELAIS','=A01+UC104-KF05Q','IF RF 09: START SPULENWECHSEL 2','IF RF 09: START EXCHANGE 2','','' +'DI1554','IF RF 09 : NEUE SPULE','IF-RELAIS','=A01+UC104-KF03i','IF RF 09: NEUE SPULE ','IF RF 09: NEW BOBBIN','','' +'KF1554','IF RF 09: START SPULENWECHSEL 1','IF-RELAIS','=A01+UC104-KF05Q','IF RF 09: START SPULENWECHSEL 1','IF RF 09: START EXCHANGE 1','','' +'PF1547','RUNDUMLEUCHTE STÖRUNG FLYER 9','LED-YE_FAULT','=A01+UC104-KF04Q','','','','' +'SF1553','RESET FLYER 9','IPB-YE-NO','=A01+UC104-KF03i','RESET','RESET','RESET','' +'PF1553','RESET FLYER 9','IPB-YE-LED','=A01+UC104-KF05Q','','','','' +'SF1552','NOT HALT FLYER 9','EPB-NC','=A01+UC104-KF03i','NOT-HALT','E-STOP','E-STOP','' +'MB1534','ANPRESSEN NACHPUFFER F0801 FLYER 8','PRESS F0801','=A01+UC104-KF03Q','','','','' +'MB1535','ANPRESSEN NACHPUFFER F0802 FLYER 8','PRESS F0802','=A01+UC104-KF03Q','','','','' +'QA1531','ANTRIEB NACHPUFFER F0802 RF 8','M-BI','=A01+UC104-KF03Q','','','','' +'MA1530','ANTRIEB NACHPUFFER F0801 RF 8','M-BI','=A01+UC104-KF03Q','','','','' +'MB1504','ANPRESSEN PUFFER F0801 FLYER 8','PRESS F0801','=A01+UC104-KF00Q','','','','' +'MB1505','ANPRESSEN PUFFER F0802 FLYER 8','PRESS F0802','=A01+UC104-KF00Q','','','','' +'QA1521','ANTRIEB PUFFER F0802 FLYER 8','M-BI-RI','=A01+UC104-KF02Q','','','','' +'MA1520','ANTRIEB PUFFER F0801 FLYER 8','M-BI-LE','=A01+UC104-KF02Q','','','','' +'MB1574','ANPRESSEN NACHPUFFER F0901 FLYER 9','PRESS F0901','=A01+UC104-KF07Q','','','','' +'MB1575','ANPRESSEN NACHPUFFER F0902 FLYER 9','PRESS F0902','=A01+UC104-KF07Q','','','','' +'QA1571','ANTRIEB NACHPUFFER F0902 FLYER 9','M-BI-LE','=A01+UC104-KF07Q','','','','' +'MA1570','ANTRIEB NACHPUFFER F0901 FLYER 9','M-BI-RI','=A01+UC104-KF07Q','','','','' +'MB1544','ANPRESSEN PUFFER F0901 FLYER 9','PRESS F0901','=A01+UC104-KF04Q','','','','' +'MB1545','ANPRESSEN PUFFER F0902 FLYER 9','PRESS F0902','=A01+UC104-KF04Q','','','','' +'QA1561','ANTRIEB PUFFER F0901 FLYER 9','M-BI-RI','=A01+UC104-KF06Q','','','','' +'MA1560','ANTRIEB PUFFER F0901 FLYER 9','M-BI-LE','=A01+UC104-KF06Q','','','','' +'SF1411','HAUPTSCHALTER EIN +UC103','I-MS ON','=A01+UC103-KF01i','HAUPTSCHALTER EIN','MAIN SWITCH ON','','' +'SF1410','MOTORSCHUTZSCHALTER HAT AUSGELÖST','I-CB OK','=A01+UC103-KF01i','MSS IN ORDNUNG','MPS OK','','' +'PF1410','LM-ÜBERSTROM +UC103','IL-YE-LED','=A01+UC103-KF01Q','LM ÜBERSTROM','IL OVERCURRENT','','' +'BG1457','SENSOR HAUPTSTR. FLYER 7','LT-ENTER RF7','=A01+UC103-KF03i','','','','' +'BG1417','SENSOR HAUPTSTR. FLYER 6','LT-ENTER RF6','=A01+UC103-KF01i','','','','' +'BG1405','SENSOR AUSFAHRT NACHPUFFER F0601 FLYER 6','LT-EXIT F0601','=A01+UC103-KF00i','','','','' +'BG1406','SENSOR AUSFAHRT NACHPUFFER F0602 FLYER 6','LT-EXIT F0602','=A01+UC103-KF00i','','','','' +'BG1401','SENSOR AUSFAHRT PUFFER F0602 FLYER 6','LT-EXIT F0602','=A01+UC103-KF00i','','','','' +'BG1400','SENSOR AUSFAHRT PUFFER F0601 FLYER 6','LT-EXIT F0601','=A01+UC103-KF00i','','','','' +'MB1400','WEICHE ABZWEIG EINFAHRT FLYER 6','SW ENTER RF6','=A01+UC103-KF00Q','','','','' +'MB1401','WEICHE ABZWEIG EINFAHRT F0601-F0602 ','SW F0601-F0602','=A01+UC103-KF00Q','','','','' +'MB1403','WEICHE ABZWEIG AUSFAHRT NACHP. RF 6','SW EXIT RF 6','=A01+UC103-KF00Q','','','','' +'BG1446','SENSOR AUSFAHRT NACHPUFFER F0702 RF 7','LT-EXIT F0702','=A01+UC103-KF02i','','','','' +'BG1445','SENSOR AUSFAHRT NACHPUFFER F0701 RF 7','LT-EXIT F0701','=A01+UC103-KF02i','','','','' +'MB1443','WEICHE ABZWEIG AUSFAHRT NACHP. FLYER 7','SW EXIT RF7','=A01+UC103-KF04Q','','','','' +'MB1440','WEICHE ABZWEIG EINFAHRT FLYER 7','SW ENTER RF7','=A01+UC103-KF04Q','','','','' +'MB1427','WEICHE ABZWEIG EINFAHRT NACHP. RF 6','SW-BRANCH','=A01+UC103-KF02Q','','','','' +'MB1426','WEICHE ABZWEIG EINFAHRT NACHP. RF 6','SW-STRAIGHT','=A01+UC103-KF02Q','','','','' +'BG1415','SENSOR SPULE IN POSITION PM 6','BOBBIN IN POS','=A01+UC103-KF01i','','','','' +'BG1403','SENSOR ZUG IN DOFFER PM 6','LT-TRAIN IN DOF','=A01+UC103-KF00i','','','','' +'BG1416','SENSOR SPULE IN POSITION FLYER 6','BOBBIN IN POS','=A01+UC103-KF01i','','','','' +'BG1404','SENSOR ZUG IN DOFFER FLYER 6','LT-TRAIN IN DOF','=A01+UC103-KF00i','','','','' +'MB1411','ABHEBEN ANTRIEBE FLYER 6','LIFT OFF BS 6','=A01+UC103-KF01Q','','','','' +'MA1416','ANTRIEBE FLYER 6','M-BI','=A01+UC103-KF01Q','','','','' +'KF1415','IF RF 06: START SPULENWECHSEL 2','IF-RELAIS','=A01+UC103-KF01Q','IF RF 06: START SPULENWECHSEL 2','IF RF 06: START EXCHANGE 2','','' +'DI1414','IF RF 06 : NEUE SPULE','IF-RELAIS','=A01+UC103-KF01i','IF RF 06: NEUE SPULE ','IF RF 06: NEW BOBBIN','','' +'KF1414','IF RF 06: START SPULENWECHSEL 1','IF-RELAIS','=A01+UC103-KF01Q','IF RF 06: START SPULENWECHSEL 1','IF RF 06: START EXCHANGE 1','','' +'PF1407','RUNDUMLEUCHTE STÖRUNG FLYER 6','LED-YE_FAULT','=A01+UC103-KF00Q','','','','' +'SF1413','RESET FLYER 6','IPB-YE-NO','=A01+UC103-KF01i','RESET','RESET','RESET','' +'PF1413','RESET FLYER 6','IPB-YE-LED','=A01+UC103-KF01Q','','','','' +'SF1412','NOT HALT FLYER 6','EPB-NC','=A01+UC103-KF01i','NOT-HALT','E-STOP','E-STOP','' +'BG1441','SENSOR AUSFAHRT PUFFER F0702 FLYER 7','LT-EXIT F0702','=A01+UC103-KF02i','','','','' +'BG1440','SENSOR AUSFAHRT PUFFER F0701 FLYER 7','LT-EXIT F0701','=A01+UC103-KF02i','','','','' +'BG1456','SENSOR SPULE IN POSITION FLYER 7','BOBBIN IN POS','=A01+UC103-KF03i','','','','' +'BG1444','SENSOR ZUG IN DOFFER FLYER 7','LT-TRAIN IN DOF','=A01+UC103-KF02i','','','','' +'BG1455','SENSOR SPULE IN POSITION PM 7','BOBBIN IN POS','=A01+UC103-KF03i','','','','' +'BG1443','SENSOR ZUG IN DOFFER PM 7','LT-TRAIN IN DOF','=A01+UC103-KF02i','','','','' +'MB1451','ABHEBEN ANTRIEBE FLYER 7','LIFT OFF BS 7','=A01+UC103-KF05Q','','','','' +'MA1456','ANTRIEBE FLYER 7','M-BI','=A01+UC103-KF05Q','','','','' +'MB1467','WEICHE ABZWEIG EINFAHRT NACHP. RF7','SW-STRAIGHT','=A01+UC103-KF06Q','','','','' +'MB1466','WEICHE ABZWEIG EINFAHRT NACHP. RF7','SW-BRANCH','=A01+UC103-KF06Q','','','','' +'KF1455','IF RF 07: START SPULENWECHSEL 2','IF-RELAIS','=A01+UC103-KF05Q','IF RF 07: START SPULENWECHSEL 2','IF RF 07: START EXCHANGE 2','','' +'DI1454','IF RF 07 : NEUE SPULE','IF-RELAIS','=A01+UC103-KF03i','IF RF 07: NEUE SPULE ','IF RF 07: NEW BOBBIN','','' +'KF1454','IF RF 07: START SPULENWECHSEL 1','IF-RELAIS','=A01+UC103-KF05Q','IF RF 07: START SPULENWECHSEL 1','IF RF 07: START EXCHANGE 1','','' +'PF1447','RUNDUMLEUCHTE STÖRUNG FLYER 7','LED-YE_FAULT','=A01+UC103-KF04Q','','','','' +'SF1453','RESET FLYER 7','IPB-YE-NO','=A01+UC103-KF03i','RESET','RESET','RESET','' +'PF1453','RESET FLYER 7','IPB-YE-LED','=A01+UC103-KF05Q','','','','' +'SF1452','NOT HALT FLYER 7','EPB-NC','=A01+UC103-KF03i','NOT-HALT','E-STOP','E-STOP','' +'MB1434','ANPRESSEN NACHPUFFER F0601 FLYER 6','PRESS F0601','=A01+UC103-KF03Q','','','','' +'MB1435','ANPRESSEN NACHPUFFER F0602 FLYER 6','PRESS F0602','=A01+UC103-KF03Q','','','','' +'QA1431','ANTRIEB NACHPUFFER F0602 RF6','M-BI','=A01+UC103-KF03Q','','','','' +'MA1430','ANTRIEB NACHPUFFER F0601 RF6','M-BI','=A01+UC103-KF03Q','','','','' +'MB1404','ANPRESSEN PUFFER F0601 FLYER 6','PRESS F0601','=A01+UC103-KF00Q','','','','' +'MB1405','ANPRESSEN PUFFER F0602 FLYER 6','PRESS F0602','=A01+UC103-KF00Q','','','','' +'QA1421','ANTRIEB PUFFER F0602 FLYER 6','M-BI-RI','=A01+UC103-KF02Q','','','','' +'MA1420','ANTRIEB PUFFER F0601 FLYER 6','M-BI-LE','=A01+UC103-KF02Q','','','','' +'MB1474','ANPRESSEN NACHPUFFER F0701 FLYER 7','PRESS F0701','=A01+UC103-KF07Q','','','','' +'MB1475','ANPRESSEN NACHPUFFER F0702 FLYER 7','PRESS F0702','=A01+UC103-KF07Q','','','','' +'QA1471','ANTRIEB NACHPUFFER F0707 FLYER 7','M-BI-LE','=A01+UC103-KF07Q','','','','' +'MA1470','ANTRIEB NACHPUFFER F0701 FLYER 7','M-BI-RI','=A01+UC103-KF07Q','','','','' +'MB1444','ANPRESSEN PUFFER F0701 FLYER 7','PRESS F0701','=A01+UC103-KF04Q','','','','' +'MB1445','ANPRESSEN PUFFER F0702 FLYER 7','PRESS F0702','=A01+UC103-KF04Q','','','','' +'QA1461','ANTRIEB PUFFER F0701 FLYER 7','M-BI-RI','=A01+UC103-KF06Q','','','','' +'MA1460','ANTRIEB PUFFER F0701 FLYER 7','M-BI-LE','=A01+UC103-KF06Q','','','','' +'BG1080','SENSOR AUSFAHRT PUFFER F0201 FLYER 2','LT-EXIT F0201','=A01+UC101-KF00i','','','','' +'BG1081','SENSOR AUSFAHRT PUFFER F0202 FLYER 2','LT-EXIT F0202','=A01+UC101-KF00i','','','','' +'QA1145','ANTRIEB HAUPTSTR. FLYER 3','M-BI RF 3','=A01+UC101-KF06Q','','','','' +'MA1144','ANTRIEB HAUPTSTR. FLYER 3','M-BI RF 3','=A01+UC101-KF06Q','','','','' +'BG1097','SENSOR HAUPTSTR. VOR FLYER 2 ','LT-RF2 ','=A01+UC101-KF01i','','','','' +'BG1086','SENSOR AUSFAHRT NACHPUFFER F0202 RF 2','LT-EXIT F0202','=A01+UC101-KF00i','','','','' +'BG1085','SENSOR AUSFAHRT NACHPUFFER F0201 RF 2','LT-EXIT F0201','=A01+UC101-KF00i','','','','' +'MB1081','WEICHE ABZWEIG EINFAHRT F201-F202 RF 2','SW RF2','=A01+UC101-KF00Q','','','','' +'MB1080','WEICHE ABZWEIG EINFAHRT F0202 RF 2','SW ENTER F0201','=A01+UC101-KF00Q','','','','' +'MB1083','WEICHE ABZWEIG EINFAHRT RF 2','SW ENTER RF 2','=A01+UC101-KF00Q','','','','' +'MB1123','WEICHE ABZWEIG AUSFAHRT NACHP. FLYER 3','SW EXIT RF3','=A01+UC101-KF04Q','','','','' +'MB1120','WEICHE ABZWEIG EINFAHRT FLYER 3 ','SW ENTER RF 3','=A01+UC101-KF04Q','','','','' +'BG1126','SENSOR AUSFAHRT NACHPUFFER F0302 FLYER 3','LT-EXIT F0302','=A01+UC101-KF02i','','','','' +'BG1125','SENSOR AUSFAHRT NACHPUFFER F0301 FLYER 3','LT-EXIT F0301','=A01+UC101-KF02i','','','','' +'BG1096','SENSOR SPULE IN POSITION FLYER 2 ','BOB.IN POS(RF)','=A01+UC101-KF01i','','','','' +'BG1084','SENSOR ZUG IN DOFFER FLYER 2 ','LT-TRAIN IN RF','=A01+UC101-KF00i','','','','' +'BG1095','SENSOR SPULE IN POSITION PM 2','BOB.IN POS(BS)','=A01+UC101-KF01i','','','','' +'BG1083','SENSOR ZUG IN DOFFER PM 2','LT-TRAIN IN BS','=A01+UC101-KF00i','','','','' +'MB1091','ABHEBEN ANTRIEB RF 2','LIFT OFF BS 2','=A01+UC101-KF01Q','','','','' +'MA1096','ANTRIEB FLYER 2','M-BI','=A01+UC101-KF01Q','','','','' +'SF1091','HAUPTSCHALTER EIN +UC101','I-MS ON','=A01+UC101-KF01i','HAUPTSCHALTER EIN','MAIN SWITCH ON','','' +'SF1090','MOTORSCHUTZSCHALTER HAT AUSGELÖST','I-CB OK','=A01+UC101-KF01i','MSS IN ORDNUNG','MPS OK','','' +'PF1090','LM-ÜBERSTROM +UC101','IL-YE-LED','=A01+UC101-KF01Q','LM ÜBERSTROM','IL OVERCURRENT','','' +'MB1107','WEICHE ABZWEIG EINFAHRT NACHP. RF 2','SW-BRANCH','=A01+UC101-KF02Q','','','','' +'MB1106','WEICHE ABZWEIG EINFAHRT NACHP. RF 2','SW-STRAIGHT','=A01+UC101-KF02Q','','','','' +'KF1095','IF RF 02: START SPULENWECHSEL 2','IF-RELAIS','=A01+UC101-KF01Q','IF RF 02: START SPULENWECHSEL 2','IF RF 02: START EXCHANGE 2','','' +'DI1094','IF RF 02 : NEUE SPULE','IF-RELAIS','=A01+UC101-KF01i','IF RF 02: NEUE SPULE ','IF RF 02: NEW BOBBIN','','' +'PF1087','RUNDUMLEUCHTE STÖRUNG FLYER 2','LED-YE_FAULT','=A01+UC101-KF00Q','','','','' +'KF1094','IF RF 02: START SPULENWECHSEL 1','IF-RELAIS','=A01+UC101-KF01Q','IF RF 02: START SPULENWECHSEL 1','IF RF 02: START EXCHANGE 1','','' +'SF1093','RESET FLYER 2','IPB-YE-NO','=A01+UC101-KF01i','RESET','RESET','RESET','' +'PF1093','RESET FLYER 2','IPB-YE-LED','=A01+UC101-KF01Q','','','','' +'SF1092','NOT HALT FLYER 2','EPB-NC','=A01+UC101-KF01i','NOT-HALT','E-STOP','E-STOP','' +'BG1121','SENSOR AUSFAHRT PUFFER F0302 FLYER 3','LT-EXIT F0302','=A01+UC101-KF02i','','','','' +'BG1120','SENSOR AUSFAHRT PUFFER F0301 FLYER 3','LT-EXIT F0301','=A01+UC101-KF02i','','','','' +'MB1147','WEICHE ABZWEIG EINFAHRT NACHP. RF 3','SW-BRANCH','=A01+UC101-KF06Q','','','','' +'MB1146','WEICHE ABZWEIG EINFAHRT NACHP. RF 3','SW-STRAIGHT','=A01+UC101-KF06Q','','','','' +'KF1135','IF RF 03: START SPULENWECHSEL 2','IF-RELAIS','=A01+UC101-KF05Q','IF RF 03: START SPULENWECHSEL 2','IF RF 03: START EXCHANGE 2','','' +'DI1134','IF RF 03 : NEUE SPULE','IF-RELAIS','=A01+UC101-KF03i','IF RF 03: NEUE SPULE ','IF RF 03: NEW BOBBIN','','' +'KF1134','IF RF 03: START SPULENWECHSEL 1','IF-RELAIS','=A01+UC101-KF05Q','IF RF 03: START SPULENWECHSEL 1','IF RF 03: START EXCHANGE 1','','' +'PF1127','RUNDUMLEUCHTE STÖRUNG FLYER 3','LED-YE_FAULT','=A01+UC101-KF04Q','','','','' +'SF1133','RESET FLYER 3','IPB-YE-NO','=A01+UC101-KF03i','RESET','RESET','RESET','' +'PF1133','RESET FLYER 3','IPB-YE-LED','=A01+UC101-KF05Q','','','','' +'SF1132','NOT HALT FLYER 3','EPB-NC','=A01+UC101-KF03i','NOT-HALT','E-STOP','E-STOP','' +'MB1114','ANPRESSEN NACHPUFFER F0201 FLYER 2','PRESS F0201','=A01+UC101-KF03Q','','','','' +'MB1115','ANPRESSEN NACHPUFFER F0202 FLYER 2','PRESS F0202','=A01+UC101-KF03Q','','','','' +'MA1110','ANTRIEB NACHPUFFER F0201 FLYER 2','M-BI-LE','=A01+UC101-KF03Q','','','','' +'MB1084','ANPRESSEN PUFFER F0201 FLYER 2','PRESS F0201','=A01+UC101-KF00Q','','','','' +'MB1085','ANPRESSEN PUFFER F0202 FLYER 2','PRESS F0202','=A01+UC101-KF00Q','','','','' +'MB1124','ANPRESSEN PUFFER F0301 FLYER 3','PRESS F0301','=A01+UC101-KF04Q','','','','' +'MB1125','ANPRESSEN PUFFER F0302 FLYER 3','PRESS F0302','=A01+UC101-KF04Q','','','','' +'QA1141','ANTRIEB PUFFER F0301 FLYER 3','M-BI-RI','=A01+UC101-KF06Q','','','','' +'MA1140','ANTRIEB PUFFER F0301 FLYER 3','M-BI-LE','=A01+UC101-KF06Q','','','','' +'MB1154','ANPRESSEN NACHPUFFER F0301 FLYER 3','PRESS F0301','=A01+UC101-KF07Q','','','','' +'MB1155','ANPRESSEN NACHPUFFER F0302 FLYER 3','PRESS F0302','=A01+UC101-KF07Q','','','','' +'QA1151','ANTRIEB NACHPUFFER F0302 FLYER 3','M-BI-RI','=A01+UC101-KF07Q','','','','' +'MA1150','ANTRIEB NACHPUFFER F0301 FLYER 3','M-BI-LE','=A01+UC101-KF07Q','','','','' +'MB1131','ABHEBEN ANTRIEBE FLYER 3','LIFT OFF BS 3','=A01+UC101-KF05Q','','','','' +'MA1136','ANTRIEBE FLYER 3','M-BI-LE','=A01+UC101-KF05Q','','','','' +'BG1136','SENSOR SPULE IN POSITION FLYER 3 ','BOBBIN IN POS','=A01+UC101-KF03i','','','','' +'BG1124','SENSOR ZUG IN DOFFER PM 3','LT-TRAIN IN DOF','=A01+UC101-KF02i','','','','' +'BG1135','SENSOR SPULE IN POSITION PM 3','BOBBIN IN POS','=A01+UC101-KF03i','','','','' +'BG1123','SENSOR ZUG IN DOFFER FLYER 3','LT-TRAIN IN DOF','=A01+UC101-KF02i','','','','' +'MB1003','WEICHE ABZWEIG AUSFAHRT NACHP. RF1','SW EXIT RF1','=A01+UC100-KF00Q','','','','' +'MB1000','WEICHE ABZWEIG FLYER 1','SW ENTER RF1','=A01+UC100-KF00Q','','','','' +'BG1006','SENSOR AUSFAHRT NACHPUFFER F0101 RF 1','LT-EXIT F102','=A01+UC100-KF00i','','','','' +'BG1005','SENSOR AUSFAHRT NACHPUFFER F0101 RF 1','LT-EXIT F101 ','=A01+UC100-KF00i','','','','' +'PF1007','RUNDUMLEUCHTE STÖRUNG FLYER 1','LED-YE_FAULT','=A01+UC100-KF00Q','','','','' +'MB1027','WEICHE ABZWEIG EINFAHRT NACHP. RF 1','SW-STRAIGHT','=A01+UC100-KF02Q','','','','' +'MB1026','WEICHE ABZWEIG EINFAHRT NACHP. RF 1','SW-BRANCH','=A01+UC100-KF02Q','','','','' +'QA1157','ANTRIEB HAUPTSTECKE RF 1 ','M RF1','=A01+UC101-KF07Q','','','','' +'MA1156','ANTRIEB HAUPTSTECKE RF 1 ','M RF1','=A01+UC101-KF07Q','','','','' +'MB1034','ANPRESSEN NACHPUFFER F0101 FLYER 1','PRESS F0101','=A01+UC100-KF03Q','','','','' +'MB1035','ANPRESSEN NACHPUFFER F0102 FLYER 1','PRESS F0102','=A01+UC100-KF03Q','','','','' +'QA1031','ANTRIEB NACHPUFFER F0102 FLYER 1','M-BI-RI','=A01+UC100-KF03Q','','','','' +'MA1030','ANTRIEB NACHPUFFER F0101 FLYER 1','M-BI-LE','=A01+UC100-KF03Q','','','','' +'MB1004','ANPRESSEN PUFFER F0101 FLYER 1 ','PRESS F0101','=A01+UC100-KF00Q','','','','' +'MB1005','ANPRESSEN PUFFER F0102 FLYER 1 ','PRESS F0102','=A01+UC100-KF00Q','','','','' +'QA1021','ANTRIEB PUFFER F102 FLYER 1','M-BI-RI','=A01+UC100-KF02Q','','','','' +'MA1020','ANTRIEB PUFFER F101 FLYER 1','M-BI-LE','=A01+UC100-KF02Q','','','','' +'BG1000','SENSOR AUSFAHRT PUFFER F0101 FLYER 1','LT-EXIT F0101','=A01+UC100-KF00i','','','','' +'BG1001','SENSOR AUSFAHRT PUFFER F0102 FLYER 1','LT-EXIT F0102','=A01+UC100-KF00i','','','','' +'SF1013','RESET FLYER 1','IPB-YE-NO','=A01+UC100-KF01i','RESET','RESET','RESET','' +'PF1013','RESET FLYER 1','IPB-YE-LED','=A01+UC100-KF01Q','','','','' +'SF1012','NOT HALT FLYER 1','EPB-NC','=A01+UC100-KF01i','NOT-HALT','E-STOP','E-STOP','' +'KF1015','IF RF 01: START SPULENWECHSEL 2','IF-RELAIS','=A01+UC100-KF01Q','IF RF 01: START SPULENWECHSEL 2','IF RF 01: START EXCHANGE 2','CUANDO 01: LIBERAR CAMBIOS DE BOBINAS 2','' +'DI1014','IF RF 01 : NEUE SPULE','IF-RELAIS','=A01+UC100-KF01i','IF RF 01: NEUE SPULE ','IF RF 01: NEW BOBBIN','CUANDO 01: LLAMAR NUEVA BOBINA','' +'KF1014','IF RF 01: START SPULENWECHSEL 1','IF-RELAIS','=A01+UC100-KF01Q','IF RF 01: START SPULENWECHSEL 1','IF RF 01: START EXCHANGE 1','CUANDO 01: LIBERAR CAMBIOS DE BOBINAS 1','' +'MB1011','ABHEBEN ANTRIEBE PM 1 ','LIFT OFF BS 1','=A01+UC100-KF01Q','','','','' +'BG1015','SENSOR SPULE IN POSITION PM 1','BOBBIN IN POS','=A01+UC100-KF01i','','','','' +'BG1003','SENSOR ZUG IN DOFFER PM 1','LT-TRAIN IN DOF','=A01+UC100-KF00i','','','','' +'MA1016','ANTRIEB FLYER 1 ','M-BI','=A01+UC100-KF01Q','','','','' +'BG1016','SENSOR SPULE IN POSITION RF 1','BOBBIN IN POS','=A01+UC100-KF01i','','','','' +'BG1004','SENSOR ZUG IN DOFFER FLYER 1','LT-TRAIN IN DOF','=A01+UC100-KF00i','','','','' diff --git a/Test-Skripte/EinstellungenSkriptKonvertierung.txt b/Test-Skripte/EinstellungenSkriptKonvertierung.txt new file mode 100644 index 0000000..f16a2bd --- /dev/null +++ b/Test-Skripte/EinstellungenSkriptKonvertierung.txt @@ -0,0 +1,15 @@ +Hinweise zur Einstellungsdatei: +1) Jeder Eintrag wird durch senkrechte Striche (|) geteilt. Der erste Bereich gibt die Art des Eintrags an. + Moegliche Werte sind 'StartPfad' und 'Datei'. Es sollte nur ein StartPfad angegeben sein. Sind mehrere Angegeben, + wird der erste verwendet. Es koennen beliebig viele Dateien angegeben werden. +2) Die rechte Spalte bei Dateien gibt das Konvertierungsformat fuer diese Datei an. Moeglich sind 'TIA', 'WSCAD' + und 'Simpel'. Ist ein falscher oder kein Wert angegeben, wird automatisch in 'Simpel' konvertiert. +3) Die zweite Spalte von rechts bei Dateien gibt den Zieldateinamen an. Ist darin [Ursprungsdatei] enthalten, + wird dieser Teil durch den Namen der txt-Datei ersetzt, von der die Daten konvertiert werden. +Nutzung des Konvertierers auf eigene Gefahr und ohne Haftungsuebernahme bei Schaeden! +StartPfad|R:\m.kraft\Excel Werte ändern\Realtest\Neuer Ordner +VerzeichnisWahl|EigenerPfad +ZielPfad|R:\m.kraft\Excel Werte �ndern\Realtest\Neuer Ordner +Datei|E|A|WSCAD_[Ursprungsdatei]|WSCAD +Datei|%E|%A|TIA_[Ursprungsdatei]|TIA +Datei|E|A|EA_[Ursprungsdatei]|Simpel diff --git a/Test-Skripte/EinstellungenSkriptKonvertierung2.txt b/Test-Skripte/EinstellungenSkriptKonvertierung2.txt new file mode 100644 index 0000000..7851687 --- /dev/null +++ b/Test-Skripte/EinstellungenSkriptKonvertierung2.txt @@ -0,0 +1,2 @@ +R:\m.kraft\Excel Werte ändern +x diff --git a/Test-Skripte/EinstellungenSkriptKonvertierung_m.kraft.txt b/Test-Skripte/EinstellungenSkriptKonvertierung_m.kraft.txt new file mode 100644 index 0000000..afd35eb --- /dev/null +++ b/Test-Skripte/EinstellungenSkriptKonvertierung_m.kraft.txt @@ -0,0 +1,13 @@ +Hinweise zur Einstellungsdatei: +1) Jeder Eintrag wird durch senkrechte Striche (|) geteilt. Der erste Bereich gibt die Art des Eintrags an. + Moegliche Werte sind 'StartPfad' und 'Datei'. Es sollte nur ein StartPfad angegeben sein. Sind mehrere Angegeben, + wird der erste verwendet. Es koennen beliebig viele Dateien angegeben werden. +2) Die rechte Spalte bei Dateien gibt das Konvertierungsformat fuer diese Datei an. Moeglich sind 'TIA', 'WSCAD' + und 'Simpel'. Ist ein falscher oder kein Wert angegeben, wird automatisch in 'Simpel' konvertiert. +3) Die zweite Spalte von rechts bei Dateien gibt den Zieldateinamen an. Ist darin [Ursprungsdatei] enthalten, + wird dieser Teil durch den Namen der txt-Datei ersetzt, von der die Daten konvertiert werden. +Nutzung des Konvertierers auf eigene Gefahr und ohne Haftungsuebernahme bei Schaeden! +StartPfad|R:\m.kraft\Excel Werte ändern\Realtest +VerzeichnisWahl|WieTXT +ZielPfad|R:\m.kraft\Excel Werte ändern\Test-Skripte +Datei|E|A|[Ursprungsdatei]|BMK diff --git a/Test-Skripte/Excel-Datei erstellen.ps1 b/Test-Skripte/Excel-Datei erstellen.ps1 new file mode 100644 index 0000000..d364ce8 --- /dev/null +++ b/Test-Skripte/Excel-Datei erstellen.ps1 @@ -0,0 +1,14 @@ + +$Datei = New-Object -ComObject Excel.Application +Pause +#$Mappe = $Datei.Workbooks.Add() +#$Mappe.SaveAs("Z:\Automatisierung\WSCAD\IMPORT-EXPORT_WSCAD\SKRIPT-KONVERTIERUNG\Test-Excel.docx") +#$Blatt = $Mappe.WorkSheets.item(1) +$Datei.Visible = $false + +#$Blatt.Cells.Item(1,1) = "Testtext" + +$Mappe.Save() +$Datei.Quit() + +Pause \ No newline at end of file diff --git a/Test-Skripte/GUI-Angepasst1.ps1 b/Test-Skripte/GUI-Angepasst1.ps1 new file mode 100644 index 0000000..1036836 --- /dev/null +++ b/Test-Skripte/GUI-Angepasst1.ps1 @@ -0,0 +1,268 @@ +Function Main +{ +$Laufwerke = LaufwerkeFinden + +Gui $Laufwerke + +#Write-Host "Dateityp nach Übergabe: " $Pfad.GetType() +#Write-Host "Datei ausgewählt mit dem Verzeichnis " $Pfad +} + + +Function Gui ($Laufwerke) +{ +[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") +[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") + +# Eigenschaften Fenster +$Fenster = New-Object System.Windows.Forms.Form +$Fenster.Text = "Laufwerke" +$Fenster.Size = New-Object System.Drawing.Size(900,600) #Breite, Höhe +$Fenster.StartPosition = "CenterScreen" +$Fenster.KeyPreview = $true # was macht das? +$Fenster.MaximumSize = $Fenster.Size # legt fest, dass Größe des Fensters nicht verändert werden kann +$Fenster.MinimumSize = $Fenster.Size + +# PfadFeld +$PfadFeld = New-Object System.Windows.Forms.TextBox +$PfadFeld.Location = New-Object System.Drawing.Size(10,10) +$PfadFeld.Size = New-Object System.Drawing.Size(860,20) +#$PfadFeld.Text = $Pfad #Bringt nur etwas, wenn $Pfad einen Anfangswert hat, da der Text nicht laufend aktualisiert wird +$Fenster.Controls.Add($PfadFeld) + +# ListeOrdnernamen +$ListeOrdnernamen = New-Object System.Windows.Forms.ListBox +$ListeOrdnernamen.Location = New-Object System.Drawing.Size(10,40) +$ListeOrdnernamen.Size = New-Object System.Drawing.Size(860,20) +$ListeOrdnernamen.Height = 450 +$ListeOrdnernamen.Font = New-Object System.Drawing.Font("Arial",12,[System.Drawing.FontStyle]::Regular) +foreach ($Laufwerk in $Laufwerke) +{ + $ListeOrdnernamen.Items.Add($Laufwerk) +} +<#for ($i = 0; $i -lt 100; $i++) +{ + $ListeOrdnernamen.Items.Add("Wert$i") +}#> +$Fenster.Controls.Add($ListeOrdnernamen) + +<# +# Beispiel Textfeld +$Textfeld1 = New-Object System.Windows.Forms.Label +$Textfeld1.Location = New-Object System.Drawing.Size(7,500) +$Textfeld1.Size = New-Object System.Drawing.Size(130,15) +$Textfeld1.Text = "Beispiel Text" +$Fenster.Controls.Add($Textfeld1) +#> + + +# AuswählenButton +$AuswählenButton = New-Object System.Windows.Forms.Button +$AuswählenButton.Location = New-Object System.Drawing.Size(750,500) +$AuswählenButton.Size = New-Object System.Drawing.Size(100,30) +$AuswählenButton.Text = "Auswählen" +$AuswählenButton.Add_MouseClick({ + # Aktion bei Klick + $Auswahl = $ListeOrdnernamen.SelectedItem + Write-Host "Gewählter Ordner/ Datei: " $Auswahl + $Pfad = $PfadFeld.Text + Write-Host "Vorheriger Pfad: " $Pfad + if ($Pfad.length -gt 0) + { + $Pfad = Join-Path -Path $Pfad -ChildPath $Auswahl -Resolve + } + else + { + $Pfad = $Auswahl + } + Write-Host "Neuer Pfad: " $Pfad + + #Erkennen, ob *.txt-Datei gewählt wurde -> ggf. return + if ($($Auswahl -match ".txt")) + { + Write-Host ".txt-Datei ausgewählt, Pfad: " $Pfad + Write-Host "Dateityp: " $Pfad.GetType() + $Fenster.Dispose() + $Holder = NachAuswahl $Pfad + #return $Pfad[0] + } + + $PfadFeld.Text = $Pfad + $Fenster.Text = $Auswahl + $ListeOrdnernamen.Items.Clear() + Write-Host "Pfadwert vor Übergabe: " $Pfad + $Unterorder = UnterOrdnerFinden $Pfad + $TxtDateien = TxtDateienFinden $Pfad + $Optionen = Optionen $Unterorder $TxtDateien + foreach ($Option in $Optionen) + { + # Write-Host "Option: " $Option + if ($Option.length -gt 0) + { + $ListeOrdnernamen.Items.Add($Option) + } + } +}) +$Fenster.Controls.Add($AuswählenButton) + +# ZurückButton +$ZurückButton = New-Object System.Windows.Forms.Button +$ZurückButton.Location = New-Object System.Drawing.Size(10,500) +$ZurückButton.Size = New-Object System.Drawing.Size(100,30) +$ZurückButton.Text = "Zurück" +$ZurückButton.Add_MouseClick({ + Write-Host "Pfad ausgabe: " $PfadFeld.Text + $Pfad = $PfadFeld.Text + if ($Pfad.Length -gt 3) + { + # Weiter mit Ordnern/Dateien + Write-Host "Ordner/ Dateien anzeigen" + $Pfad = Split-Path $Pfad + Write-Host "Neuer Pfad: " $Pfad + $PfadFeld.Text = $Pfad + $Fenster.Text = $(Split-Path $Pfad) + $ListeOrdnernamen.Items.Clear() + Write-Host "Pfadwert vor Übergabe: " $Pfad + $Unterorder = UnterOrdnerFinden $Pfad + $TxtDateien = TxtDateienFinden $Pfad + $Optionen = Optionen $Unterorder $TxtDateien + foreach ($Option in $Optionen) + { + # Write-Host "Option: " $Option + if ($Option.length -gt 0) + { + $ListeOrdnernamen.Items.Add($Option) + } + } + } + elseif ($Pfad.Length -le 3) + { + # Weiter mit Laufwerken + Write-Host "Laufwerke anzeigen" + $Pfad = Split-Path $Pfad + Write-Host "Neuer Pfad: " $Pfad + $PfadFeld.Text = $Pfad + $Fenster.Text = "Laufwerke" + $ListeOrdnernamen.Items.Clear() + Write-Host "Pfadwert vor Übergabe: " $Pfad + $Laufwerke = LaufwerkeFinden $Pfad + foreach ($Laufwerk in $Laufwerke) + { + # Write-Host "Option: " $Option + if ($Laufwerk.length -gt 0) + { + $ListeOrdnernamen.Items.Add($Laufwerk) + } + } + + } + else + { + # Fehler/ Nichts tun? + } +}) +$Fenster.Controls.Add($ZurückButton) + + +$Fenster.Add_Shown({$Fenster.Activate()}) +[void] $Fenster.ShowDialog() +} + +Function NachAuswahl ($Pfad) +{ +Write-Host "Name in Funktion: " $Pfad + +Exit +} + +Function UnterOrdnerFinden($Pfad) +{ +#abfangen: keine Ordner vorhanden -> nicht nötig, da keine weitere Verarbeitung +$Ordner = $(Get-Childitem $Pfad -Directory) +return $Ordner +} + +Function LaufwerkeFinden() +{ +$Laufwerke = $(Get-PSDrive | where {$_.Free}).Name +$i = 0 + +foreach($Laufwerk in $Laufwerke) +{ + $Laufwerke[$i] = $Laufwerk + ":\" + $i++ +} + +return $Laufwerke +} + +Function TxtDateienFinden($Pfad) +{ +$TxtDateien = $(Get-Childitem $Pfad\*.txt) + +if ($TxtDateien.Length -gt 0) +{ + return $(Split-Path $TxtDateien -Leaf) +} +else +{ + return +} +} + +Function Optionen([System.Object[]]$UnterOrdner, $TxtDateien) +{ +#Gibt aktuell auch Index und Typ (System.IO.DirectoryInfo bzw. System.String) zurück +$Optionen = $UnterOrdner + $TxtDateien + +return $Optionen +} + + +Main + +<# +$mailAddresses = ("sdasd@ddfsf.net","ououoizu@fdssd.com","ssdfdsfds@dsfds.org") + +function FnShowDialog { + [void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") + #~~< Form1 >~~~~~~~~~~~~~~~~~~~~~~~~~~ + $Form1 = New-Object System.Windows.Forms.Form + $Form1.ClientSize = "347, 86" + $Form1.Font = New-Object System.Drawing.Font("Microsoft Sans Serif", 9.75, [System.Drawing.FontStyle]::Regular, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) + $Form1.FormBorderStyle = "FixedToolWindow" + $Form1.MaximizeBox = $false + $Form1.MinimizeBox = $false + $Form1.BackColor = "White" + #~~< Label1 >~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + $Label1 = New-Object System.Windows.Forms.Label + $Label1.Location = "13, 13" + $Label1.Size = "217, 23" + $Label1.Text = "Bitte Mailadresse wählen:" + #~~< Button1 >~~~~~~~~~~~~~~~~~~~~~~~~~ + $Button1 = New-Object System.Windows.Forms.Button + $Button1.Location = "259, 41" + $Button1.Size = "76, 26" + $Button1.Text = "OK" + $Button1.add_MouseClick({ + $script:selectedMailAdr = $ComboBox1.SelectedItem + $Form1.dispose() + }) + #~~< ComboBox1 >~~~~~~~~~~~~~~~~~~~~~~~~~~ + $ComboBox1 = New-Object System.Windows.Forms.ComboBox + $ComboBox1.Location = "12, 40" + $ComboBox1.SelectedIndex = -1 + $ComboBox1.DropDownStyle = "DropDownList" + $ComboBox1.Size = "231, 24" + $ComboBox1.Items.AddRange($mailAddresses) + + $Form1.Controls.Add($Label1) + $Form1.Controls.Add($Button1) + $Form1.Controls.Add($ComboBox1) + [System.Windows.Forms.Application]::Run($Form1) +} + + +FnShowDialog +Write-Host $selectedMailAdr +#> \ No newline at end of file diff --git a/Test-Skripte/GUI-Angepasst2.ps1 b/Test-Skripte/GUI-Angepasst2.ps1 new file mode 100644 index 0000000..fbcb09d --- /dev/null +++ b/Test-Skripte/GUI-Angepasst2.ps1 @@ -0,0 +1,1097 @@ +# Änderungsziel vs. 1: Funktion bei Klick auf "Auswählen" und "Zurück" auslagern +# Known problem: Zugriffsversuch auf einen Ordner, für den der Nutzer keine Freigabe hat. Aktuell kein Lösungsansatz bekannt. +# Todo: siehe Zettel! + +Function Main +{ + +Write-Host "Programmstart" + +$StartPfad = "" + +$PfadUrsprungsdatei = GuiTxtWaehlen $StartPfad +Write-Host "Pfad Ursprungsdatei: " $PfadUrsprungsdatei + + +# Testen, ob übergebener Pfad gültig ist? Könnte ungültig sein, wenn in PfadFeld unsinn steht und das Fenster via x geschlossen wird +$PfadUrsprungsdateiMod = Split-Path $PfadUrsprungsdatei +$PfadZielDateien = GuiVerzeichnisWaehlen $PfadUrsprungsdateiMod + +Write-Host "Dateirückgabe in Main(2): " $PfadZielDateien + +GUI für Fortschrittsanzeige +GuiFortschrittsAnzeige $PfadUrsprungsdatei + +# Ab hier........................................................................................................................... +Write-Host "Ausgabe nach Fortschrittsanzeige" + +$PfadDateiEA = ExcelDateiNameErstellen "EA" $PfadUrsprungsdatei $PfadZielDateien +$PfadDateiDIDQ = ExcelDateiNameErstellen "DIDQ" $PfadUrsprungsdatei $PfadZielDateien + +#$ListeErledigteAufgaben.Items.Add("Neue Dateinamenerstellen") +#$TextfeldAktuelleAufgabe.Text = "EA-Datei erstellen" + +#Write-Host "Dateiname EA: " $PfadDateiEA +#Write-Host "Dateiname DIDQ: " $PfadDateiDIDQ +ExcelDateiErstellen $PfadDateiEA +ExcelDateiErstellen $PfadDateiDIDQ + +$AlleGleichenEA = ExcelDateiBeschreiben $PfadUrsprungsdatei "E" "A" $PfadDateiEA +$AlleGleichenDIDQ = ExcelDateiBeschreiben $PfadUrsprungsdatei "DI" "DQ" $PfadDateiDIDQ +#Write-Host "Gleiche EA nach Rückgabe: " $AlleGleichenEA +$GleicheEingaenge = $AlleGleichenEA[0] +$GleicheAusgaenge = $AlleGleichenEA[1] + +Write-Host "Gleiche Eingänge: " $GleicheEingaenge +Write-Host "Gleiche Ausgänge: " $GleicheAusgaenge +# ......................bis hier alles in das guiFortschrittsanzeige verschieben und in die Funktionen die Updates einbauen................. + +#Todo: Nur öffnen, wenn es weder gleiche Eingänge, noch gleiche Ausgänge gibt? +GuiGleicheAnzeigen $GleicheEingaenge $GleicheAusgaenge + +} + + +Function GuiTxtWaehlen ($StartPfad) +{ +[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") +[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") + +# Eigenschaften Fenster +$Fenster = New-Object System.Windows.Forms.Form +$Fenster.Size = New-Object System.Drawing.Size(900,600) #Breite, Höhe +$Fenster.StartPosition = "CenterScreen" +$Fenster.KeyPreview = $true # was macht das? +$Fenster.MaximumSize = $Fenster.Size # legt fest, dass Größe des Fensters nicht verändert werden kann +$Fenster.MinimumSize = $Fenster.Size + +# PfadFeld +$PfadFeld = New-Object System.Windows.Forms.TextBox +$PfadFeld.Location = New-Object System.Drawing.Size(10,10) +$PfadFeld.Size = New-Object System.Drawing.Size(860,20) +$PfadFeld.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TXTTastenReaktionPfadFeld $Taste +}) +$Fenster.Controls.Add($PfadFeld) + +# ListeOrdnernamen +$ListeOrdnernamen = New-Object System.Windows.Forms.ListBox +$ListeOrdnernamen.Location = New-Object System.Drawing.Size(10,40) +$ListeOrdnernamen.Size = New-Object System.Drawing.Size(860,20) +$ListeOrdnernamen.Height = 450 +$ListeOrdnernamen.Font = New-Object System.Drawing.Font("Arial",12,[System.Drawing.FontStyle]::Regular) +$ListeOrdnernamen.Add_DoubleClick({ + # Variablen bestimmen zur Übergabe + $Auswahl = $ListeOrdnernamen.SelectedItem + $Pfad = $PfadFeld.Text + # Write-Host "Gewählter Ordner/ Datei: " $Auswahl + # Write-Host "Vorheriger Pfad: " $Pfad + + # Pfad aktualisieren + TXTVerzeichnisAuswaehlen $Pfad $Auswahl +}) +$ListeOrdnernamen.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TXTTastenReaktionListeOrdnernamen $Taste +}) +$Fenster.Controls.Add($ListeOrdnernamen) + +<# +# Beispiel Textfeld +$Textfeld1 = New-Object System.Windows.Forms.Label +$Textfeld1.Location = New-Object System.Drawing.Size(7,500) +$Textfeld1.Size = New-Object System.Drawing.Size(130,15) +$Textfeld1.Text = "Beispiel Text" +$Fenster.Controls.Add($Textfeld1) +#> + +# ZurückButton +$ZurückButton = New-Object System.Windows.Forms.Button +$ZurückButton.Location = New-Object System.Drawing.Size(10,500) +$ZurückButton.Size = New-Object System.Drawing.Size(100,30) +$ZurückButton.Text = "Zurück" +$ZurückButton.Add_Click({ + # Write-Host "Pfad ausgabe: " $PfadFeld.Text + $Pfad = $PfadFeld.Text + + #Pfad aktualisieren + TXTVerzeichnisZurueck $Pfad +}) +$ZurückButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TXTTastenReaktionButtons $Taste +}) +$Fenster.Controls.Add($ZurückButton) + +# AuswählenButton +$AuswählenButton = New-Object System.Windows.Forms.Button +$AuswählenButton.Location = New-Object System.Drawing.Size(750,500) +$AuswählenButton.Size = New-Object System.Drawing.Size(100,30) +$AuswählenButton.Text = "Auswählen" +$AuswählenButton.Add_Click({ + # Variablen bestimmen zur Übergabe + $Auswahl = $ListeOrdnernamen.SelectedItem + # Falls nicht aktiv ein Eintrag gewählt wurde, in den obersten navigieren + if ($($Auswahl.length -eq 0)) + { + $Auswahl = $ListeOrdnernamen.Items[0] + } + $Pfad = $PfadFeld.Text + # Write-Host "Gewählter Ordner/ Datei: " $Auswahl + # Write-Host "Vorheriger Pfad: " $Pfad + + # Pfad aktualisieren + TXTVerzeichnisAuswaehlen $Pfad $Auswahl +}) +$AuswählenButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TXTTastenReaktionButtons $Taste +}) +$Fenster.Controls.Add($AuswählenButton) + +# Dieser Funktionsaufruf zerstört die Rückgabe, wenn er keiner Variable zugewiesen wird +$A = TXTAnzeigeAktualisieren $StartPfad + +$Fenster.Add_Shown({$Fenster.Activate()}) +[void]$Fenster.ShowDialog() + +$Rueckgabe = $PfadFeld.Text +Write-Host "Rückgabe: " $Rueckgabe +return $Rueckgabe +} + +#--------------------------------------------------------- E N D E G U I txtWaehlen ---------------------------------------------------------------------- + +#------------------- Funktionen nur für das txt-GUI -------------------------- + +# Bekommt Pfad, stellt fest ob Laufwerke oder Ordner angezeigt werden müssen und aktualisiert entsprechend alles +# Für Laufwerke muss $Pfad = "" sein +Function TXTAnzeigeAktualisieren ($Pfad) +{ +# Write-Host "Übergebener Pfad: " $Pfad + +# Sicherstellen, dass es das Verzeichnis gibt +if ($($Pfad -eq "") -or $(PfadExistiert $Pfad)) +{ + # Feststellen, ob Ordner oder Laufwerke angezeigt werden müssen + if ($Pfad.Length -ne "") + { + # Es handelt sich um Ordner + $Optionen = TXTOptionen $Pfad + $Fenster.Text = $(Split-Path $Pfad -Leaf) + } + elseif ($Pfad.Length -eq "") + { + # Es handelt sich um Laufwerke + $Optionen = LaufwerkeFinden + $Pfad = "" + $Fenster.Text = "Laufwerke" + } + else + { + Write-Host "Fehler bei Anzeige aktualisieren" + # Fehler(?) + } + $PfadFeld.Text = $Pfad + $ListeOrdnernamen.Items.Clear() + foreach ($Option in $Optionen) + { + if ($Option.Length -gt 0) + { + $ListeOrdnernamen.Items.Add($Option) + } + } +} +else +{ + TXTAnzeigeAktualisieren "" +} +return +} + +Function TXTVerzeichnisAuswaehlen ($Pfad, $Auswahl) +{ +if ($Pfad.length -gt 0) +{ + $Pfad = Join-Path -Path $Pfad -ChildPath $Auswahl -Resolve +} +else +{ + $Pfad = $Auswahl +} + +#Falls nicht aktiv ein Eintrag ausgewählt wurde, den obersten wählen +if ($Auswahl.length -eq 0) +{ + $Auswahl = $ListeOrdnernamen.Items[0] +} + +# Erkennen, ob *.txt-Datei gewählt wurde -> ggf. Auswahl abgeschlossen +if ($($Auswahl -match ".txt")) +{ + # Write-Host ".txt-Datei ausgewählt, Pfad: " $Pfad + # Write-Host "Dateityp: " $Pfad.GetType() + $Fenster.Dispose() + # Ist zwar sachlich gesehen unsinn, aber sonst funktioniert Return in der GUI nicht + $PfadFeld.Text = $Pfad + return +} + +TXTAnzeigeAktualisieren $Pfad + +return +} + +Function TXTVerzeichnisZurueck ($Pfad) +{ +if ($Pfad.Length -gt 3) +{ + # Weiter mit Ordnern + # Write-Host "Ordner anzeigen" + $Pfad = Split-Path $Pfad +} +elseif ($Pfad.Length -le 3) +{ + # Weiter mit Laufwerken + # Write-Host "Laufwerke anzeigen" + $Pfad = "" +} +else +{ + Write-Host "Fehler bei Verzeichnis zurück" + # Fehler/ Nichts tun? + # Ermitteln: wann tritt dieser Fall ein? +} +TXTAnzeigeAktualisieren $Pfad +return +} + +Function TXTTastenReaktionPfadFeld($Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +switch ($Taste){ + "Return" { + # Write-Host "Enter gedrückt" + $Pfad = $PfadFeld.Text + # Write-Host "Pfad: " $Pfad + + TXTReaktionReturn $Pfad + } + default { + # Write-Host "Gedrückte Taste: " $Taste + } +} +return +} + +Function TXTTastenReaktionListeOrdnernamen($Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +switch ($Taste){ + "Return" { + # Write-Host "Enter gedrückt" + $Auswahl = $ListeOrdnernamen.SelectedItem + if ($($Auswahl.Length -eq 0)) + { + $Auswahl = $ListeOrdnernamen.Items[0] + } + $Pfad = $PfadFeld.Text + # Write-Host "Auswahl: " $Auswahl + # Write-Host "Pfad: " $Pfad + + TXTVerzeichnisAuswaehlen $Pfad $Auswahl + } + "Back" { + # Write-Host "Back gedrückt" + $Pfad = $PfadFeld.Text + # Write-Host "Pfad: " $Pfad + + # Pfad aktualisieren + TXTVerzeichnisZurueck $Pfad + } + default { + # Write-Host "Gedrückte Taste: " $Taste + } +} +return +} + +Function TXTTastenReaktionButtons($Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +switch ($Taste){ + "Back" { + # Write-Host "Back gedrückt" + $Pfad = $PfadFeld.Text + # Write-Host "Pfad: " $Pfad + + # Pfad aktualisieren + TXTVerzeichnisZurueck $Pfad + } + default { + # Write-Host "Gedrückte Taste: " $Taste + } +} +return +} + +Function TXTOptionen($Pfad) +{ +# Unterordner und .txt-Dateien finden +# Typzuweisung nötig, da aus unbekanntem Grund sonst Unterordner eines Ordners, der mit "_" beginnt, nicht gefunden werden können +[System.Object[]]$UnterOrdner = UnterOrdnerFinden $Pfad +$TxtDateien = TxtDateienFinden $Pfad + +#Gibt aktuell auch Index und Typ (System.IO.DirectoryInfo bzw. System.String) zurück +$Optionen = $UnterOrdner + $TxtDateien + +return $Optionen +} + +Function TXTReaktionReturn ($Pfad) +{ + if (PfadExistiert $Pfad) + { + # Gültiger Pfad oder .txt-Datei + $PfadEnde = $(Split-Path $Pfad -Leaf) + if ($($PfadEnde -match ".txt")) + { + $Fenster.Dispose() + # Ist zwar sachlich gesehen unsinn, aber sonst funktioniert Return in der GUI nicht richtig + $PfadFeld.Text = $Pfad + return + } + else + { + TXTAnzeigeAktualisieren $Pfad + } + } + else + { + # Laufwerke aktualisieren oder ungültiger Pfad + TXTAnzeigeAktualisieren "" + } + return +} + +Function GuiVerzeichnisWaehlen ($StartPfad) +{ +[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") +[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") + +# Eigenschaften Fenster +$Fenster = New-Object System.Windows.Forms.Form +$Fenster.Size = New-Object System.Drawing.Size(900,600) #Breite, Höhe +$Fenster.StartPosition = "CenterScreen" +$Fenster.KeyPreview = $true # was macht das? +$Fenster.MaximumSize = $Fenster.Size # legt fest, dass Größe des Fensters nicht verändert werden kann +$Fenster.MinimumSize = $Fenster.Size + +# PfadFeld +$PfadFeld = New-Object System.Windows.Forms.TextBox +$PfadFeld.Location = New-Object System.Drawing.Size(10,10) +$PfadFeld.Size = New-Object System.Drawing.Size(860,20) +$PfadFeld.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + VERTastenReaktionPfadFeld $Taste +}) +$Fenster.Controls.Add($PfadFeld) + +# ListeOrdnernamen +$ListeOrdnernamen = New-Object System.Windows.Forms.ListBox +$ListeOrdnernamen.Location = New-Object System.Drawing.Size(10,40) +$ListeOrdnernamen.Size = New-Object System.Drawing.Size(860,20) +$ListeOrdnernamen.Height = 450 +$ListeOrdnernamen.Font = New-Object System.Drawing.Font("Arial",12,[System.Drawing.FontStyle]::Regular) +$ListeOrdnernamen.Add_DoubleClick({ + # Variablen bestimmen zur Übergabe + $Auswahl = $ListeOrdnernamen.SelectedItem + $Pfad = $PfadFeld.Text + # Write-Host "Gewählter Ordner/ Datei: " $Auswahl + # Write-Host "Vorheriger Pfad: " $Pfad + + # Pfad aktualisieren + VERVerzeichnisAuswaehlen $Pfad $Auswahl +}) +$ListeOrdnernamen.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + VERTastenReaktionListeOrdnernamen $Taste +}) +$Fenster.Controls.Add($ListeOrdnernamen) + +<# +# Beispiel Textfeld +$Textfeld1 = New-Object System.Windows.Forms.Label +$Textfeld1.Location = New-Object System.Drawing.Size(7,500) +$Textfeld1.Size = New-Object System.Drawing.Size(130,15) +$Textfeld1.Text = "Beispiel Text" +$Fenster.Controls.Add($Textfeld1) +#> + +# ZurückButton +$ZurückButton = New-Object System.Windows.Forms.Button +$ZurückButton.Location = New-Object System.Drawing.Size(10,500) +$ZurückButton.Size = New-Object System.Drawing.Size(100,30) +$ZurückButton.Text = "Zurück" +$ZurückButton.Add_Click({ + # Write-Host "Pfad ausgabe: " $PfadFeld.Text + $Pfad = $PfadFeld.Text + + #Pfad aktualisieren + VERVerzeichnisZurueck $Pfad +}) +$ZurückButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + VERTastenReaktionButtons $Taste +}) +$Fenster.Controls.Add($ZurückButton) + +# AuswählenButton +$AuswählenButton = New-Object System.Windows.Forms.Button +$AuswählenButton.Location = New-Object System.Drawing.Size(630,500) +$AuswählenButton.Size = New-Object System.Drawing.Size(100,30) +$AuswählenButton.Text = "Auswählen" +$AuswählenButton.Add_Click({ + # Variablen bestimmen zur Übergabe + $Auswahl = $ListeOrdnernamen.SelectedItem + # Falls nicht aktiv ein Eintrag gewählt wurde, in den obersten navigieren + if ($($Auswahl.length -eq 0)) + { + $Auswahl = $ListeOrdnernamen.Items[0] + } + $Pfad = $PfadFeld.Text + # Write-Host "Gewählter Ordner/ Datei: " $Auswahl + # Write-Host "Vorheriger Pfad: " $Pfad + + if ($($ListeOrdnernamen.Items[0] -eq "")) + { + VERAuswahlBestaetigt $Pfad $Auswahl + } + else + { + # Pfad aktualisieren + VERVerzeichnisAuswaehlen $Pfad $Auswahl + } +}) +$AuswählenButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + VERTastenReaktionButtons $Taste +}) +$Fenster.Controls.Add($AuswählenButton) + +# BestätigenButton +$BestätigenButton = New-Object System.Windows.Forms.Button +$BestätigenButton.Location = New-Object System.Drawing.Size(750,500) +$BestätigenButton.Size = New-Object System.Drawing.Size(100,30) +$BestätigenButton.Text = "Bestätigen" +$BestätigenButton.Add_Click({ + $Auswahl = $ListeOrdnernamen.SelectedItem + # Falls nicht aktiv ein Eintrag gewählt wurde, in den obersten navigieren + if ($($Auswahl.length -eq 0)) + { + $Auswahl = $ListeOrdnernamen.Items[0] + } + $Pfad = $PfadFeld.Text + + VERAuswahlBestaetigt $Pfad $Auswahl +}) +$BestätigenButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + VERTastenReaktionButtons $Taste +}) +$Fenster.Controls.Add($BestätigenButton) + + +# Dieser Funktionsaufruf zerstört die Rückgabe, wenn er keiner Variable zugewiesen wird +$A = VERAnzeigeAktualisieren $StartPfad + +$Fenster.Add_Shown({$Fenster.Activate()}) +[void]$Fenster.ShowDialog() + +$Rueckgabe2 = $PfadFeld.Text +Write-Host "Rückgabe: " $Rueckgabe2 +return $Rueckgabe2 +} + +#--------------------------------------------------------- E N D E G U I VerzeichnsWaehlen ---------------------------------------------------------------------- + +#------------------- Funktionen nur für das VerzeichnisWaehlen-GUI -------------------------- + +# Bekommt Pfad, stellt fest ob Laufwerke oder Ordner angezeigt werden müssen und aktualisiert entsprechend alles +# Für Laufwerke muss $Pfad = "" sein +Function VERAnzeigeAktualisieren ($Pfad) +{ +# Write-Host "Übergebener Pfad: " $Pfad + +# Sicherstellen, dass es das Verzeichnis gibt +if ($($Pfad -eq "") -or $(PfadExistiert $Pfad)) +{ + # Feststellen, ob Ordner oder Laufwerke angezeigt werden müssen + if ($Pfad.Length -ne "") + { + # Es handelt sich um Ordner + $Optionen = VEROptionen $Pfad + $Fenster.Text = $(Split-Path $Pfad -Leaf) + } + elseif ($Pfad.Length -eq "") + { + # Es handelt sich um Laufwerke + $Optionen = LaufwerkeFinden + $Pfad = "" + $Fenster.Text = "Laufwerke" + } + else + { + Write-Host "Fehler bei Anzeige aktualisieren" + # Fehler(?) + } + $PfadFeld.Text = $Pfad + $ListeOrdnernamen.Items.Clear() + foreach ($Option in $Optionen) + { + if ($Option.Length -gt 0) + { + $ListeOrdnernamen.Items.Add($Option) + } + } +} +else +{ + VERAnzeigeAktualisieren "" +} +return +} + + +Function VERVerzeichnisAuswaehlen ($Pfad, $Auswahl) +{ +#Falls nicht aktiv ein Eintrag ausgewählt wurde, den obersten wählen +if ($Auswahl.length -eq 0) +{ + $Auswahl = $ListeOrdnernamen.Items[0] +} + +if ($Pfad.length -gt 0) +{ + $Pfad = Join-Path -Path $Pfad -ChildPath $Auswahl -Resolve +} +else +{ + $Pfad = $Auswahl +} + +VERAnzeigeAktualisieren $Pfad +return +} + +Function VERVerzeichnisZurueck ($Pfad) +{ +if ($Pfad.Length -gt 3) +{ + # Weiter mit Ordnern + # Write-Host "Ordner anzeigen" + $Pfad = Split-Path $Pfad +} +elseif ($Pfad.Length -le 3) +{ + # Weiter mit Laufwerken + # Write-Host "Laufwerke anzeigen" + $Pfad = "" +} +else +{ + Write-Host "Fehler bei Verzeichnis zurück" + # Fehler/ Nichts tun? + # Ermitteln: wann tritt dieser Fall ein? +} +VERAnzeigeAktualisieren $Pfad +return +} + +Function VERTastenReaktionPfadFeld($Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +switch ($Taste){ + "Return" { + # Write-Host "Enter gedrückt" + $Pfad = $PfadFeld.Text + # Write-Host "Pfad: " $Pfad + # Es muss nicht überprüft werden, ob es das Verzeichnis gibt, da dies auch in VERAnzeigeAktualisieren gemacht wird + VERAnzeigeAktualisieren $Pfad + } + "ShiftKey" { + $Pfad = $PfadFeld.Text + $Auswahl = $ListeOrdnernamen.SelectedItem + # Falls nicht aktiv ein Eintrag gewählt wurde, in den obersten navigieren + if ($($Auswahl.length -eq 0)) + { + $Auswahl = $ListeOrdnernamen.Items[0] + } + + ReaktionShiftKey $Pfad $Auswahl + } + default { + # Write-Host "Gedrückte Taste: " $Taste + } +} +return +} + +Function VERTastenReaktionListeOrdnernamen($Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +switch ($Taste){ + "Return" { + # Write-Host "Enter gedrückt" + $Auswahl = $ListeOrdnernamen.SelectedItem + if ($($Auswahl.Length -eq 0)) + { + $Auswahl = $ListeOrdnernamen.Items[0] + } + $Pfad = $PfadFeld.Text + # Write-Host "Auswahl: " $Auswahl + # Write-Host "Pfad: " $Pfad + + VERVerzeichnisAuswaehlen $Pfad $Auswahl + } + "Back" { + # Write-Host "Back gedrückt" + $Pfad = $PfadFeld.Text + # Write-Host "Pfad: " $Pfad + + # Pfad aktualisieren + VERVerzeichnisZurueck $Pfad + } + "ShiftKey" { + $Pfad = $PfadFeld.Text + $Auswahl = $ListeOrdnernamen.SelectedItem + # Falls nicht aktiv ein Eintrag gewählt wurde, in den obersten navigieren + if ($($Auswahl.length -eq 0)) + { + $Auswahl = $ListeOrdnernamen.Items[0] + } + + ReaktionShiftKey $Pfad $Auswahl + } + default { + # Write-Host "Gedrückte Taste: " $Taste + } +} +return +} + +Function VERTastenReaktionButtons($Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +switch ($Taste){ + "Back" { + # Write-Host "Back gedrückt" + $Pfad = $PfadFeld.Text + # Write-Host "Pfad: " $Pfad + + # Pfad aktualisieren + VERVerzeichnisZurueck $Pfad + } + "ShiftKey" { + $Pfad = $PfadFeld.Text + $Auswahl = $ListeOrdnernamen.SelectedItem + # Falls nicht aktiv ein Eintrag gewählt wurde, in den obersten navigieren + if ($($Auswahl.length -eq 0)) + { + $Auswahl = $ListeOrdnernamen.Items[0] + } + + ReaktionShiftKey $Pfad $Auswahl + } + default { + # Write-Host "Gedrückte Taste: " $Taste + } +} +return +} + +Function VEROptionen($Pfad) +{ +# Unterordner und .txt-Dateien finden +# Typzuweisung nötig, da aus unbekanntem Grund sonst Unterordner eines Ordners, der mit "_" beginnt, nicht gefunden werden können +[System.Object[]]$UnterOrdner = UnterOrdnerFinden $Pfad +# $TxtDateien = TxtDateienFinden $Pfad + +#Gibt aktuell auch Index und Typ (System.IO.DirectoryInfo bzw. System.String) zurück +$Optionen = $UnterOrdner +return $Optionen +} + +Function VERAuswahlBestaetigt($Pfad, $Auswahl) +{ +$Pfad = Join-Path -Path $Pfad -ChildPath $Auswahl -Resolve + +if (PfadExistiert $Pfad) +{ + Write-Host "Pfad zur Rückgabe: " $Pfad + $Fenster.Dispose() + $Pfadfeld.Text = $Pfad + return +} +} + +Function GuiFortschrittsAnzeige ($PfadUrsprungsdatei) +{ + [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") + [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") + + # Eigenschaften Fenster + $FortschrittFenster = New-Object System.Windows.Forms.Form + $FortschrittFenster.Size = New-Object System.Drawing.Size(755,270) #Breite, Höhe + $FortschrittFenster.StartPosition = "CenterScreen" + $FortschrittFenster.KeyPreview = $true # was macht das? + $FortschrittFenster.MaximumSize = $FortschrittFenster.Size # legt fest, dass Größe des Fensters nicht verändert werden kann + $FortschrittFenster.MinimumSize = $FortschrittFenster.Size + $FortschrittFenster.Text = "Fortschritt Dateikonvertierung" + + $Textfeld1 = New-Object System.Windows.Forms.Label + $Textfeld1.Location = New-Object System.Drawing.Size(10,10) + $Textfeld1.Size = New-Object System.Drawing.Size(200,20) + $Textfeld1.Text = "Aktuelle Aufgabe" + $FortschrittFenster.Controls.Add($Textfeld1) + + $Textfeld2 = New-Object System.Windows.Forms.Label + $Textfeld2.Location = New-Object System.Drawing.Size(300,10) + $Textfeld2.Size = New-Object System.Drawing.Size(430,20) + $Textfeld2.Text = "Erledigte Aufgaben" + $FortschrittFenster.Controls.Add($Textfeld2) + + $TextfeldAktuelleAufgabe = New-Object System.Windows.Forms.Label + $TextfeldAktuelleAufgabe.Location = New-Object System.Drawing.Size(10,40) + $TextfeldAktuelleAufgabe.Size = New-Object System.Drawing.Size(280,20) + $TextfeldAktuelleAufgabe.Text = "Neue Dateinamen erstellen" + $FortschrittFenster.Controls.Add($TextfeldAktuelleAufgabe) + + $ListeErledigteAufgaben = New-Object System.Windows.Forms.ListBox + $ListeErledigteAufgaben.Location = New-Object System.Drawing.Size(300,40) + $ListeErledigteAufgaben.Size = New-Object System.Drawing.Size(430,20) + $ListeErledigteAufgaben.Height = 150 + $ListeErledigteAufgaben.Font = New-Object System.Drawing.Font("Arial",12,[System.Drawing.FontStyle]::Regular) + $FortschrittFenster.Controls.Add($ListeErledigteAufgaben) + + $Textfeld3 = New-Object System.Windows.Forms.Label + $Textfeld3.Location = New-Object System.Drawing.Size(10,100) + $Textfeld3.Size = New-Object System.Drawing.Size(430,20) + $Textfeld3.Text = "Gesamtfortschritt" + $FortschrittFenster.Controls.Add($Textfeld3) + + $Fortschrittsbar = New-Object System.Windows.Forms.ProgressBar + $Fortschrittsbar.Location = New-Object System.Drawing.Size(10,120) + $Fortschrittsbar.Size = New-Object System.Drawing.Size(260,30) + #$Fortschrittsbar.Name = "Fortschrittsanzeige" + $Fortschrittsbar.Value = 0 + $FortschrittFenster.Controls.Add($Fortschrittsbar) + + $Textfeld4 = New-Object System.Windows.Forms.Label + $Textfeld4.Location = New-Object System.Drawing.Size(10,170) + $Textfeld4.Size = New-Object System.Drawing.Size(120,20) + $Textfeld4.Text = "Bearbeitete Einträge:" + $FortschrittFenster.Controls.Add($Textfeld4) + + $Textfeld5 = New-Object System.Windows.Forms.Label + $Textfeld5.Location = New-Object System.Drawing.Size(10,200) + $Textfeld5.Size = New-Object System.Drawing.Size(100,20) + $Textfeld5.Text = "Gesamteinträge:" + $FortschrittFenster.Controls.Add($Textfeld5) + + $TextfeldBearbeiteteEinträge = New-Object System.Windows.Forms.Label + $TextfeldBearbeiteteEinträge.Location = New-Object System.Drawing.Size(140,170) + $TextfeldBearbeiteteEinträge.Size = New-Object System.Drawing.Size(430,20) + $TextfeldBearbeiteteEinträge.Text = "0" + $FortschrittFenster.Controls.Add($TextfeldBearbeiteteEinträge) + + $TextfeldGesamtEintraege = New-Object System.Windows.Forms.Label + $TextfeldGesamtEintraege.Location = New-Object System.Drawing.Size(140,200) + $TextfeldGesamtEintraege.Size = New-Object System.Drawing.Size(430,20) + $Ursprungdatei = Get-Content $PfadUrsprungsdatei + $TextfeldGesamtEintraege.Text = $($Ursprungdatei.Length) + $FortschrittFenster.Controls.Add($TextfeldGesamtEintraege) + + $FortschrittFenster.Add_Shown({$FortschrittFenster.Activate()}) + [void]$FortschrittFenster.ShowDialog() +} + +Function GuiGleicheAnzeigen ($GleicheEingaenge, $GleicheAusgaenge) +{ + [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") + [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") + + # Eigenschaften Fenster + $Fenster = New-Object System.Windows.Forms.Form + $Fenster.Size = New-Object System.Drawing.Size(905,600) #Breite, Höhe + $Fenster.StartPosition = "CenterScreen" + $Fenster.KeyPreview = $true # was macht das? + $Fenster.MaximumSize = $Fenster.Size # legt fest, dass Größe des Fensters nicht verändert werden kann + $Fenster.MinimumSize = $Fenster.Size + $Fenster.Text = "Mehrfach vorhandene Ein- und Ausgänge" + + $Textfeld1 = New-Object System.Windows.Forms.Label + $Textfeld1.Location = New-Object System.Drawing.Size(10,10) + $Textfeld1.Size = New-Object System.Drawing.Size(430,20) + $Textfeld1.Text = "Bei den Eingängen gibt es folgende Duplikate: " + $Fenster.Controls.Add($Textfeld1) + + $ListeEingänge = New-Object System.Windows.Forms.DataGridView + $ListeEingänge.Location = New-Object System.Drawing.Size(10,40) + $ListeEingänge.Size = New-Object System.Drawing.Size(430,20) + $ListeEingänge.Height = 450 + $ListeEingänge.ColumnCount = 2 + $ListeEingänge.ColumnHeadersVisible = $true + $ListeEingänge.Columns[0].Name = "Zeile" + $ListeEingänge.Columns[1].Name = "Kennzeichnung" + foreach ($GleichenEingang in $GleicheEingaenge) + { + Write-Host "Hinzufügen TabelleE: " $GleichenEingang + $ListeEingänge.Rows.Add($($GleichenEingang.Zeile),($GleichenEingang.Name)) + } + $Fenster.Controls.Add($ListeEingänge) + + $Textfeld2 = New-Object System.Windows.Forms.Label + $Textfeld2.Location = New-Object System.Drawing.Size(450,10) + $Textfeld2.Size = New-Object System.Drawing.Size(430,20) + $Textfeld2.Text = "Bei den Ausgängen gibt es folgende Duplikate: " + $Fenster.Controls.Add($Textfeld2) + + $ListeAusgänge = New-Object System.Windows.Forms.DataGridView + $ListeAusgänge.Location = New-Object System.Drawing.Size(450,40) + $ListeAusgänge.Size = New-Object System.Drawing.Size(430,20) + $ListeAusgänge.Height = 450 + $ListeAusgänge.ColumnCount = 2 + $ListeAusgänge.ColumnHeadersVisible = $true + $ListeAusgänge.Columns[0].Name = "Zeile" + $ListeAusgänge.Columns[1].Name = "Kennzeichnung" + foreach ($GleichenAusgang in $GleicheAusgaenge) + { + Write-Host "Hinzufügen TabelleA: " $GleichenAusgang + $ListeAusgänge.Rows.Add($($GleichenAusgang.Zeile),($GleichenAusgang.Name)) + } + $Fenster.Controls.Add($ListeAusgänge) + + $BestätigenButton = New-Object System.Windows.Forms.Button + $BestätigenButton.Location = New-Object System.Drawing.Size(10,500) + $BestätigenButton.Size = New-Object System.Drawing.Size(860,30) + $BestätigenButton.Text = "Programm beenden" + $BestätigenButton.Add_Click({ + $Fenster.Dispose() + return + }) + $Fenster.Controls.Add($BestätigenButton) + + $Fenster.Add_Shown({$Fenster.Activate()}) + [void]$Fenster.ShowDialog() +} + +#------------------- Funktionen für alle GUIs -------------------------- + +Function PfadExistiert ($Pfad) +{ +if ($(Test-Path $Pfad -PathType Container) -or $(Test-Path $Pfad -Include "*.txt")) +{ + # Write-Host "Bei dem Verzeichnis handelt es sich um eine *.txt-Datei oder ein gültiges Verzeichnis" + return $true +} +else +{ + # Write-Host "Das Verzeichnis existiert nicht oder es wurde keine *.txt-Datei gewählt" + return $false +} +} + +Function LaufwerkeFinden() +{ +$Laufwerke = $(Get-PSDrive | Where-Object {$_.Free}).Name +$i = 0 + +foreach($Laufwerk in $Laufwerke) +{ + $Laufwerke[$i] = $Laufwerk + ":\" + $i++ +} +return $Laufwerke +} + +Function UnterOrdnerFinden($Pfad) +{ +# Write-Host "Ordner zum suchen von Unterordnern: " $Pfad +$UnterOrdner = $(Get-ChildItem $Pfad -Directory) +# Write-Host "Gefundene Unterordner: " $UnterOrdner +if ($($UnterOrdner.Length -gt 0)) +{ + $Ordner = $(Split-Path $UnterOrdner -Leaf) +} +else { + $Ordner = "" +} + +# Write-Host "Gefundene Ordner: " $Ordner +return $Ordner +} + +Function TxtDateienFinden($Pfad) +{ +$TxtDateien = $(Get-Childitem $Pfad\*.txt) + +if ($TxtDateien.Length -gt 0) +{ + return $(Split-Path $TxtDateien -Leaf) +} +else +{ + return +} +} + +Function ReaktionShiftKey ($Pfad, $Auswahl) +{ + if (PfadExistiert $Pfad) + { + VERAuswahlBestaetigt $Pfad $Auswahl + } + else + { + VERAnzeigeAktualisieren "" + } + + return +} +#--------------------------------------- Ende Funktionen für GUI ------------------------------- + +Function ExcelDateiNameErstellen ($Prefix, $PfadUrsprungsdatei, $PfadZielDateien) +{ + $BasisNameZielDatei = Split-Path $PfadUrsprungsdatei -Leaf + $BasisNameZielDateiLaenge = $BasisNameZielDatei.Length + $BasisNameZielDateiKurz = $BasisNameZielDatei.Substring(0, $($BasisNameZielDateiLaenge - 4)) + $GesamtPfadZielDatei = $PfadZielDateien + "\" + $Prefix + "_" + $BasisNameZielDateiKurz + ".xlsx" + + return $GesamtPfadZielDatei +} + +Function ExcelDateiErstellen ($DateiPfad) +{ + $Datei = New-Object -ComObject Excel.Application + $Mappe = $Datei.Workbooks.Add() + $Mappe.SaveAs($DateiPfad) + $Datei.Quit() + + return +} + +Function ExcelDateiBeschreiben ($PfadUrsprungsdatei, $Umwandler1, $Umwandler2, $ZielDatei) +{ + $Datei = New-Object -ComObject Excel.Application + $Mappe = $Datei.Workbooks.Open($ZielDatei) + $Blatt = $Mappe.WorkSheets.item(1) + $Datei.Visible = $false + + $i = 1 + $Wandler1 = @() + $ZuWandler1 = @(„DI“, „BA“, „BB“, „BC“, „BD“, „BE“, „BF“, „BG“, „BH“, „BJ“, „BK“, „BL“, „BM“, „BN“, „BP“, „BQ“, „BR“, „BS“, „BT“, „BU“, „BV“, „BW“, „BX“, „BY“, „BZ“, „FA“, „FB“, „FC“, „FD“, „FE“, „FF“, „FG“, „FH“, „FJ“, „FK“, „FL“, „FM“, „FN“, „FP“, „FQ“, „FR“, „FS“, „FT“, „FU“, „FV“, „FW“, „FX“, „FY“, „FZ“, „SA“, „SB“, „SC“, „SD“, „SE“, „SF“, „SG“, „SH“, „SJ“, „SK“, „SL“, „SM“, „SN“, „SP“, „SQ“, „SR“, „SS“, „ST“, „SU“, „SV“, „SW“, „SX“, „SY“, „SZ“) + $Wandler2 = @() + $ZuWandler2 = @(„DQ“, „CA“, „CB“, „CC“, „CD“, „CE“, „CF“, „CG“, „CH“, „CJ“, „CK“, „CL“, „CM“, „CN“, „CP“, „CQ“, „CR“, „CS“, „CT“, „CU“, „CV“, „CW“, „CX“, „CY“, „CZ“, „EA“, „EB“, „EC“, „ED“, „EE“, „EF“, „EG“, „EH“, „EJ“, „EK“, „EL“, „EM“, „EN“, „EP“, „EQ“, „ER“, „ES“, „ET“, „EU“, „EV“, „EW“, „EX“, „EY“, „EZ“, „GA“, „GB“, „GC“, „GD“, „GE“, „GF“, „GG“, „GH“, „GJ“, „GK“, „GL“, „GM“, „GN“, „GP“, „GQ“, „GR“, „GS“, „GT“, „GU“, „GV“, „GW“, „GX“, „GY“, „GZ“, „HA“, „HB“, „HC“, „HD“, „HE“, „HF“, „HG“, „HH“, „HJ“, „HK“, „HL“, „HM“, „HN“, „HP“, „HQ“, „HR“, „HS“, „HT“, „HU“, „HV“, „HW“, „HX“, „HY“, „HZ“, „KA“, „KB“, „KC“, „KD“, „KE“, „KF“, „KG“, „KH“, „KJ“, „KK“, „KL“, „KM“, „KN“, „KP“, „KQ“, „KR“, „KS“, „KT“, „KU“, „KV“, „KW“, „KX“, „KY“, „KZ“, „MA“, „MB“, „MC“, „MD“, „ME“, „MF“, „MG“, „MH“, „MJ“, „MK“, „ML“, „MM“, „MN“, „MP“, „MQ“, „MR“, „MQ“, „MR“, „MS“, „MT“, „MU“, „MV“, „MW“, „MX“, „MY“, „MZ“, „PA“, „PB“, „PC“, „PD“, „PE“, „PF“, „PG“, „PH“, „PJ“, „PK“, „PL“, „PM“, „PN“, „PP“, „PQ“, „PR“, „PS“, „PT“, „PU“, „PV“, „PW“, „PX“, „PY“, „PZ“, „QA“, „QB“, „QC“, „QD“, „QE“, „QF“, „QG“, „QH“, „QJ“, „QK“, „QL“, „QM“, „QN“, „QP“, „QQ“, „QR“, „QS“, „QT“, „QU“, „QV“, „QW“, „QX“, „QY“, „QZ“, „RA“, „RB“, „RC“, „RD“, „RE“, „RF“, „RG“, „RH“, „RJ“, „RK“, „RL“, „RM“, „RN“, „RP“, „RQ“, „RR“, „RS“, „RT“, „RU“, „RV“, „RW“, „RX“, „RY“, „RZ“, „TA“, „TB“, „TC“, „TD“, „TE“, „TF“, „TG“, „TH“, „TJ“, „TK“, „TL“, „TM“, „TN“, „TP“, „TQ“, „TR“, „TS“, „TT“, „TU“, „TV“, „TW“, „TX“, „TY“, „TZ“) + $Fehler = @() + + $Ursprungdatei = Get-Content $PfadUrsprungsdatei + + foreach ($Eintrag in $Ursprungdatei) + { + $Eintragszeile = $Eintrag.Split("'") + $BMKZahl = $Eintragszeile[1] + $BMKZahl = $BMKZahl.TrimStart("'") + $Kommentar = $Eintragszeile[3] + $Kommentar = $Kommentar.TrimEnd("'") + + if ($($($BMKZahl.Substring(0,2)) -in $ZuWandler1)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $Umwandler1 + $BMKZahl + $Wandler1 += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + elseif ($($($BMKZahl.Substring(0,2)) -in $ZuWandler2)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $Umwandler2 + $BMKZahl + $Wandler2 += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + else + { + Write-Host "Achtung, Fehler bei " $BMKZahl $Kommentar + $Fehler += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + + Write-Host "In Excel schreiben: BMKZahl: " $BMKZahl " Kommentar: " $Kommentar + $Blatt.Cells.Item($i,1) = $BMKZahl + $Blatt.Cells.Item($i,2) = $Kommentar + + $i++ + } + + $Mappe.Save() + $Datei.Quit() + + $GleicheWandler1 = GleicheFinden $Wandler1 + $GleicheWandler2 = GleicheFinden $Wandler2 + Write-Host "Gleiche für " $Umwandler1 ": " $GleicheWandler1 + Write-Host "Gleiche für " $Umwandler2 ": " $GleicheWandler2 + + return $GleicheWandler1, $GleicheWandler2 +} + +Function GleicheFinden ($ZuUeberpruefen) +{ + $ZuUeberpruefen = $ZuUeberpruefen | Sort-Object "Name" + $Gleiche = @() + for ($i = 0; $i -lt $($ZuUeberpruefen.Count - 1); $i++) + { + $IstGleich = $($ZuUeberpruefen[$i].Name -eq $ZuUeberpruefen[$($i+1)].Name) + if ($IstGleich) + { + # Eintrag hinzufügen + if (-not $($Gleiche[-1].Zeile -eq $ZuUeberpruefen[$i].Zeile)) + { + $Gleiche += $ZuUeberpruefen[$i] + } + $Gleiche += $ZuUeberpruefen[$($i+1)] + #Write-Host "Gleiche: " $Gleiche + } + } + + if ( $($Gleiche.Length -eq 0)) + { + $Gleiche += @([PSCustomObject]@{ + Name = "Keine" + Zeile = "Alle" + }) + } + + return $Gleiche +} + +Main \ No newline at end of file diff --git a/Test-Skripte/GUI-Angepasst2_Backup1.ps1 b/Test-Skripte/GUI-Angepasst2_Backup1.ps1 new file mode 100644 index 0000000..bba2136 --- /dev/null +++ b/Test-Skripte/GUI-Angepasst2_Backup1.ps1 @@ -0,0 +1,359 @@ +# Änderungsziel vs. 1: Funktion bei Klick auf "Auswählen" und "Zurück" auslagern +# Todo: "Zurück" auslagern + +Function Main +{ + +#Ändern? Laufwerke sollten möglichst in der GUI initialisert werden +$Laufwerke = LaufwerkeFinden + +[System.String]$Pfad = Gui $Laufwerke + +Write-Host "Dateityp nach Übergabe: " $Pfad.GetType() +Write-Host "Datei ausgewählt mit dem Verzeichnis " $Pfad +} + + +Function Gui ($Laufwerke) +{ +[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") +[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") + +# Eigenschaften Fenster +$Fenster = New-Object System.Windows.Forms.Form +$Fenster.Text = "Laufwerke" +$Fenster.Size = New-Object System.Drawing.Size(900,600) #Breite, Höhe +$Fenster.StartPosition = "CenterScreen" +$Fenster.KeyPreview = $true # was macht das? +$Fenster.MaximumSize = $Fenster.Size # legt fest, dass Größe des Fensters nicht verändert werden kann +$Fenster.MinimumSize = $Fenster.Size + +# PfadFeld +$PfadFeld = New-Object System.Windows.Forms.TextBox +$PfadFeld.Location = New-Object System.Drawing.Size(10,10) +$PfadFeld.Size = New-Object System.Drawing.Size(860,20) +#$PfadFeld.Text = $Pfad #Bringt nur etwas, wenn $Pfad einen Anfangswert hat, da der Text nicht laufend aktualisiert wird +$PfadFeld.Add_KeyDown({ + # Reaktion bei gedrückter Taste + if ($_.KeyCode -eq "Enter") + { + $Pfad = $PfadFeld.Text + # Soll zurückgeben: $true => existiert oder ist *.txt-Datei; $false => existiert nicht + $PfadExistiert = PfadExistiert $Pfad + Write-Host "Check Pfadtyp: " $PfadExistiert + + if ($PfadExistiert) + { + Write-host "Pfad aktualisieren" + VerzeichnisAuswaehlen "" $Pfad + } + else + { + Write-Host "Else-Fall" + # Fehler-Fenster öffnen? + # Zurück zu Laufwerke + # In Funktion auslagern + $Pfad = "" + $Optionen = LaufwerkeFinden $Pfad + $PfadFeld.Text = "" + $Fenster.Text = "Laufwerke" + $ListeOrdnernamen.Items.Clear() + foreach ($Option in $Optionen) + { + if ($Option.Length -gt 0) + { + $ListeOrdnernamen.Items.Add($Option) + } + } + } + } +}) +$Fenster.Controls.Add($PfadFeld) + +# ListeOrdnernamen +$ListeOrdnernamen = New-Object System.Windows.Forms.ListBox +$ListeOrdnernamen.Location = New-Object System.Drawing.Size(10,40) +$ListeOrdnernamen.Size = New-Object System.Drawing.Size(860,20) +$ListeOrdnernamen.Height = 450 +foreach ($Laufwerk in $Laufwerke) +{ + $ListeOrdnernamen.Items.Add($Laufwerk) +} +$ListeOrdnernamen.Add_DoubleClick({ + Write-Host "In Liste per Doppelklick ausgewählt" + + # Variablen bestimmen zur Übergabe + $Auswahl = $ListeOrdnernamen.SelectedItem + # Falls nicht aktiv ein Eintrag gewählt wurde, in den obersten navigieren + if ($($Auswahl.length -eq 0)) + { + $Auswahl = $ListeOrdnernamen.Items[0] + } + $Pfad = $PfadFeld.Text + Write-Host "Gewählter Ordner/ Datei: " $Auswahl + Write-Host "Vorheriger Pfad: " $Pfad + + # Pfad aktualisieren + VerzeichnisAuswaehlen $Pfad $Auswahl +}) +$ListeOrdnernamen.Add_KeyDown({ + # Reaktion bei gedrückter Taste + # In Funktion auslagern? + if ($_.KeyCode -eq "Enter") + { + Write-Host "Enter gedrückt" + + # Variablen bestimmen zur Übergabe + $Auswahl = $ListeOrdnernamen.SelectedItem + # Falls nicht aktiv ein Eintrag gewählt wurde, in den obersten navigieren + if ($($Auswahl.length -eq 0)) + { + $Auswahl = $ListeOrdnernamen.Items[0] + } + $Pfad = $PfadFeld.Text + Write-Host "Gewählter Ordner/ Datei: " $Auswahl + Write-Host "Vorheriger Pfad: " $Pfad + + # Pfad aktualisieren + VerzeichnisAuswaehlen $Pfad $Auswahl + } + elseif ($_.KeyCode -eq "Back") + { + Write-Host "Back gedrückt" + + Write-Host "Pfad ausgabe: " $PfadFeld.Text + $Pfad = $PfadFeld.Text + + #Pfad aktualisieren + VerzeichnisZurueck $Pfad + } + else + { + Write-Host "Gedrückte Taste: " $_.KeyCode + } +}) +$Fenster.Controls.Add($ListeOrdnernamen) + +<# +# Beispiel Textfeld +$Textfeld1 = New-Object System.Windows.Forms.Label +$Textfeld1.Location = New-Object System.Drawing.Size(7,500) +$Textfeld1.Size = New-Object System.Drawing.Size(130,15) +$Textfeld1.Text = "Beispiel Text" +$Fenster.Controls.Add($Textfeld1) +#> + +# ZurückButton +$ZurückButton = New-Object System.Windows.Forms.Button +$ZurückButton.Location = New-Object System.Drawing.Size(10,500) +$ZurückButton.Size = New-Object System.Drawing.Size(100,30) +$ZurückButton.Text = "Zurück" +$ZurückButton.Add_Click({ + Write-Host "Pfad ausgabe: " $PfadFeld.Text + $Pfad = $PfadFeld.Text + + #Pfad aktualisieren + VerzeichnisZurueck $Pfad +}) +$ZurückButton.Add_KeyDown({ + # In Funktion auslagern? + # Reaktion bei gedrückter Taste + if ($_.KeyCode -eq "Back") + { + Write-Host "Back gedrückt" + $Pfad = $PfadFeld.Text + + VerzeichnisZurueck $Pfad + } + +}) +$Fenster.Controls.Add($ZurückButton) + +# AuswählenButton +$AuswählenButton = New-Object System.Windows.Forms.Button +$AuswählenButton.Location = New-Object System.Drawing.Size(750,500) +$AuswählenButton.Size = New-Object System.Drawing.Size(100,30) +$AuswählenButton.Text = "Auswählen" +$AuswählenButton.Add_Click({ + # Aktion bei Klick oder Enter + + # Variablen bestimmen zur Übergabe + $Auswahl = $ListeOrdnernamen.SelectedItem + # Falls nicht aktiv ein Eintrag gewählt wurde, in den obersten navigieren + if ($($Auswahl.length -eq 0)) + { + $Auswahl = $ListeOrdnernamen.Items[0] + } + $Pfad = $PfadFeld.Text + Write-Host "Gewählter Ordner/ Datei: " $Auswahl + Write-Host "Vorheriger Pfad: " $Pfad + + # Pfad aktualisieren + VerzeichnisAuswaehlen $Pfad $Auswahl +}) +$Fenster.Controls.Add($AuswählenButton) + +$Fenster.Add_Shown({$Fenster.Activate()}) +[void]$Fenster.ShowDialog() +} + +Function VerzeichnisAuswaehlen ($Pfad, $Auswahl) +{ +if ($Pfad.length -gt 0) +{ + $Pfad = Join-Path -Path $Pfad -ChildPath $Auswahl -Resolve +} +else +{ + $Pfad = $Auswahl +} + +#Erkennen, ob *.txt-Datei gewählt wurde -> ggf. Auswahl abgeschlossen +if ($($Auswahl -match ".txt")) +{ + Write-Host ".txt-Datei ausgewählt, Pfad: " $Pfad + Write-Host "Dateityp: " $Pfad.GetType() + $Fenster.Dispose() + NachAuswahl $Pfad + #return $Pfad +} + +# Werte in Form aktualisieren +$PfadFeld.Text = $Pfad +$Fenster.Text = $Auswahl +$ListeOrdnernamen.Items.Clear() +$Optionen = Optionen $Pfad +Write-Host "Mögliche Optionen: " $Optionen +foreach ($Option in $Optionen) +{ + # Write-Host "Option: " $Option + if ($Option.length -gt 0) + { + $ListeOrdnernamen.Items.Add($Option) + } +} +Write-Host "Neuer Pfad: " $Pfad + +return +} + +Function NachAuswahl ($Pfad) +{ +Write-Host "Auswahl abgeschlossen, ab jetzt .txt-Datei bearbeiten" +Write-Host "Name in Funktion: " $Pfad + +#Exit # Wirft Fehler +} + +Function VerzeichnisZurueck ($Pfad) +{ + +if ($Pfad.Length -gt 3) +{ + # Weiter mit Ordnern/Dateien + Write-Host "Ordner/ Dateien anzeigen" + $Pfad = Split-Path $Pfad + Write-Host "Neuer Pfad : " $Pfad + Write-Host "Pfadwert vor Übergabe: " $Pfad + $Optionen = Optionen $Pfad +} +elseif ($Pfad.Length -le 3) +{ + # Weiter mit Laufwerken + Write-Host "Laufwerke anzeigen" + $Pfad = "" + $Optionen = LaufwerkeFinden $Pfad +} +else +{ + # Fehler/ Nichts tun? + # Ermitteln: wann tritt dieser Fall ein? +} + +# In Ausgabe schreiben +$PfadFeld.Text = $Pfad +if ($Pfad.Length -gt 3) +{ + $Fenster.Text = $(Split-Path $Pfad -Leaf) +} +else +{ + $Fenster.Text = "Laufwerke" +} +$ListeOrdnernamen.Items.Clear() +foreach ($Option in $Optionen) +{ + # Write-Host "Option: " $Option + if ($Option.Length -gt 0) + { + $ListeOrdnernamen.Items.Add($Option) + } +} + +return +} + +Function PfadExistiert ($Pfad) +{ +if ($(Test-Path $Pfad -PathType Container) -or $(Test-Path $Pfad -Include "*.txt")) +{ + Write-Host "Bei dem Verzeichnis handelt es sich um eine *.txt-Datei oder ein gültiges Verzeichnis" + return $true +} +else +{ + Write-Host "Das Verzeichnis existiert nicht oder es wurde keine *.txt-Datei gewählt" + return $false +} +} + +Function LaufwerkeFinden() +{ +$Laufwerke = $(Get-PSDrive | where {$_.Free}).Name +$i = 0 + +foreach($Laufwerk in $Laufwerke) +{ + $Laufwerke[$i] = $Laufwerk + ":\" + $i++ +} + +return $Laufwerke +} + +Function TxtDateienFinden($Pfad) +{ +$TxtDateien = $(Get-Childitem $Pfad\*.txt) + +if ($TxtDateien.Length -gt 0) +{ + return $(Split-Path $TxtDateien -Leaf) +} +else +{ + return +} +} + +Function UnterOrdnerFinden($Pfad) +{ +#abfangen: keine Ordner vorhanden -> nicht nötig, da keine weitere Verarbeitung +$Ordner = $(Get-Childitem $Pfad -Directory) +return $Ordner +} + +Function Optionen($Pfad) +{ +# Unterordner und .txt-Dateien finden +# Typzuweisung nötig, da aus unbekanntem Grund sonst Unterordner eines Ordners, der mit "_" beginnt, nicht gefunden werden können +[System.Object[]]$UnterOrdner = UnterOrdnerFinden $Pfad +$TxtDateien = TxtDateienFinden $Pfad + +#Gibt aktuell auch Index und Typ (System.IO.DirectoryInfo bzw. System.String) zurück +$Optionen = $UnterOrdner + $TxtDateien + +return $Optionen +} + + +Main \ No newline at end of file diff --git a/Test-Skripte/GUI-Angepasst2_Backup2.ps1 b/Test-Skripte/GUI-Angepasst2_Backup2.ps1 new file mode 100644 index 0000000..727e174 --- /dev/null +++ b/Test-Skripte/GUI-Angepasst2_Backup2.ps1 @@ -0,0 +1,387 @@ +# Änderungsziel vs. 1: Funktion bei Klick auf "Auswählen" und "Zurück" auslagern +# Todo: "Zurück" auslagern + +Function Main +{ + +#Ändern? Laufwerke sollten möglichst in der GUI initialisert werden +$Laufwerke = LaufwerkeFinden + +[System.String]$Pfad = Gui $Laufwerke + +# Write-Host "Dateityp nach Übergabe: " $Pfad.GetType() +Write-Host "Dateirückgabe in Main: " $Pfad +} + + +Function Gui ($Laufwerke) +{ +[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") +[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") + +# Eigenschaften Fenster +$Fenster = New-Object System.Windows.Forms.Form +$Fenster.Text = "Laufwerke" +$Fenster.Size = New-Object System.Drawing.Size(900,600) #Breite, Höhe +$Fenster.StartPosition = "CenterScreen" +$Fenster.KeyPreview = $true # was macht das? +$Fenster.MaximumSize = $Fenster.Size # legt fest, dass Größe des Fensters nicht verändert werden kann +$Fenster.MinimumSize = $Fenster.Size + +# PfadFeld +$PfadFeld = New-Object System.Windows.Forms.TextBox +$PfadFeld.Location = New-Object System.Drawing.Size(10,10) +$PfadFeld.Size = New-Object System.Drawing.Size(860,20) +#$PfadFeld.Text = $Pfad #Bringt nur etwas, wenn $Pfad einen Anfangswert hat, da der Text nicht laufend aktualisiert wird +$PfadFeld.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionPfadFeld $Taste +}) +$Fenster.Controls.Add($PfadFeld) + +# ListeOrdnernamen +$ListeOrdnernamen = New-Object System.Windows.Forms.ListBox +$ListeOrdnernamen.Location = New-Object System.Drawing.Size(10,40) +$ListeOrdnernamen.Size = New-Object System.Drawing.Size(860,20) +$ListeOrdnernamen.Height = 450 +foreach ($Laufwerk in $Laufwerke) +{ + $ListeOrdnernamen.Items.Add($Laufwerk) +} +$ListeOrdnernamen.Add_DoubleClick({ + # Variablen bestimmen zur Übergabe + $Auswahl = $ListeOrdnernamen.SelectedItem + $Pfad = $PfadFeld.Text + Write-Host "Gewählter Ordner/ Datei: " $Auswahl + Write-Host "Vorheriger Pfad: " $Pfad + + # Pfad aktualisieren + VerzeichnisAuswaehlen $Pfad $Auswahl +}) +$ListeOrdnernamen.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionListeOrdnernamen $Taste +}) +$Fenster.Controls.Add($ListeOrdnernamen) + +<# +# Beispiel Textfeld +$Textfeld1 = New-Object System.Windows.Forms.Label +$Textfeld1.Location = New-Object System.Drawing.Size(7,500) +$Textfeld1.Size = New-Object System.Drawing.Size(130,15) +$Textfeld1.Text = "Beispiel Text" +$Fenster.Controls.Add($Textfeld1) +#> + +# ZurückButton +$ZurückButton = New-Object System.Windows.Forms.Button +$ZurückButton.Location = New-Object System.Drawing.Size(10,500) +$ZurückButton.Size = New-Object System.Drawing.Size(100,30) +$ZurückButton.Text = "Zurück" +$ZurückButton.Add_Click({ + Write-Host "Pfad ausgabe: " $PfadFeld.Text + $Pfad = $PfadFeld.Text + + #Pfad aktualisieren + VerzeichnisZurueck $Pfad +}) +$ZurückButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionButtons $Taste +}) +$Fenster.Controls.Add($ZurückButton) + +# AuswählenButton +$AuswählenButton = New-Object System.Windows.Forms.Button +$AuswählenButton.Location = New-Object System.Drawing.Size(750,500) +$AuswählenButton.Size = New-Object System.Drawing.Size(100,30) +$AuswählenButton.Text = "Auswählen" +$AuswählenButton.Add_Click({ + # Variablen bestimmen zur Übergabe + $Auswahl = $ListeOrdnernamen.SelectedItem + # Falls nicht aktiv ein Eintrag gewählt wurde, in den obersten navigieren + if ($($Auswahl.length -eq 0)) + { + $Auswahl = $ListeOrdnernamen.Items[0] + } + $Pfad = $PfadFeld.Text + Write-Host "Gewählter Ordner/ Datei: " $Auswahl + Write-Host "Vorheriger Pfad: " $Pfad + + # Pfad aktualisieren + VerzeichnisAuswaehlen $Pfad $Auswahl +}) +$AuswählenButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionButtons $Taste +}) +$Fenster.Controls.Add($AuswählenButton) + +$Fenster.Add_Shown({$Fenster.Activate()}) +[void]$Fenster.ShowDialog() +} + +#--------------------------------------------------------- E N D E G U I ---------------------------------------------------------------------- + +Function VerzeichnisAuswaehlen ($Pfad, $Auswahl) +{ +if ($Pfad.length -gt 0) +{ + $Pfad = Join-Path -Path $Pfad -ChildPath $Auswahl -Resolve +} +else +{ + $Pfad = $Auswahl +} + +#Falls nicht aktiv ein Eintrag ausgewählt wurde, den obersten wählen +if ($Auswahl.length -eq 0) +{ + $Auswahl = $ListeOrdnernamen.Items[0] +} + +# Erkennen, ob *.txt-Datei gewählt wurde -> ggf. Auswahl abgeschlossen +if ($($Auswahl -match ".txt")) +{ + Write-Host ".txt-Datei ausgewählt, Pfad: " $Pfad + Write-Host "Dateityp: " $Pfad.GetType() + $Fenster.Dispose() + NachAuswahl $Pfad + #return $Pfad +} + +AnzeigeAktualisieren $Pfad + +return +} + +Function NachAuswahl ($Pfad) +{ +Write-Host "Auswahl abgeschlossen, ab jetzt .txt-Datei bearbeiten" +Write-Host "Name in Funktion: " $Pfad + +#Exit # Wirft Fehler, sollte man sich aber sparen können +} + +# Bekommt Pfad, stellt fest ob Laufwerke oder Ordner angezeigt werden müssen und aktualisiert entsprechend alles +# Für Laufwerke muss $Pfad = "" sein +Function AnzeigeAktualisieren ($Pfad) +{ +Write-Host "Übergebener Pfad: " $Pfad +# Feststellen, ob Ordner oder Laufwerke angezeigt werden müssen +if ($Pfad.Length -ne "") +{ + # Es handelt sich um Ordner + $Optionen = Optionen $Pfad + $Fenster.Text = $(Split-Path $Pfad -Leaf) +} +elseif ($Pfad.Length -eq "") +{ + # Es handelt sich um Laufwerke + $Optionen = LaufwerkeFinden + $Pfad = "" + $Fenster.Text = "Laufwerke" +} +else +{ + Write-Host "Fehler bei Anzeige aktualisieren" + # Fehler(?) +} +$PfadFeld.Text = $Pfad +$ListeOrdnernamen.Items.Clear() +foreach ($Option in $Optionen) +{ + if ($Option.Length -gt 0) + { + $ListeOrdnernamen.Items.Add($Option) + } +} +return +} + +Function VerzeichnisZurueck ($Pfad) +{ +if ($Pfad.Length -gt 3) +{ + # Weiter mit Ordnern + Write-Host "Ordner anzeigen" + $Pfad = Split-Path $Pfad +} +elseif ($Pfad.Length -le 3) +{ + # Weiter mit Laufwerken + Write-Host "Laufwerke anzeigen" + $Pfad = "" +} +else +{ + Write-Host "Fehler bei Verzeichnis zurück" + # Fehler/ Nichts tun? + # Ermitteln: wann tritt dieser Fall ein? +} +AnzeigeAktualisieren $Pfad +return +} + +Function PfadExistiert ($Pfad) +{ +if ($(Test-Path $Pfad -PathType Container) -or $(Test-Path $Pfad -Include "*.txt")) +{ + Write-Host "Bei dem Verzeichnis handelt es sich um eine *.txt-Datei oder ein gültiges Verzeichnis" + return $true +} +else +{ + Write-Host "Das Verzeichnis existiert nicht oder es wurde keine *.txt-Datei gewählt" + return $false +} +} + +Function TastenReaktionPfadFeld($Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +switch ($Taste){ + "Return" { + # Write-Host "Enter gedrückt" + $Pfad = $PfadFeld.Text + # Write-Host "Pfad: " $Pfad + + if ($Pfad -eq "") + { + # Laufwerke aktualisieren + AnzeigeAktualisieren $Pfad + } + elseif (PfadExistiert $Pfad) + { + $PfadEnde = $(Split-Path $Pfad -Leaf) + # Write-Host "Pfadende: " $PfadEnde + if ($($PfadEnde -match ".txt")) + { + Write-Host ".txt-Datei ausgewählt, Pfad: " $Pfad + Write-Host "Dateityp: " $Pfad.GetType() + $Fenster.Dispose() + NachAuswahl $Pfad + #return $Pfad + } + else + { + AnzeigeAktualisieren $Pfad + } + } + else + { + AnzeigeAktualisieren "" + } + } + default { + # Write-Host "Gedrückte Taste: " $Taste + } +} +return +} + +Function TastenReaktionListeOrdnernamen($Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +switch ($Taste){ + "Return" { + # Write-Host "Enter gedrückt" + $Auswahl = $ListeOrdnernamen.SelectedItem + if ($($Auswahl.Length -eq 0)) + { + $Auswahl = $ListeOrdnernamen.Items[0] + } + $Pfad = $PfadFeld.Text + # Write-Host "Auswahl: " $Auswahl + # Write-Host "Pfad: " $Pfad + + VerzeichnisAuswaehlen $Pfad $Auswahl + } + "Back" { + # Write-Host "Back gedrückt" + $Pfad = $PfadFeld.Text + # Write-Host "Pfad: " $Pfad + + # Pfad aktualisieren + VerzeichnisZurueck $Pfad + } + default { + # Write-Host "Gedrückte Taste: " $Taste + } +} +return +} + +Function TastenReaktionButtons($Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +switch ($Taste){ + "Back" { + # Write-Host "Back gedrückt" + $Pfad = $PfadFeld.Text + # Write-Host "Pfad: " $Pfad + + # Pfad aktualisieren + VerzeichnisZurueck $Pfad + } + default { + # Write-Host "Gedrückte Taste: " $Taste + } +} +return +} + +Function LaufwerkeFinden() +{ +$Laufwerke = $(Get-PSDrive | where {$_.Free}).Name +$i = 0 + +foreach($Laufwerk in $Laufwerke) +{ + $Laufwerke[$i] = $Laufwerk + ":\" + $i++ +} + +return $Laufwerke +} + +Function TxtDateienFinden($Pfad) +{ +$TxtDateien = $(Get-Childitem $Pfad\*.txt) + +if ($TxtDateien.Length -gt 0) +{ + return $(Split-Path $TxtDateien -Leaf) +} +else +{ + return +} +} + +Function UnterOrdnerFinden($Pfad) +{ +#abfangen: keine Ordner vorhanden -> nicht nötig, da keine weitere Verarbeitung +$Ordner = $(Get-Childitem $Pfad -Directory) +return $Ordner +} + +Function Optionen($Pfad) +{ +# Unterordner und .txt-Dateien finden +# Typzuweisung nötig, da aus unbekanntem Grund sonst Unterordner eines Ordners, der mit "_" beginnt, nicht gefunden werden können +[System.Object[]]$UnterOrdner = UnterOrdnerFinden $Pfad +$TxtDateien = TxtDateienFinden $Pfad + +#Gibt aktuell auch Index und Typ (System.IO.DirectoryInfo bzw. System.String) zurück +$Optionen = $UnterOrdner + $TxtDateien + +return $Optionen +} + + +Main \ No newline at end of file diff --git a/Test-Skripte/GUI-Angepasst2_FunktionierenderExplorer.ps1 b/Test-Skripte/GUI-Angepasst2_FunktionierenderExplorer.ps1 new file mode 100644 index 0000000..b308ece --- /dev/null +++ b/Test-Skripte/GUI-Angepasst2_FunktionierenderExplorer.ps1 @@ -0,0 +1,391 @@ +# Änderungsziel vs. 1: Funktion bei Klick auf "Auswählen" und "Zurück" auslagern +# Knwon problem: Zugriffsversuch auf einen Ordner, für den der Nutzer keine Freigabe hat. Aktuell kein Lösungsansatz bekannt. +# Todo: siehe Zettel! + +Function Main +{ + +$StartPfad = "R:\m.kraft\Excel Werte ändern" + +$Pfad = Gui $StartPfad #$Laufwerke + +# Write-Host "Dateityp nach Übergabe: " $Pfad.GetType() +Write-Host "Dateirückgabe in Main: " $Pfad +} + + +Function Gui ($StartPfad) +{ +[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") +[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") + +# Eigenschaften Fenster +$Fenster = New-Object System.Windows.Forms.Form +$Fenster.Size = New-Object System.Drawing.Size(900,600) #Breite, Höhe +$Fenster.StartPosition = "CenterScreen" +$Fenster.KeyPreview = $true # was macht das? +$Fenster.MaximumSize = $Fenster.Size # legt fest, dass Größe des Fensters nicht verändert werden kann +$Fenster.MinimumSize = $Fenster.Size + +# PfadFeld +$PfadFeld = New-Object System.Windows.Forms.TextBox +$PfadFeld.Location = New-Object System.Drawing.Size(10,10) +$PfadFeld.Size = New-Object System.Drawing.Size(860,20) +$PfadFeld.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionPfadFeld $Taste +}) +$Fenster.Controls.Add($PfadFeld) + +# ListeOrdnernamen +$ListeOrdnernamen = New-Object System.Windows.Forms.ListBox +$ListeOrdnernamen.Location = New-Object System.Drawing.Size(10,40) +$ListeOrdnernamen.Size = New-Object System.Drawing.Size(860,20) +$ListeOrdnernamen.Height = 450 +$ListeOrdnernamen.Add_DoubleClick({ + # Variablen bestimmen zur Übergabe + $Auswahl = $ListeOrdnernamen.SelectedItem + $Pfad = $PfadFeld.Text + # Write-Host "Gewählter Ordner/ Datei: " $Auswahl + # Write-Host "Vorheriger Pfad: " $Pfad + + # Pfad aktualisieren + VerzeichnisAuswaehlen $Pfad $Auswahl +}) +$ListeOrdnernamen.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionListeOrdnernamen $Taste +}) +$Fenster.Controls.Add($ListeOrdnernamen) + +<# +# Beispiel Textfeld +$Textfeld1 = New-Object System.Windows.Forms.Label +$Textfeld1.Location = New-Object System.Drawing.Size(7,500) +$Textfeld1.Size = New-Object System.Drawing.Size(130,15) +$Textfeld1.Text = "Beispiel Text" +$Fenster.Controls.Add($Textfeld1) +#> + +# ZurückButton +$ZurückButton = New-Object System.Windows.Forms.Button +$ZurückButton.Location = New-Object System.Drawing.Size(10,500) +$ZurückButton.Size = New-Object System.Drawing.Size(100,30) +$ZurückButton.Text = "Zurück" +$ZurückButton.Add_Click({ + # Write-Host "Pfad ausgabe: " $PfadFeld.Text + $Pfad = $PfadFeld.Text + + #Pfad aktualisieren + VerzeichnisZurueck $Pfad +}) +$ZurückButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionButtons $Taste +}) +$Fenster.Controls.Add($ZurückButton) + +# AuswählenButton +$AuswählenButton = New-Object System.Windows.Forms.Button +$AuswählenButton.Location = New-Object System.Drawing.Size(750,500) +$AuswählenButton.Size = New-Object System.Drawing.Size(100,30) +$AuswählenButton.Text = "Auswählen" +$AuswählenButton.Add_Click({ + # Variablen bestimmen zur Übergabe + $Auswahl = $ListeOrdnernamen.SelectedItem + # Falls nicht aktiv ein Eintrag gewählt wurde, in den obersten navigieren + if ($($Auswahl.length -eq 0)) + { + $Auswahl = $ListeOrdnernamen.Items[0] + } + $Pfad = $PfadFeld.Text + # Write-Host "Gewählter Ordner/ Datei: " $Auswahl + # Write-Host "Vorheriger Pfad: " $Pfad + + # Pfad aktualisieren + VerzeichnisAuswaehlen $Pfad $Auswahl +}) +$AuswählenButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionButtons $Taste +}) +$Fenster.Controls.Add($AuswählenButton) + +# Dieser Funktionsaufruf zerstört die Rückgabe, wenn er keiner Variable zugewiesen wird +$A = AnzeigeAktualisieren $StartPfad + +$Fenster.Add_Shown({$Fenster.Activate()}) +[void]$Fenster.ShowDialog() + +$Rueckgabe = $PfadFeld.Text +Write-Host "Rückgabe: " $Rueckgabe +return $Rueckgabe +} + +#--------------------------------------------------------- E N D E G U I ---------------------------------------------------------------------- + +Function VerzeichnisAuswaehlen ($Pfad, $Auswahl) +{ +if ($Pfad.length -gt 0) +{ + $Pfad = Join-Path -Path $Pfad -ChildPath $Auswahl -Resolve +} +else +{ + $Pfad = $Auswahl +} + +#Falls nicht aktiv ein Eintrag ausgewählt wurde, den obersten wählen +if ($Auswahl.length -eq 0) +{ + $Auswahl = $ListeOrdnernamen.Items[0] +} + +# Erkennen, ob *.txt-Datei gewählt wurde -> ggf. Auswahl abgeschlossen +if ($($Auswahl -match ".txt")) +{ + Write-Host ".txt-Datei ausgewählt, Pfad: " $Pfad + Write-Host "Dateityp: " $Pfad.GetType() + $Fenster.Dispose() + # Ist zwar sachlich gesehen unsinn, aber sonst funktioniert Return in der GUI nicht + $PfadFeld.Text = $Pfad + return +} + +AnzeigeAktualisieren $Pfad + +return +} + +# Bekommt Pfad, stellt fest ob Laufwerke oder Ordner angezeigt werden müssen und aktualisiert entsprechend alles +# Für Laufwerke muss $Pfad = "" sein +Function AnzeigeAktualisieren ($Pfad) +{ +Write-Host "Übergebener Pfad: " $Pfad + +# Sicherstellen, dass es das Verzeichnis gibt +if ($($Pfad -eq "") -or $(PfadExistiert $Pfad)) +{ + # Feststellen, ob Ordner oder Laufwerke angezeigt werden müssen + if ($Pfad.Length -ne "") + { + # Es handelt sich um Ordner + $Optionen = Optionen $Pfad + $Fenster.Text = $(Split-Path $Pfad -Leaf) + } + elseif ($Pfad.Length -eq "") + { + # Es handelt sich um Laufwerke + $Optionen = LaufwerkeFinden + $Pfad = "" + $Fenster.Text = "Laufwerke" + } + else + { + Write-Host "Fehler bei Anzeige aktualisieren" + # Fehler(?) + } + $PfadFeld.Text = $Pfad + $ListeOrdnernamen.Items.Clear() + foreach ($Option in $Optionen) + { + if ($Option.Length -gt 0) + { + $ListeOrdnernamen.Items.Add($Option) + } + } +} +else +{ + AnzeigeAktualisieren "" +} +return +} + +Function VerzeichnisZurueck ($Pfad) +{ +if ($Pfad.Length -gt 3) +{ + # Weiter mit Ordnern + Write-Host "Ordner anzeigen" + $Pfad = Split-Path $Pfad +} +elseif ($Pfad.Length -le 3) +{ + # Weiter mit Laufwerken + Write-Host "Laufwerke anzeigen" + $Pfad = "" +} +else +{ + Write-Host "Fehler bei Verzeichnis zurück" + # Fehler/ Nichts tun? + # Ermitteln: wann tritt dieser Fall ein? +} +AnzeigeAktualisieren $Pfad +return +} + +Function PfadExistiert ($Pfad) +{ +if ($(Test-Path $Pfad -PathType Container) -or $(Test-Path $Pfad -Include "*.txt")) +{ + Write-Host "Bei dem Verzeichnis handelt es sich um eine *.txt-Datei oder ein gültiges Verzeichnis" + return $true +} +else +{ + Write-Host "Das Verzeichnis existiert nicht oder es wurde keine *.txt-Datei gewählt" + return $false +} +} + +Function TastenReaktionPfadFeld($Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +switch ($Taste){ + "Return" { + # Write-Host "Enter gedrückt" + $Pfad = $PfadFeld.Text + # Write-Host "Pfad: " $Pfad + + if ($Pfad -eq "") + { + # Laufwerke aktualisieren + AnzeigeAktualisieren $Pfad + } + elseif (PfadExistiert $Pfad) + { + $PfadEnde = $(Split-Path $Pfad -Leaf) + # Write-Host "Pfadende: " $PfadEnde + if ($($PfadEnde -match ".txt")) + { + Write-Host ".txt-Datei ausgewählt, Pfad: " $Pfad + Write-Host "Dateityp: " $Pfad.GetType() + $Fenster.Dispose() + # Ist zwar sachlich gesehen unsinn, aber sonst funktioniert Return in der GUI nicht richtig + $PfadFeld.Text = $Pfad + return + } + else + { + AnzeigeAktualisieren $Pfad + } + } + else + { + AnzeigeAktualisieren "" + } + } + default { + # Write-Host "Gedrückte Taste: " $Taste + } +} +return +} + +Function TastenReaktionListeOrdnernamen($Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +switch ($Taste){ + "Return" { + # Write-Host "Enter gedrückt" + $Auswahl = $ListeOrdnernamen.SelectedItem + if ($($Auswahl.Length -eq 0)) + { + $Auswahl = $ListeOrdnernamen.Items[0] + } + $Pfad = $PfadFeld.Text + # Write-Host "Auswahl: " $Auswahl + # Write-Host "Pfad: " $Pfad + + VerzeichnisAuswaehlen $Pfad $Auswahl + } + "Back" { + # Write-Host "Back gedrückt" + $Pfad = $PfadFeld.Text + # Write-Host "Pfad: " $Pfad + + # Pfad aktualisieren + VerzeichnisZurueck $Pfad + } + default { + # Write-Host "Gedrückte Taste: " $Taste + } +} +return +} + +Function TastenReaktionButtons($Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +switch ($Taste){ + "Back" { + # Write-Host "Back gedrückt" + $Pfad = $PfadFeld.Text + # Write-Host "Pfad: " $Pfad + + # Pfad aktualisieren + VerzeichnisZurueck $Pfad + } + default { + # Write-Host "Gedrückte Taste: " $Taste + } +} +return +} + +Function LaufwerkeFinden() +{ +$Laufwerke = $(Get-PSDrive | where {$_.Free}).Name +$i = 0 + +foreach($Laufwerk in $Laufwerke) +{ + $Laufwerke[$i] = $Laufwerk + ":\" + $i++ +} +Write-Host "Rückgabe Laufwerke: " $Laufwerke +return $Laufwerke +} + +Function TxtDateienFinden($Pfad) +{ +$TxtDateien = $(Get-Childitem $Pfad\*.txt) + +if ($TxtDateien.Length -gt 0) +{ + return $(Split-Path $TxtDateien -Leaf) +} +else +{ + return +} +} + +Function UnterOrdnerFinden($Pfad) +{ +#abfangen: keine Ordner vorhanden -> nicht nötig, da keine weitere Verarbeitung +$Ordner = $(Get-Childitem $Pfad -Directory) +return $Ordner +} + +Function Optionen($Pfad) +{ +# Unterordner und .txt-Dateien finden +# Typzuweisung nötig, da aus unbekanntem Grund sonst Unterordner eines Ordners, der mit "_" beginnt, nicht gefunden werden können +[System.Object[]]$UnterOrdner = UnterOrdnerFinden $Pfad +$TxtDateien = TxtDateienFinden $Pfad + +#Gibt aktuell auch Index und Typ (System.IO.DirectoryInfo bzw. System.String) zurück +$Optionen = $UnterOrdner + $TxtDateien + +return $Optionen +} + + +Main \ No newline at end of file diff --git a/Test-Skripte/GUI-Angepasst2_Lauffaehig.ps1 b/Test-Skripte/GUI-Angepasst2_Lauffaehig.ps1 new file mode 100644 index 0000000..c0f0e32 --- /dev/null +++ b/Test-Skripte/GUI-Angepasst2_Lauffaehig.ps1 @@ -0,0 +1,1005 @@ +# Änderungsziel vs. 1: Funktion bei Klick auf "Auswählen" und "Zurück" auslagern +# Knwon problem: Zugriffsversuch auf einen Ordner, für den der Nutzer keine Freigabe hat. Aktuell kein Lösungsansatz bekannt. +# Todo: siehe Zettel! + +Function Main +{ + +Write-Host "Programmstart" + +$StartPfad = "" + +$PfadUrsprungsdatei = GuiTxtWaehlen $StartPfad +Write-Host "Pfad Ursprungsdatei: " $PfadUrsprungsdatei + + +# Testen, ob übergebener Pfad gültig ist? Könnte ungültig sein, wenn in PfadFeld unsinn steht und das Fenster via x geschlossen wird +$PfadUrsprungsdateiMod = Split-Path $PfadUrsprungsdatei +$PfadZielDateien = GuiVerzeichnisWaehlen $PfadUrsprungsdateiMod + +Write-Host "Dateirückgabe in Main(2): " $PfadZielDateien + +$PfadDateiEA = ExcelDateiNameErstellen "EA" $PfadUrsprungsdatei $PfadZielDateien +$PfadDateiDIDQ = ExcelDateiNameErstellen "DIDQ" $PfadUrsprungsdatei $PfadZielDateien + +#Write-Host "Dateiname EA: " $PfadDateiEA +#Write-Host "Dateiname DIDQ: " $PfadDateiDIDQ +ExcelDateiErstellen $PfadDateiEA +ExcelDateiErstellen $PfadDateiDIDQ + +$AlleGleichenEA = ExcelDateiBeschreiben $PfadUrsprungsdatei "E" "A" $PfadDateiEA +$AlleGleichenDIDQ = ExcelDateiBeschreiben $PfadUrsprungsdatei "DI" "DQ" $PfadDateiDIDQ +Write-Host "Gleiche EA nach Rückgabe: " $AlleGleichenEA +$GleicheEingaenge = $AlleGleichenEA[0] +$GleicheAusgaenge = $AlleGleichenEA[1] + +Write-Host "Gleiche Eingänge: " $GleicheEingaenge +Write-Host "Gleiche Ausgänge: " $GleicheAusgaenge +#Todo: Nur öffnen, wenn es weder gleiche Eingänge, noch gleiche Ausgänge gibt? +GuiGleicheAnzeigen $GleicheEingaenge $GleicheAusgaenge + +} + + +Function GuiTxtWaehlen ($StartPfad) +{ +[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") +[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") + +# Eigenschaften Fenster +$Fenster = New-Object System.Windows.Forms.Form +$Fenster.Size = New-Object System.Drawing.Size(900,600) #Breite, Höhe +$Fenster.StartPosition = "CenterScreen" +$Fenster.KeyPreview = $true # was macht das? +$Fenster.MaximumSize = $Fenster.Size # legt fest, dass Größe des Fensters nicht verändert werden kann +$Fenster.MinimumSize = $Fenster.Size + +# PfadFeld +$PfadFeld = New-Object System.Windows.Forms.TextBox +$PfadFeld.Location = New-Object System.Drawing.Size(10,10) +$PfadFeld.Size = New-Object System.Drawing.Size(860,20) +$PfadFeld.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TXTTastenReaktionPfadFeld $Taste +}) +$Fenster.Controls.Add($PfadFeld) + +# ListeOrdnernamen +$ListeOrdnernamen = New-Object System.Windows.Forms.ListBox +$ListeOrdnernamen.Location = New-Object System.Drawing.Size(10,40) +$ListeOrdnernamen.Size = New-Object System.Drawing.Size(860,20) +$ListeOrdnernamen.Height = 450 +$ListeOrdnernamen.Font = New-Object System.Drawing.Font("Arial",12,[System.Drawing.FontStyle]::Regular) +$ListeOrdnernamen.Add_DoubleClick({ + # Variablen bestimmen zur Übergabe + $Auswahl = $ListeOrdnernamen.SelectedItem + $Pfad = $PfadFeld.Text + # Write-Host "Gewählter Ordner/ Datei: " $Auswahl + # Write-Host "Vorheriger Pfad: " $Pfad + + # Pfad aktualisieren + TXTVerzeichnisAuswaehlen $Pfad $Auswahl +}) +$ListeOrdnernamen.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TXTTastenReaktionListeOrdnernamen $Taste +}) +$Fenster.Controls.Add($ListeOrdnernamen) + +<# +# Beispiel Textfeld +$Textfeld1 = New-Object System.Windows.Forms.Label +$Textfeld1.Location = New-Object System.Drawing.Size(7,500) +$Textfeld1.Size = New-Object System.Drawing.Size(130,15) +$Textfeld1.Text = "Beispiel Text" +$Fenster.Controls.Add($Textfeld1) +#> + +# ZurückButton +$ZurückButton = New-Object System.Windows.Forms.Button +$ZurückButton.Location = New-Object System.Drawing.Size(10,500) +$ZurückButton.Size = New-Object System.Drawing.Size(100,30) +$ZurückButton.Text = "Zurück" +$ZurückButton.Add_Click({ + # Write-Host "Pfad ausgabe: " $PfadFeld.Text + $Pfad = $PfadFeld.Text + + #Pfad aktualisieren + TXTVerzeichnisZurueck $Pfad +}) +$ZurückButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TXTTastenReaktionButtons $Taste +}) +$Fenster.Controls.Add($ZurückButton) + +# AuswählenButton +$AuswählenButton = New-Object System.Windows.Forms.Button +$AuswählenButton.Location = New-Object System.Drawing.Size(750,500) +$AuswählenButton.Size = New-Object System.Drawing.Size(100,30) +$AuswählenButton.Text = "Auswählen" +$AuswählenButton.Add_Click({ + # Variablen bestimmen zur Übergabe + $Auswahl = $ListeOrdnernamen.SelectedItem + # Falls nicht aktiv ein Eintrag gewählt wurde, in den obersten navigieren + if ($($Auswahl.length -eq 0)) + { + $Auswahl = $ListeOrdnernamen.Items[0] + } + $Pfad = $PfadFeld.Text + # Write-Host "Gewählter Ordner/ Datei: " $Auswahl + # Write-Host "Vorheriger Pfad: " $Pfad + + # Pfad aktualisieren + TXTVerzeichnisAuswaehlen $Pfad $Auswahl +}) +$AuswählenButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TXTTastenReaktionButtons $Taste +}) +$Fenster.Controls.Add($AuswählenButton) + +# Dieser Funktionsaufruf zerstört die Rückgabe, wenn er keiner Variable zugewiesen wird +$A = TXTAnzeigeAktualisieren $StartPfad + +$Fenster.Add_Shown({$Fenster.Activate()}) +[void]$Fenster.ShowDialog() + +$Rueckgabe = $PfadFeld.Text +Write-Host "Rückgabe: " $Rueckgabe +return $Rueckgabe +} + +#--------------------------------------------------------- E N D E G U I txtWaehlen ---------------------------------------------------------------------- + +#------------------- Funktionen nur für das txt-GUI -------------------------- + +# Bekommt Pfad, stellt fest ob Laufwerke oder Ordner angezeigt werden müssen und aktualisiert entsprechend alles +# Für Laufwerke muss $Pfad = "" sein +Function TXTAnzeigeAktualisieren ($Pfad) +{ +# Write-Host "Übergebener Pfad: " $Pfad + +# Sicherstellen, dass es das Verzeichnis gibt +if ($($Pfad -eq "") -or $(PfadExistiert $Pfad)) +{ + # Feststellen, ob Ordner oder Laufwerke angezeigt werden müssen + if ($Pfad.Length -ne "") + { + # Es handelt sich um Ordner + $Optionen = TXTOptionen $Pfad + $Fenster.Text = $(Split-Path $Pfad -Leaf) + } + elseif ($Pfad.Length -eq "") + { + # Es handelt sich um Laufwerke + $Optionen = LaufwerkeFinden + $Pfad = "" + $Fenster.Text = "Laufwerke" + } + else + { + Write-Host "Fehler bei Anzeige aktualisieren" + # Fehler(?) + } + $PfadFeld.Text = $Pfad + $ListeOrdnernamen.Items.Clear() + foreach ($Option in $Optionen) + { + if ($Option.Length -gt 0) + { + $ListeOrdnernamen.Items.Add($Option) + } + } +} +else +{ + TXTAnzeigeAktualisieren "" +} +return +} + +Function TXTVerzeichnisAuswaehlen ($Pfad, $Auswahl) +{ +if ($Pfad.length -gt 0) +{ + $Pfad = Join-Path -Path $Pfad -ChildPath $Auswahl -Resolve +} +else +{ + $Pfad = $Auswahl +} + +#Falls nicht aktiv ein Eintrag ausgewählt wurde, den obersten wählen +if ($Auswahl.length -eq 0) +{ + $Auswahl = $ListeOrdnernamen.Items[0] +} + +# Erkennen, ob *.txt-Datei gewählt wurde -> ggf. Auswahl abgeschlossen +if ($($Auswahl -match ".txt")) +{ + # Write-Host ".txt-Datei ausgewählt, Pfad: " $Pfad + # Write-Host "Dateityp: " $Pfad.GetType() + $Fenster.Dispose() + # Ist zwar sachlich gesehen unsinn, aber sonst funktioniert Return in der GUI nicht + $PfadFeld.Text = $Pfad + return +} + +TXTAnzeigeAktualisieren $Pfad + +return +} + +Function TXTVerzeichnisZurueck ($Pfad) +{ +if ($Pfad.Length -gt 3) +{ + # Weiter mit Ordnern + # Write-Host "Ordner anzeigen" + $Pfad = Split-Path $Pfad +} +elseif ($Pfad.Length -le 3) +{ + # Weiter mit Laufwerken + # Write-Host "Laufwerke anzeigen" + $Pfad = "" +} +else +{ + Write-Host "Fehler bei Verzeichnis zurück" + # Fehler/ Nichts tun? + # Ermitteln: wann tritt dieser Fall ein? +} +TXTAnzeigeAktualisieren $Pfad +return +} + +Function TXTTastenReaktionPfadFeld($Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +switch ($Taste){ + "Return" { + # Write-Host "Enter gedrückt" + $Pfad = $PfadFeld.Text + # Write-Host "Pfad: " $Pfad + + TXTReaktionReturn $Pfad + } + default { + # Write-Host "Gedrückte Taste: " $Taste + } +} +return +} + +Function TXTTastenReaktionListeOrdnernamen($Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +switch ($Taste){ + "Return" { + # Write-Host "Enter gedrückt" + $Auswahl = $ListeOrdnernamen.SelectedItem + if ($($Auswahl.Length -eq 0)) + { + $Auswahl = $ListeOrdnernamen.Items[0] + } + $Pfad = $PfadFeld.Text + # Write-Host "Auswahl: " $Auswahl + # Write-Host "Pfad: " $Pfad + + TXTVerzeichnisAuswaehlen $Pfad $Auswahl + } + "Back" { + # Write-Host "Back gedrückt" + $Pfad = $PfadFeld.Text + # Write-Host "Pfad: " $Pfad + + # Pfad aktualisieren + TXTVerzeichnisZurueck $Pfad + } + default { + # Write-Host "Gedrückte Taste: " $Taste + } +} +return +} + +Function TXTTastenReaktionButtons($Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +switch ($Taste){ + "Back" { + # Write-Host "Back gedrückt" + $Pfad = $PfadFeld.Text + # Write-Host "Pfad: " $Pfad + + # Pfad aktualisieren + TXTVerzeichnisZurueck $Pfad + } + default { + # Write-Host "Gedrückte Taste: " $Taste + } +} +return +} + +Function TXTOptionen($Pfad) +{ +# Unterordner und .txt-Dateien finden +# Typzuweisung nötig, da aus unbekanntem Grund sonst Unterordner eines Ordners, der mit "_" beginnt, nicht gefunden werden können +[System.Object[]]$UnterOrdner = UnterOrdnerFinden $Pfad +$TxtDateien = TxtDateienFinden $Pfad + +#Gibt aktuell auch Index und Typ (System.IO.DirectoryInfo bzw. System.String) zurück +$Optionen = $UnterOrdner + $TxtDateien + +return $Optionen +} + +Function TXTReaktionReturn ($Pfad) +{ + if (PfadExistiert $Pfad) + { + # Gültiger Pfad oder .txt-Datei + $PfadEnde = $(Split-Path $Pfad -Leaf) + if ($($PfadEnde -match ".txt")) + { + $Fenster.Dispose() + # Ist zwar sachlich gesehen unsinn, aber sonst funktioniert Return in der GUI nicht richtig + $PfadFeld.Text = $Pfad + return + } + else + { + TXTAnzeigeAktualisieren $Pfad + } + } + else + { + # Laufwerke aktualisieren oder ungültiger Pfad + TXTAnzeigeAktualisieren "" + } + return +} + +Function GuiVerzeichnisWaehlen ($StartPfad) +{ +[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") +[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") + +# Eigenschaften Fenster +$Fenster = New-Object System.Windows.Forms.Form +$Fenster.Size = New-Object System.Drawing.Size(900,600) #Breite, Höhe +$Fenster.StartPosition = "CenterScreen" +$Fenster.KeyPreview = $true # was macht das? +$Fenster.MaximumSize = $Fenster.Size # legt fest, dass Größe des Fensters nicht verändert werden kann +$Fenster.MinimumSize = $Fenster.Size + +# PfadFeld +$PfadFeld = New-Object System.Windows.Forms.TextBox +$PfadFeld.Location = New-Object System.Drawing.Size(10,10) +$PfadFeld.Size = New-Object System.Drawing.Size(860,20) +$PfadFeld.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + VERTastenReaktionPfadFeld $Taste +}) +$Fenster.Controls.Add($PfadFeld) + +# ListeOrdnernamen +$ListeOrdnernamen = New-Object System.Windows.Forms.ListBox +$ListeOrdnernamen.Location = New-Object System.Drawing.Size(10,40) +$ListeOrdnernamen.Size = New-Object System.Drawing.Size(860,20) +$ListeOrdnernamen.Height = 450 +$ListeOrdnernamen.Font = New-Object System.Drawing.Font("Arial",12,[System.Drawing.FontStyle]::Regular) +$ListeOrdnernamen.Add_DoubleClick({ + # Variablen bestimmen zur Übergabe + $Auswahl = $ListeOrdnernamen.SelectedItem + $Pfad = $PfadFeld.Text + # Write-Host "Gewählter Ordner/ Datei: " $Auswahl + # Write-Host "Vorheriger Pfad: " $Pfad + + # Pfad aktualisieren + VERVerzeichnisAuswaehlen $Pfad $Auswahl +}) +$ListeOrdnernamen.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + VERTastenReaktionListeOrdnernamen $Taste +}) +$Fenster.Controls.Add($ListeOrdnernamen) + +<# +# Beispiel Textfeld +$Textfeld1 = New-Object System.Windows.Forms.Label +$Textfeld1.Location = New-Object System.Drawing.Size(7,500) +$Textfeld1.Size = New-Object System.Drawing.Size(130,15) +$Textfeld1.Text = "Beispiel Text" +$Fenster.Controls.Add($Textfeld1) +#> + +# ZurückButton +$ZurückButton = New-Object System.Windows.Forms.Button +$ZurückButton.Location = New-Object System.Drawing.Size(10,500) +$ZurückButton.Size = New-Object System.Drawing.Size(100,30) +$ZurückButton.Text = "Zurück" +$ZurückButton.Add_Click({ + # Write-Host "Pfad ausgabe: " $PfadFeld.Text + $Pfad = $PfadFeld.Text + + #Pfad aktualisieren + VERVerzeichnisZurueck $Pfad +}) +$ZurückButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + VERTastenReaktionButtons $Taste +}) +$Fenster.Controls.Add($ZurückButton) + +# AuswählenButton +$AuswählenButton = New-Object System.Windows.Forms.Button +$AuswählenButton.Location = New-Object System.Drawing.Size(630,500) +$AuswählenButton.Size = New-Object System.Drawing.Size(100,30) +$AuswählenButton.Text = "Auswählen" +$AuswählenButton.Add_Click({ + # Variablen bestimmen zur Übergabe + $Auswahl = $ListeOrdnernamen.SelectedItem + # Falls nicht aktiv ein Eintrag gewählt wurde, in den obersten navigieren + if ($($Auswahl.length -eq 0)) + { + $Auswahl = $ListeOrdnernamen.Items[0] + } + $Pfad = $PfadFeld.Text + # Write-Host "Gewählter Ordner/ Datei: " $Auswahl + # Write-Host "Vorheriger Pfad: " $Pfad + + if ($($ListeOrdnernamen.Items[0] -eq "")) + { + VERAuswahlBestaetigt $Pfad $Auswahl + } + else + { + # Pfad aktualisieren + VERVerzeichnisAuswaehlen $Pfad $Auswahl + } +}) +$AuswählenButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + VERTastenReaktionButtons $Taste +}) +$Fenster.Controls.Add($AuswählenButton) + +# BestätigenButton +$BestätigenButton = New-Object System.Windows.Forms.Button +$BestätigenButton.Location = New-Object System.Drawing.Size(750,500) +$BestätigenButton.Size = New-Object System.Drawing.Size(100,30) +$BestätigenButton.Text = "Bestätigen" +$BestätigenButton.Add_Click({ + $Auswahl = $ListeOrdnernamen.SelectedItem + # Falls nicht aktiv ein Eintrag gewählt wurde, in den obersten navigieren + if ($($Auswahl.length -eq 0)) + { + $Auswahl = $ListeOrdnernamen.Items[0] + } + $Pfad = $PfadFeld.Text + + VERAuswahlBestaetigt $Pfad $Auswahl +}) +$BestätigenButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + VERTastenReaktionButtons $Taste +}) +$Fenster.Controls.Add($BestätigenButton) + + +# Dieser Funktionsaufruf zerstört die Rückgabe, wenn er keiner Variable zugewiesen wird +$A = VERAnzeigeAktualisieren $StartPfad + +$Fenster.Add_Shown({$Fenster.Activate()}) +[void]$Fenster.ShowDialog() + +$Rueckgabe2 = $PfadFeld.Text +Write-Host "Rückgabe: " $Rueckgabe2 +return $Rueckgabe2 +} + +#--------------------------------------------------------- E N D E G U I VerzeichnsWaehlen ---------------------------------------------------------------------- + +#------------------- Funktionen nur für das VerzeichnisWaehlen-GUI -------------------------- + +# Bekommt Pfad, stellt fest ob Laufwerke oder Ordner angezeigt werden müssen und aktualisiert entsprechend alles +# Für Laufwerke muss $Pfad = "" sein +Function VERAnzeigeAktualisieren ($Pfad) +{ +# Write-Host "Übergebener Pfad: " $Pfad + +# Sicherstellen, dass es das Verzeichnis gibt +if ($($Pfad -eq "") -or $(PfadExistiert $Pfad)) +{ + # Feststellen, ob Ordner oder Laufwerke angezeigt werden müssen + if ($Pfad.Length -ne "") + { + # Es handelt sich um Ordner + $Optionen = VEROptionen $Pfad + $Fenster.Text = $(Split-Path $Pfad -Leaf) + } + elseif ($Pfad.Length -eq "") + { + # Es handelt sich um Laufwerke + $Optionen = LaufwerkeFinden + $Pfad = "" + $Fenster.Text = "Laufwerke" + } + else + { + Write-Host "Fehler bei Anzeige aktualisieren" + # Fehler(?) + } + $PfadFeld.Text = $Pfad + $ListeOrdnernamen.Items.Clear() + foreach ($Option in $Optionen) + { + if ($Option.Length -gt 0) + { + $ListeOrdnernamen.Items.Add($Option) + } + } +} +else +{ + VERAnzeigeAktualisieren "" +} +return +} + + +Function VERVerzeichnisAuswaehlen ($Pfad, $Auswahl) +{ +#Falls nicht aktiv ein Eintrag ausgewählt wurde, den obersten wählen +if ($Auswahl.length -eq 0) +{ + $Auswahl = $ListeOrdnernamen.Items[0] +} + +if ($Pfad.length -gt 0) +{ + $Pfad = Join-Path -Path $Pfad -ChildPath $Auswahl -Resolve +} +else +{ + $Pfad = $Auswahl +} + +VERAnzeigeAktualisieren $Pfad +return +} + +Function VERVerzeichnisZurueck ($Pfad) +{ +if ($Pfad.Length -gt 3) +{ + # Weiter mit Ordnern + # Write-Host "Ordner anzeigen" + $Pfad = Split-Path $Pfad +} +elseif ($Pfad.Length -le 3) +{ + # Weiter mit Laufwerken + # Write-Host "Laufwerke anzeigen" + $Pfad = "" +} +else +{ + Write-Host "Fehler bei Verzeichnis zurück" + # Fehler/ Nichts tun? + # Ermitteln: wann tritt dieser Fall ein? +} +VERAnzeigeAktualisieren $Pfad +return +} + +Function VERTastenReaktionPfadFeld($Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +switch ($Taste){ + "Return" { + # Write-Host "Enter gedrückt" + $Pfad = $PfadFeld.Text + # Write-Host "Pfad: " $Pfad + # Es muss nicht überprüft werden, ob es das Verzeichnis gibt, da dies auch in VERAnzeigeAktualisieren gemacht wird + VERAnzeigeAktualisieren $Pfad + } + "ShiftKey" { + $Pfad = $PfadFeld.Text + $Auswahl = $ListeOrdnernamen.SelectedItem + # Falls nicht aktiv ein Eintrag gewählt wurde, in den obersten navigieren + if ($($Auswahl.length -eq 0)) + { + $Auswahl = $ListeOrdnernamen.Items[0] + } + + ReaktionShiftKey $Pfad $Auswahl + } + default { + # Write-Host "Gedrückte Taste: " $Taste + } +} +return +} + +Function VERTastenReaktionListeOrdnernamen($Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +switch ($Taste){ + "Return" { + # Write-Host "Enter gedrückt" + $Auswahl = $ListeOrdnernamen.SelectedItem + if ($($Auswahl.Length -eq 0)) + { + $Auswahl = $ListeOrdnernamen.Items[0] + } + $Pfad = $PfadFeld.Text + # Write-Host "Auswahl: " $Auswahl + # Write-Host "Pfad: " $Pfad + + VERVerzeichnisAuswaehlen $Pfad $Auswahl + } + "Back" { + # Write-Host "Back gedrückt" + $Pfad = $PfadFeld.Text + # Write-Host "Pfad: " $Pfad + + # Pfad aktualisieren + VERVerzeichnisZurueck $Pfad + } + "ShiftKey" { + $Pfad = $PfadFeld.Text + $Auswahl = $ListeOrdnernamen.SelectedItem + # Falls nicht aktiv ein Eintrag gewählt wurde, in den obersten navigieren + if ($($Auswahl.length -eq 0)) + { + $Auswahl = $ListeOrdnernamen.Items[0] + } + + ReaktionShiftKey $Pfad $Auswahl + } + default { + # Write-Host "Gedrückte Taste: " $Taste + } +} +return +} + +Function VERTastenReaktionButtons($Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +switch ($Taste){ + "Back" { + # Write-Host "Back gedrückt" + $Pfad = $PfadFeld.Text + # Write-Host "Pfad: " $Pfad + + # Pfad aktualisieren + VERVerzeichnisZurueck $Pfad + } + "ShiftKey" { + $Pfad = $PfadFeld.Text + $Auswahl = $ListeOrdnernamen.SelectedItem + # Falls nicht aktiv ein Eintrag gewählt wurde, in den obersten navigieren + if ($($Auswahl.length -eq 0)) + { + $Auswahl = $ListeOrdnernamen.Items[0] + } + + ReaktionShiftKey $Pfad $Auswahl + } + default { + # Write-Host "Gedrückte Taste: " $Taste + } +} +return +} + +Function VEROptionen($Pfad) +{ +# Unterordner und .txt-Dateien finden +# Typzuweisung nötig, da aus unbekanntem Grund sonst Unterordner eines Ordners, der mit "_" beginnt, nicht gefunden werden können +[System.Object[]]$UnterOrdner = UnterOrdnerFinden $Pfad +# $TxtDateien = TxtDateienFinden $Pfad + +#Gibt aktuell auch Index und Typ (System.IO.DirectoryInfo bzw. System.String) zurück +$Optionen = $UnterOrdner +return $Optionen +} + +Function VERAuswahlBestaetigt($Pfad, $Auswahl) +{ +$Pfad = Join-Path -Path $Pfad -ChildPath $Auswahl -Resolve + +if (PfadExistiert $Pfad) +{ + Write-Host "Pfad zur Rückgabe: " $Pfad + $Fenster.Dispose() + $Pfadfeld.Text = $Pfad + return +} +} + +Function GuiGleicheAnzeigen ($GleicheEingaenge, $GleicheAusgaenge) +{ + [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") + [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") + + # Eigenschaften Fenster + $Fenster = New-Object System.Windows.Forms.Form + $Fenster.Size = New-Object System.Drawing.Size(905,600) #Breite, Höhe + $Fenster.StartPosition = "CenterScreen" + $Fenster.KeyPreview = $true # was macht das? + $Fenster.MaximumSize = $Fenster.Size # legt fest, dass Größe des Fensters nicht verändert werden kann + $Fenster.MinimumSize = $Fenster.Size + $Fenster.Text = "Mehrfach vorhandene Ein- und Ausgänge" + + $Textfeld1 = New-Object System.Windows.Forms.Label + $Textfeld1.Location = New-Object System.Drawing.Size(10,10) + $Textfeld1.Size = New-Object System.Drawing.Size(430,20) + $Textfeld1.Text = "Bei den Eingängen gibt es folgende Duplikate: " + $Fenster.Controls.Add($Textfeld1) + + $ListeEingänge = New-Object System.Windows.Forms.DataGridView + $ListeEingänge.Location = New-Object System.Drawing.Size(10,40) + $ListeEingänge.Size = New-Object System.Drawing.Size(430,20) + $ListeEingänge.Height = 450 + $ListeEingänge.ColumnCount = 2 + $ListeEingänge.ColumnHeadersVisible = $true + $ListeEingänge.Columns[0].Name = "Zeile" + $ListeEingänge.Columns[1].Name = "Kennzeichnung" + foreach ($GleichenEingang in $GleicheEingaenge) + { + Write-Host "Hinzufügen TabelleE: " $GleichenEingang + $ListeEingänge.Rows.Add($($GleichenEingang.Zeile),($GleichenEingang.Name)) + } + $Fenster.Controls.Add($ListeEingänge) + + $Textfeld2 = New-Object System.Windows.Forms.Label + $Textfeld2.Location = New-Object System.Drawing.Size(450,10) + $Textfeld2.Size = New-Object System.Drawing.Size(430,20) + $Textfeld2.Text = "Bei den Ausgängen gibt es folgende Duplikate: " + $Fenster.Controls.Add($Textfeld2) + + $ListeAusgänge = New-Object System.Windows.Forms.DataGridView + $ListeAusgänge.Location = New-Object System.Drawing.Size(450,40) + $ListeAusgänge.Size = New-Object System.Drawing.Size(430,20) + $ListeAusgänge.Height = 450 + $ListeAusgänge.ColumnCount = 2 + $ListeAusgänge.ColumnHeadersVisible = $true + $ListeAusgänge.Columns[0].Name = "Zeile" + $ListeAusgänge.Columns[1].Name = "Kennzeichnung" + foreach ($GleichenAusgang in $GleicheAusgaenge) + { + Write-Host "Hinzufügen TabelleA: " $GleichenAusgang + $ListeAusgänge.Rows.Add($($GleichenAusgang.Zeile),($GleichenAusgang.Name)) + } + $Fenster.Controls.Add($ListeAusgänge) + + $BestätigenButton = New-Object System.Windows.Forms.Button + $BestätigenButton.Location = New-Object System.Drawing.Size(10,500) + $BestätigenButton.Size = New-Object System.Drawing.Size(860,30) + $BestätigenButton.Text = "Programm beenden" + $BestätigenButton.Add_Click({ + $Fenster.Dispose() + return + }) + $Fenster.Controls.Add($BestätigenButton) + + $Fenster.Add_Shown({$Fenster.Activate()}) + [void]$Fenster.ShowDialog() +} + +#------------------- Funktionen für alle GUIs -------------------------- + +Function PfadExistiert ($Pfad) +{ +if ($(Test-Path $Pfad -PathType Container) -or $(Test-Path $Pfad -Include "*.txt")) +{ + # Write-Host "Bei dem Verzeichnis handelt es sich um eine *.txt-Datei oder ein gültiges Verzeichnis" + return $true +} +else +{ + # Write-Host "Das Verzeichnis existiert nicht oder es wurde keine *.txt-Datei gewählt" + return $false +} +} + +Function LaufwerkeFinden() +{ +$Laufwerke = $(Get-PSDrive | Where-Object {$_.Free}).Name +$i = 0 + +foreach($Laufwerk in $Laufwerke) +{ + $Laufwerke[$i] = $Laufwerk + ":\" + $i++ +} +return $Laufwerke +} + +Function UnterOrdnerFinden($Pfad) +{ +# Write-Host "Ordner zum suchen von Unterordnern: " $Pfad +$UnterOrdner = $(Get-ChildItem $Pfad -Directory) +# Write-Host "Gefundene Unterordner: " $UnterOrdner +if ($($UnterOrdner.Length -gt 0)) +{ + $Ordner = $(Split-Path $UnterOrdner -Leaf) +} +else { + $Ordner = "" +} + +# Write-Host "Gefundene Ordner: " $Ordner +return $Ordner +} + +Function TxtDateienFinden($Pfad) +{ +$TxtDateien = $(Get-Childitem $Pfad\*.txt) + +if ($TxtDateien.Length -gt 0) +{ + return $(Split-Path $TxtDateien -Leaf) +} +else +{ + return +} +} + +Function ReaktionShiftKey ($Pfad, $Auswahl) +{ + if (PfadExistiert $Pfad) + { + VERAuswahlBestaetigt $Pfad $Auswahl + } + else + { + VERAnzeigeAktualisieren "" + } + + return +} +#--------------------------------------- Ende Funktionen für GUI ------------------------------- + +Function ExcelDateiNameErstellen ($Prefix, $PfadUrsprungsdatei, $PfadZielDateien) +{ + $BasisNameZielDatei = Split-Path $PfadUrsprungsdatei -Leaf + $BasisNameZielDateiLaenge = $BasisNameZielDatei.Length + $BasisNameZielDateiKurz = $BasisNameZielDatei.Substring(0, $($BasisNameZielDateiLaenge - 4)) + $GesamtPfadZielDatei = $PfadZielDateien + "\" + $Prefix + "_" + $BasisNameZielDateiKurz + ".xlsx" + + return $GesamtPfadZielDatei +} + +Function ExcelDateiErstellen ($DateiPfad) +{ + $Datei = New-Object -ComObject Excel.Application + $Mappe = $Datei.Workbooks.Add() + $Mappe.SaveAs($DateiPfad) + $Datei.Quit() + + return +} + +Function ExcelDateiBeschreiben ($PfadUrsprungsdatei, $Umwandler1, $Umwandler2, $ZielDatei) +{ + $Datei = New-Object -ComObject Excel.Application + $Mappe = $Datei.Workbooks.Open($ZielDatei) + $Blatt = $Mappe.WorkSheets.item(1) + $Datei.Visible = $false + + $i = 1 + $Wandler1 = @() + $ZuWandler1 = @(„DI“, „BA“, „BB“, „BC“, „BD“, „BE“, „BF“, „BG“, „BH“, „BJ“, „BK“, „BL“, „BM“, „BN“, „BP“, „BQ“, „BR“, „BS“, „BT“, „BU“, „BV“, „BW“, „BX“, „BY“, „BZ“, „FA“, „FB“, „FC“, „FD“, „FE“, „FF“, „FG“, „FH“, „FJ“, „FK“, „FL“, „FM“, „FN“, „FP“, „FQ“, „FR“, „FS“, „FT“, „FU“, „FV“, „FW“, „FX“, „FY“, „FZ“, „SA“, „SB“, „SC“, „SD“, „SE“, „SF“, „SG“, „SH“, „SJ“, „SK“, „SL“, „SM“, „SN“, „SP“, „SQ“, „SR“, „SS“, „ST“, „SU“, „SV“, „SW“, „SX“, „SY“, „SZ“) + $Wandler2 = @() + $ZuWandler2 = @(„DQ“, „CA“, „CB“, „CC“, „CD“, „CE“, „CF“, „CG“, „CH“, „CJ“, „CK“, „CL“, „CM“, „CN“, „CP“, „CQ“, „CR“, „CS“, „CT“, „CU“, „CV“, „CW“, „CX“, „CY“, „CZ“, „EA“, „EB“, „EC“, „ED“, „EE“, „EF“, „EG“, „EH“, „EJ“, „EK“, „EL“, „EM“, „EN“, „EP“, „EQ“, „ER“, „ES“, „ET“, „EU“, „EV“, „EW“, „EX“, „EY“, „EZ“, „GA“, „GB“, „GC“, „GD“, „GE“, „GF“, „GG“, „GH“, „GJ“, „GK“, „GL“, „GM“, „GN“, „GP“, „GQ“, „GR“, „GS“, „GT“, „GU“, „GV“, „GW“, „GX“, „GY“, „GZ“, „HA“, „HB“, „HC“, „HD“, „HE“, „HF“, „HG“, „HH“, „HJ“, „HK“, „HL“, „HM“, „HN“, „HP“, „HQ“, „HR“, „HS“, „HT“, „HU“, „HV“, „HW“, „HX“, „HY“, „HZ“, „KA“, „KB“, „KC“, „KD“, „KE“, „KF“, „KG“, „KH“, „KJ“, „KK“, „KL“, „KM“, „KN“, „KP“, „KQ“, „KR“, „KS“, „KT“, „KU“, „KV“, „KW“, „KX“, „KY“, „KZ“, „MA“, „MB“, „MC“, „MD“, „ME“, „MF“, „MG“, „MH“, „MJ“, „MK“, „ML“, „MM“, „MN“, „MP“, „MQ“, „MR“, „MQ“, „MR“, „MS“, „MT“, „MU“, „MV“, „MW“, „MX“, „MY“, „MZ“, „PA“, „PB“, „PC“, „PD“, „PE“, „PF“, „PG“, „PH“, „PJ“, „PK“, „PL“, „PM“, „PN“, „PP“, „PQ“, „PR“, „PS“, „PT“, „PU“, „PV“, „PW“, „PX“, „PY“, „PZ“, „QA“, „QB“, „QC“, „QD“, „QE“, „QF“, „QG“, „QH“, „QJ“, „QK“, „QL“, „QM“, „QN“, „QP“, „QQ“, „QR“, „QS“, „QT“, „QU“, „QV“, „QW“, „QX“, „QY“, „QZ“, „RA“, „RB“, „RC“, „RD“, „RE“, „RF“, „RG“, „RH“, „RJ“, „RK“, „RL“, „RM“, „RN“, „RP“, „RQ“, „RR“, „RS“, „RT“, „RU“, „RV“, „RW“, „RX“, „RY“, „RZ“, „TA“, „TB“, „TC“, „TD“, „TE“, „TF“, „TG“, „TH“, „TJ“, „TK“, „TL“, „TM“, „TN“, „TP“, „TQ“, „TR“, „TS“, „TT“, „TU“, „TV“, „TW“, „TX“, „TY“, „TZ“) + $Fehler = @() + + $Ursprungdatei = Get-Content $PfadUrsprungsdatei + + foreach ($Eintrag in $Ursprungdatei) + { + $Eintragszeile = $Eintrag.Split("'") + $BMKZahl = $Eintragszeile[1] + $BMKZahl = $BMKZahl.TrimStart("'") + $Kommentar = $Eintragszeile[3] + $Kommentar = $Kommentar.TrimEnd("'") + + if ($($($BMKZahl.Substring(0,2)) -in $ZuWandler1)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $Umwandler1 + $BMKZahl + $Wandler1 += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + elseif ($($($BMKZahl.Substring(0,2)) -in $ZuWandler2)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $Umwandler2 + $BMKZahl + $Wandler2 += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + else + { + Write-Host "Achtung, Fehler bei " $BMKZahl $Kommentar + $Fehler += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + + Write-Host "In Excel schreiben: BMKZahl: " $BMKZahl " Kommentar: " $Kommentar + $Blatt.Cells.Item($i,1) = $BMKZahl + $Blatt.Cells.Item($i,2) = $Kommentar + + $i++ + } + + $Mappe.Save() + $Datei.Quit() + + $GleicheWandler1 = GleicheFinden $Wandler1 + $GleicheWandler2 = GleicheFinden $Wandler2 + Write-Host "Gleiche für " $Umwandler1 ": " $GleicheWandler1 + Write-Host "Gleiche für " $Umwandler2 ": " $GleicheWandler2 + + return $GleicheWandler1, $GleicheWandler2 +} + +Function GleicheFinden ($ZuUeberpruefen) +{ + $ZuUeberpruefen = $ZuUeberpruefen | Sort-Object "Name" + $Gleiche = @() + for ($i = 0; $i -lt $($ZuUeberpruefen.Count - 1); $i++) + { + $IstGleich = $($ZuUeberpruefen[$i].Name -eq $ZuUeberpruefen[$($i+1)].Name) + if ($IstGleich) + { + # Eintrag hinzufügen + if (-not $($Gleiche[-1].Zeile -eq $ZuUeberpruefen[$i].Zeile)) + { + $Gleiche += $ZuUeberpruefen[$i] + } + $Gleiche += $ZuUeberpruefen[$($i+1)] + #Write-Host "Gleiche: " $Gleiche + } + } + + if ( $($Gleiche.Length -eq 0)) + { + $Gleiche += @([PSCustomObject]@{ + Name = "Keine" + Zeile = "Alle" + }) + } + + return $Gleiche +} + +Main \ No newline at end of file diff --git a/Test-Skripte/GUI-Angepasst3.ps1 b/Test-Skripte/GUI-Angepasst3.ps1 new file mode 100644 index 0000000..b57ae0e --- /dev/null +++ b/Test-Skripte/GUI-Angepasst3.ps1 @@ -0,0 +1,264 @@ +# Änderungsziel vs. 2: Return in Main realisieren durch einbau von EventHandler +# Ist nicht auf Stand von 2!!!!! 2 Aktuell besser! +# https://techwizard.cloud/2014/03/11/powershell-custom-gui-input-box-for-passing-values-to-variables/ +# Todo: Alles + +Function Main +{ + +#Ändern. Laufwerke sollten möglichst in der GUI initialisert werden +$Laufwerke = LaufwerkeFinden + +[System.String]$Pfad = Gui $Laufwerke + +Write-Host "Dateityp nach Übergabe: " $Pfad.GetType() +Write-Host "Datei ausgewählt mit dem Verzeichnis " $Pfad +} + + +Function Gui ($Laufwerke) +{ +[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") +[void] [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic") +[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") + +# Eigenschaften Fenster +$Fenster = New-Object System.Windows.Forms.Form +$Fenster.Text = "Laufwerke" +$Fenster.Size = New-Object System.Drawing.Size(900,600) #Breite, Höhe +$Fenster.StartPosition = "CenterScreen" +$Fenster.KeyPreview = $true # was macht das? +$Fenster.MaximumSize = $Fenster.Size # legt fest, dass Größe des Fensters nicht verändert werden kann +$Fenster.MinimumSize = $Fenster.Size + +# PfadFeld +$PfadFeld = New-Object System.Windows.Forms.TextBox +$PfadFeld.Location = New-Object System.Drawing.Size(10,10) +$PfadFeld.Size = New-Object System.Drawing.Size(860,20) +#$PfadFeld.Text = $Pfad #Bringt nur etwas, wenn $Pfad einen Anfangswert hat, da der Text nicht laufend aktualisiert wird +$Fenster.Controls.Add($PfadFeld) + +# ListeOrdnernamen +$ListeOrdnernamen = New-Object System.Windows.Forms.ListBox +$ListeOrdnernamen.Location = New-Object System.Drawing.Size(10,40) +$ListeOrdnernamen.Size = New-Object System.Drawing.Size(860,20) +$ListeOrdnernamen.Height = 450 +foreach ($Laufwerk in $Laufwerke) +{ + $ListeOrdnernamen.Items.Add($Laufwerk) +} +<#for ($i = 0; $i -lt 100; $i++) +{ + $ListeOrdnernamen.Items.Add("Wert$i") +}#> +$Fenster.Controls.Add($ListeOrdnernamen) + +<# +# Beispiel Textfeld +$Textfeld1 = New-Object System.Windows.Forms.Label +$Textfeld1.Location = New-Object System.Drawing.Size(7,500) +$Textfeld1.Size = New-Object System.Drawing.Size(130,15) +$Textfeld1.Text = "Beispiel Text" +$Fenster.Controls.Add($Textfeld1) +#> + + +# AuswählenButton +$AuswählenButton = New-Object System.Windows.Forms.Button +$AuswählenButton.Location = New-Object System.Drawing.Size(750,500) +$AuswählenButton.Size = New-Object System.Drawing.Size(100,30) +$AuswählenButton.Text = "Auswählen" +$AuswählenButton.Add_MouseClick({ + # Aktion bei Klick + + # Variablen bestimmen zur Übergabe + $Auswahl = $ListeOrdnernamen.SelectedItem + $Pfad = $PfadFeld.Text + Write-Host "Gewählter Ordner/ Datei: " $Auswahl + Write-Host "Vorheriger Pfad: " $Pfad + + # Pfad aktualisieren + VerzeichnisAktualisieren $Pfad $Auswahl + +}) +$Fenster.Controls.Add($AuswählenButton) + +# ZurückButton +$ZurückButton = New-Object System.Windows.Forms.Button +$ZurückButton.Location = New-Object System.Drawing.Size(10,500) +$ZurückButton.Size = New-Object System.Drawing.Size(100,30) +$ZurückButton.Text = "Zurück" +$ZurückButton.Add_MouseClick({ + Write-Host "Pfad ausgabe: " $PfadFeld.Text + $Pfad = $PfadFeld.Text + + if ($Pfad.Length -gt 3) + { + # Weiter mit Ordnern/Dateien + Write-Host "Ordner/ Dateien anzeigen" + $Pfad = Split-Path $Pfad + Write-Host "Neuer Pfad: " $Pfad + $PfadFeld.Text = $Pfad + $Fenster.Text = $(Split-Path $Pfad) + $ListeOrdnernamen.Items.Clear() + Write-Host "Pfadwert vor Übergabe: " $Pfad + $Optionen = Optionen $Pfad + foreach ($Option in $Optionen) + { + # Write-Host "Option: " $Option + if ($Option.length -gt 0) + { + $ListeOrdnernamen.Items.Add($Option) + } + } + } + elseif ($Pfad.Length -le 3) + { + # Weiter mit Laufwerken + Write-Host "Laufwerke anzeigen" + $Pfad = Split-Path $Pfad + Write-Host "Neuer Pfad: " $Pfad + $PfadFeld.Text = $Pfad + $Fenster.Text = "Laufwerke" + $ListeOrdnernamen.Items.Clear() + Write-Host "Pfadwert vor Übergabe: " $Pfad + $Laufwerke = LaufwerkeFinden $Pfad + foreach ($Laufwerk in $Laufwerke) + { + # Write-Host "Option: " $Option + if ($Laufwerk.length -gt 0) + { + $ListeOrdnernamen.Items.Add($Laufwerk) + } + } + + } + else + { + # Fehler/ Nichts tun? + } +}) +$Fenster.Controls.Add($ZurückButton) + + +$Fenster.Add_Shown({$Fenster.Activate()}) +[void]$Fenster.ShowDialog() + +$eventHandler = [System.EventHandler]{ + $PfadFeld.Text + $ListeOrdnernamen.SelectedItem + $Fenster.Close() +} + +# TestButton +$TestButton = New-Object System.Windows.Forms.Button +$TestButton.Location = New-Object System.Drawing.Size(355,500) +$TestButton.Size = New-Object System.Drawing.Size(100,30) +$TestButton.Text = "Test" +$TestButton.Add_Click($eventHandler) +$Fenster.Controls.Add($TestButton) + +Write-Host "Ausgabe vor Ende Gui-Funktion, Pfad: " $Pfad +return $Pfad +} + +Function VerzeichnisAktualisieren ($Pfad, $Auswahl) +{ +if ($Pfad.length -gt 0) +{ + $Pfad = Join-Path -Path $Pfad -ChildPath $Auswahl -Resolve +} +else +{ + $Pfad = $Auswahl +} + +#Erkennen, ob *.txt-Datei gewählt wurde -> ggf. Auswahl abgeschlossen +if ($($Auswahl -match ".txt")) +{ + Write-Host ".txt-Datei ausgewählt, Pfad: " $Pfad + Write-Host "Dateityp: " $Pfad.GetType() + $Fenster.Dispose() + #NachAuswahl $Pfad + return $Pfad +} + +# Werte in Form aktualisieren +$PfadFeld.Text = $Pfad +$Fenster.Text = $Auswahl +$ListeOrdnernamen.Items.Clear() +$Optionen = Optionen $Pfad +Write-Host "Mögliche Optionen: " $Optionen +foreach ($Option in $Optionen) +{ + # Write-Host "Option: " $Option + if ($Option.length -gt 0) + { + $ListeOrdnernamen.Items.Add($Option) + } +} +Write-Host "Neuer Pfad: " $Pfad + +return +} + +Function NachAuswahl ($Pfad) +{ +Write-Host "Auswahl abgeschlossen, ab jetzt .txt-Datei bearbeiten" +Write-Host "Name in Funktion: " $Pfad + +Exit +} + +Function UnterOrdnerFinden($Pfad) +{ +#abfangen: keine Ordner vorhanden -> nicht nötig, da keine weitere Verarbeitung +$Ordner = $(Get-Childitem $Pfad -Directory) +return $Ordner +} + +Function LaufwerkeFinden() +{ +$Laufwerke = $(Get-PSDrive | where {$_.Free}).Name +$i = 0 + +foreach($Laufwerk in $Laufwerke) +{ + $Laufwerke[$i] = $Laufwerk + ":\" + $i++ +} + +return $Laufwerke +} + +Function TxtDateienFinden($Pfad) +{ +$TxtDateien = $(Get-Childitem $Pfad\*.txt) + +if ($TxtDateien.Length -gt 0) +{ + return $(Split-Path $TxtDateien -Leaf) +} +else +{ + return +} +} + +Function Optionen($Pfad) +{ +# Unterordner und .txt-Dateien finden +$UnterOrdner = UnterOrdnerFinden $Pfad +$TxtDateien = TxtDateienFinden $Pfad +#Write-Host "Gefundenen Unterordner: " $Unterorder +#Write-Host "Gefundenen TxtDateien: " $TxtDateien + +#Gibt aktuell auch Index und Typ (System.IO.DirectoryInfo bzw. System.String) zurück +$Optionen = $UnterOrdner + $TxtDateien +#Write-Host "Optionen vor Übergabe: " $Optionen + +return $Optionen +} + + +Main \ No newline at end of file diff --git a/Test-Skripte/GUI-Angepasst4.ps1 b/Test-Skripte/GUI-Angepasst4.ps1 new file mode 100644 index 0000000..33965b4 --- /dev/null +++ b/Test-Skripte/GUI-Angepasst4.ps1 @@ -0,0 +1,1090 @@ +Function Main +{ + Write-Host "Programmstart" + + $StartPfad = "R:\m.kraft\Excel Werte ändern" + + GUI $StartPfad + +} + + + +Function GUI ($StartPfad) +{ + [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") + [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") + + # Eigenschaften Fenster + $Fenster = New-Object System.Windows.Forms.Form + $Fenster.Size = New-Object System.Drawing.Size(940,660) #Breite, Höhe + $Fenster.StartPosition = "CenterScreen" + $Fenster.KeyPreview = $true # was macht das? + $Fenster.MaximumSize = $Fenster.Size # legt fest, dass Größe des Fensters nicht verändert werden kann + $Fenster.MinimumSize = $Fenster.Size + $Fenster.Text = "Dateikonvertierer txt zu xlsx" + + # Tabs + $TabBasis = New-Object System.Windows.Forms.TabControl + $TabBasis.Location = New-Object System.Drawing.Size(10,10) + $TabBasis.Size = New-Object System.Drawing.Size(900,600) + $TabBasis.DataBindings.DefaultDataSourceUpdateMode = 0 # Was macht das? + $Fenster.Controls.Add($TabBasis) + + # Tab: TXT-Pfad auswaehlen + $TabSeiteTXTAuswaehlen = New-Object System.Windows.Forms.TabPage + $TabSeiteTXTAuswaehlen.TabIndex = 0 + $TabSeiteTXTAuswaehlen.UseVisualStyleBackColor = $true + $TabSeiteTXTAuswaehlen.Text = "txt-Datei Auswaehlen" + #Paddings + $TabSeiteTXTAuswaehlen.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteTXTAuswaehlen) + + # TXTPfadFeld + $TXTPfadFeld = New-Object System.Windows.Forms.TextBox + $TXTPfadFeld.Location = New-Object System.Drawing.Size(10,10) + $TXTPfadFeld.Size = New-Object System.Drawing.Size(860,20) + $TXTPfadFeld.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionPfadFeld "txt" $Taste + }) + $TabSeiteTXTAuswaehlen.Controls.Add($TXTPfadFeld) + + # TXTListeOrdnernamen + $TXTListeOrdnernamen = New-Object System.Windows.Forms.ListBox + $TXTListeOrdnernamen.Location = New-Object System.Drawing.Size(10,40) + $TXTListeOrdnernamen.Size = New-Object System.Drawing.Size(860,20) + $TXTListeOrdnernamen.Height = 450 + $TXTListeOrdnernamen.Font = New-Object System.Drawing.Font("Arial",12,[System.Drawing.FontStyle]::Regular) + $TXTListeOrdnernamen.Add_DoubleClick({ + # Variablen bestimmen zur Übergabe + $Auswahl = $TXTListeOrdnernamen.SelectedItem + $Pfad = $TXTPfadFeld.Text + # Write-Host "Gewählter Ordner/ Datei: " $Auswahl + # Write-Host "Vorheriger Pfad: " $TXTPfad + + # Pfad aktualisieren + VerzeichnisAuswaehlen "txt" $Pfad $Auswahl + }) + $TXTListeOrdnernamen.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionListeOrdnernamen "txt" $Taste + }) + $TabSeiteTXTAuswaehlen.Controls.Add($TXTListeOrdnernamen) + + # ZurückButton + $TXTZurueckButton = New-Object System.Windows.Forms.Button + $TXTZurueckButton.Location = New-Object System.Drawing.Size(10,500) + $TXTZurueckButton.Size = New-Object System.Drawing.Size(100,30) + $TXTZurueckButton.Text = "Zurueck" + $TXTZurueckButton.Add_Click({ + # Write-Host "Pfad ausgabe: " $TXTPfadFeld.Text + $Pfad = $TXTPfadFeld.Text + + #Pfad aktualisieren + VerzeichnisZurueck "txt" $Pfad + }) + $TXTZurueckButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionButtons "txt" $Taste + }) + $TabSeiteTXTAuswaehlen.Controls.Add($TXTZurueckButton) + + # AuswaehlenButton + $TXTAuswaehlenButton = New-Object System.Windows.Forms.Button + $TXTAuswaehlenButton.Location = New-Object System.Drawing.Size(750,500) + $TXTAuswaehlenButton.Size = New-Object System.Drawing.Size(100,30) + $TXTAuswaehlenButton.Text = "Auswaehlen" + $TXTAuswaehlenButton.Add_Click({ + # Variablen bestimmen zur Übergabe + $Auswahl = $TXTListeOrdnernamen.SelectedItem + $Pfad= $TXTPfadFeld.Text + # Write-Host "Gewählter Ordner/ Datei: " $Auswahl + # Write-Host "Vorheriger Pfad: " $TXTPfad + + # Pfad aktualisieren + VerzeichnisAuswaehlen "txt" $Pfad $Auswahl + }) + $TXTAuswaehlenButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionButtons "txt" $Taste + }) + $TabSeiteTXTAuswaehlen.Controls.Add($TXTAuswaehlenButton) + + $A = AnzeigeAktualisieren "txt" $StartPfad # Ohne dem Aufruf kann kein Startverzeichnis übergeben werden. Wird der Aufruf keiner Variable zugewiesen verursacht dies Fehler bei der Rückgabe. + + #$TXTDatei = $TXTPfadFeld.Text + + # Tab: Zielverzeichnis auswaehlen + $TabSeiteZielVerzeichnisAuswaehlen = New-Object System.Windows.Forms.TabPage + $TabSeiteZielVerzeichnisAuswaehlen.TabIndex = 1 + $TabSeiteZielVerzeichnisAuswaehlen.UseVisualStyleBackColor = $true + $TabSeiteZielVerzeichnisAuswaehlen.Text = "Zielverzeichnis Auswaehlen" + #Paddings + $TabSeiteZielVerzeichnisAuswaehlen.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteZielVerzeichnisAuswaehlen) + + # PfadFeld + $VERPfadFeld = New-Object System.Windows.Forms.TextBox + $VERPfadFeld.Location = New-Object System.Drawing.Size(10,10) + $VERPfadFeld.Size = New-Object System.Drawing.Size(860,20) + $VERPfadFeld.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionPfadFeld "ver" $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERPfadFeld) + + # ListeOrdnernamen + $VERListeOrdnernamen = New-Object System.Windows.Forms.ListBox + $VERListeOrdnernamen.Location = New-Object System.Drawing.Size(10,40) + $VERListeOrdnernamen.Size = New-Object System.Drawing.Size(860,20) + $VERListeOrdnernamen.Height = 450 + $VERListeOrdnernamen.Font = New-Object System.Drawing.Font("Arial",12,[System.Drawing.FontStyle]::Regular) + $VERListeOrdnernamen.Add_DoubleClick({ + # Variablen bestimmen zur Übergabe + $Auswahl = $VERListeOrdnernamen.SelectedItem + $Pfad = $VERPfadFeld.Text + # Write-Host "Gewählter Ordner/ Datei: " $Auswahl + # Write-Host "Vorheriger Pfad: " $VERPfad + + # Pfad aktualisieren + VerzeichnisAuswaehlen "ver" $Pfad $Auswahl + }) + $VERListeOrdnernamen.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionListeOrdnernamen "ver" $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERListeOrdnernamen) + + # ZurückButton + $VERZurueckButton = New-Object System.Windows.Forms.Button + $VERZurueckButton.Location = New-Object System.Drawing.Size(10,500) + $VERZurueckButton.Size = New-Object System.Drawing.Size(100,30) + $VERZurueckButton.Text = "Zurueck" + $VERZurueckButton.Add_Click({ + # Write-Host "Pfad ausgabe: " $VERPfadFeld.Text + $Pfad = $VERPfadFeld.Text + + #Pfad aktualisieren + VerzeichnisZurueck "ver" $Pfad + }) + $VERZurueckButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionButtons "ver" $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERZurueckButton) + + # AuswaehlenButton + $VERAuswaehlenButton = New-Object System.Windows.Forms.Button + $VERAuswaehlenButton.Location = New-Object System.Drawing.Size(630,500) + $VERAuswaehlenButton.Size = New-Object System.Drawing.Size(100,30) + $VERAuswaehlenButton.Text = "Auswaehlen" + $VERAuswaehlenButton.Add_Click({ + # Variablen bestimmen zur Übergabe + $Auswahl = $VERListeOrdnernamen.SelectedItem + $Pfad = $VERPfadFeld.Text + # Write-Host "Gewählter Ordner/ Datei: " $Auswahl + # Write-Host "Vorheriger Pfad: " $VERPfad + + if ($($VERListeOrdnernamen.Items[0] -eq "")) + { + VERAuswahlBestaetigt $Pfad $Auswahl + } + else + { + # Pfad aktualisieren + VerzeichnisAuswaehlen "ver" $Pfad $Auswahl + } + }) + $VERAuswaehlenButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionButtons "ver" $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERAuswaehlenButton) + + # BestaetigenButton + $VERBestaetigenButton = New-Object System.Windows.Forms.Button + $VERBestaetigenButton.Location = New-Object System.Drawing.Size(750,500) + $VERBestaetigenButton.Size = New-Object System.Drawing.Size(100,30) + $VERBestaetigenButton.Text = "Bestaetigen" + $VERBestaetigenButton.Add_Click({ + $Auswahl = $VERListeOrdnernamen.SelectedItem + $Pfad = $VERPfadFeld.Text + + VERAuswahlBestaetigt $Pfad $Auswahl + }) + $VERBestaetigenButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionButtons "ver" $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERBestaetigenButton) + + # Dieser Funktionsaufruf zerstört die Rückgabe, wenn er keiner Variable zugewiesen wird + #$A = AnzeigeAktualisieren "ver" $TXTPfadFeld.Text + + #$ZielVerzeichnis = $VERPfadFeld.Text + + # Tab: Ausgabe Fortschritt + $TabSeiteFortschrittsanzeige = New-Object System.Windows.Forms.TabPage + $TabSeiteFortschrittsanzeige.TabIndex = 2 + $TabSeiteFortschrittsanzeige.UseVisualStyleBackColor = $true + $TabSeiteFortschrittsanzeige.Text = "Bearbeitungsfortschritt" + #Paddings + $TabSeiteFortschrittsanzeige.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteFortschrittsanzeige) + + $FATextfeld1 = New-Object System.Windows.Forms.Label + $FATextfeld1.Location = New-Object System.Drawing.Size(10,10) + $FATextfeld1.Size = New-Object System.Drawing.Size(200,20) + $FATextfeld1.Text = "Aktuelle Aufgabe" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld1) + + $FATextfeld2 = New-Object System.Windows.Forms.Label + $FATextfeld2.Location = New-Object System.Drawing.Size(300,10) + $FATextfeld2.Size = New-Object System.Drawing.Size(430,20) + $FATextfeld2.Text = "Erledigte Aufgaben" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld2) + + $FATextfeldAktuelleAufgabe = New-Object System.Windows.Forms.Label + $FATextfeldAktuelleAufgabe.Location = New-Object System.Drawing.Size(10,40) + $FATextfeldAktuelleAufgabe.Size = New-Object System.Drawing.Size(280,60) + $FATextfeldAktuelleAufgabe.Text = "txt-Datei auswaehlen" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeldAktuelleAufgabe) + + $FAListeErledigteAufgaben = New-Object System.Windows.Forms.ListBox + $FAListeErledigteAufgaben.Location = New-Object System.Drawing.Size(300,40) + $FAListeErledigteAufgaben.Size = New-Object System.Drawing.Size(430,20) + $FAListeErledigteAufgaben.Height = 150 + $FAListeErledigteAufgaben.Font = New-Object System.Drawing.Font("Arial",12,[System.Drawing.FontStyle]::Regular) + $TabSeiteFortschrittsanzeige.Controls.Add($FAListeErledigteAufgaben) + + $FATextfeld3 = New-Object System.Windows.Forms.Label + $FATextfeld3.Location = New-Object System.Drawing.Size(10,100) + $FATextfeld3.Size = New-Object System.Drawing.Size(430,20) + $FATextfeld3.Text = "Fortschritt Excel-Dateien beschreiben" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld3) + + $FAFortschrittsbar = New-Object System.Windows.Forms.ProgressBar + $FAFortschrittsbar.Location = New-Object System.Drawing.Size(10,120) + $FAFortschrittsbar.Size = New-Object System.Drawing.Size(260,30) + #$FAFortschrittsbar.Name = "Fortschrittsanzeige" + $FAFortschrittsbar.Value = 0 + $TabSeiteFortschrittsanzeige.Controls.Add($FAFortschrittsbar) + + $FATextfeldRealwertFortschrittsbar = New-Object System.Windows.Forms.Label # Wird verwendet, aber VSC erkennt das nicht + + $FATextfeld4 = New-Object System.Windows.Forms.Label + $FATextfeld4.Location = New-Object System.Drawing.Size(10,170) + $FATextfeld4.Size = New-Object System.Drawing.Size(140,20) + $FATextfeld4.Text = "Bearbeitete Eintraege:" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld4) + + $FATextfeld5 = New-Object System.Windows.Forms.Label + $FATextfeld5.Location = New-Object System.Drawing.Size(10,200) + $FATextfeld5.Size = New-Object System.Drawing.Size(100,20) + $FATextfeld5.Text = "Gesamteintraege:" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld5) + + $FATextfeldBearbeiteteEintraege = New-Object System.Windows.Forms.Label + $FATextfeldBearbeiteteEintraege.Location = New-Object System.Drawing.Size(170,170) + $FATextfeldBearbeiteteEintraege.Size = New-Object System.Drawing.Size(430,20) + $FATextfeldBearbeiteteEintraege.Text = "0" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeldBearbeiteteEintraege) + + $FATextfeldGesamtEintraege = New-Object System.Windows.Forms.Label + $FATextfeldGesamtEintraege.Location = New-Object System.Drawing.Size(170,200) + $FATextfeldGesamtEintraege.Size = New-Object System.Drawing.Size(430,20) + $FATextfeldGesamtEintraege.Text = $($Ursprungdatei.Length) + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeldGesamtEintraege) + + # Tab: Ausgabe doppelte Ein- und Ausgänge sowie nicht zurordnebare Betriebsmittel + $TabSeiteDuplikate = New-Object System.Windows.Forms.TabPage + $TabSeiteDuplikate.TabIndex = 3 + $TabSeiteDuplikate.UseVisualStyleBackColor = $true + $TabSeiteDuplikate.Text = "Doppelte Ein- und Ausgaenge" + #Paddings + $TabSeiteDuplikate.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteDuplikate) + + $DPTextfeld1 = New-Object System.Windows.Forms.Label + $DPTextfeld1.Location = New-Object System.Drawing.Size(10,10) + $DPTextfeld1.Size = New-Object System.Drawing.Size(275,40) + $DPTextfeld1.Text = "Bei den Eingaengen gibt es folgende Duplikate: " + $TabSeiteDuplikate.Controls.Add($DPTextfeld1) + + $DPListeEingaenge = New-Object System.Windows.Forms.DataGridView + $DPListeEingaenge.Location = New-Object System.Drawing.Size(10,60) + $DPListeEingaenge.Size = New-Object System.Drawing.Size(275,20) + $DPListeEingaenge.Height = 430 + $DPListeEingaenge.ColumnCount = 2 + $DPListeEingaenge.ColumnHeadersVisible = $true + $DPListeEingaenge.Columns[0].Name = "Zeile" + $DPListeEingaenge.Columns[1].Name = "Kennzeichnung" + $TabSeiteDuplikate.Controls.Add($DPListeEingaenge) + + $DPTextfeld2 = New-Object System.Windows.Forms.Label + $DPTextfeld2.Location = New-Object System.Drawing.Size(295,10) + $DPTextfeld2.Size = New-Object System.Drawing.Size(275,40) + $DPTextfeld2.Text = "Bei den Ausgaengen gibt es folgende Duplikate: " + $TabSeiteDuplikate.Controls.Add($DPTextfeld2) + + $DPListeAusgaenge = New-Object System.Windows.Forms.DataGridView + $DPListeAusgaenge.Location = New-Object System.Drawing.Size(295,60) + $DPListeAusgaenge.Size = New-Object System.Drawing.Size(275,20) + $DPListeAusgaenge.Height = 430 + $DPListeAusgaenge.ColumnCount = 2 + $DPListeAusgaenge.ColumnHeadersVisible = $true + $DPListeAusgaenge.Columns[0].Name = "Zeile" + $DPListeAusgaenge.Columns[1].Name = "Kennzeichnung" + $TabSeiteDuplikate.Controls.Add($DPListeAusgaenge) + + $DPTextfeld3 = New-Object System.Windows.Forms.Label + $DPTextfeld3.Location = New-Object System.Drawing.Size(580,10) + $DPTextfeld3.Size = New-Object System.Drawing.Size(275,40) + $DPTextfeld3.Text = "Folgende Eintraege konnten keinem Betriebsmittel zugewiesen werden:" + $TabSeiteDuplikate.Controls.Add($DPTextfeld3) + + $DPListeFehler = New-Object System.Windows.Forms.DataGridView + $DPListeFehler.Location = New-Object System.Drawing.Size(580,60) + $DPListeFehler.Size = New-Object System.Drawing.Size(275,20) + $DPListeFehler.Height = 430 + $DPListeFehler.ColumnCount = 2 + $DPListeFehler.ColumnHeadersVisible = $true + $DPListeFehler.Columns[0].Name = "Zeile" + $DPListeFehler.Columns[1].Name = "Kennzeichnung" + $TabSeiteDuplikate.Controls.Add($DPListeFehler) + + $DPBestaetigenButton = New-Object System.Windows.Forms.Button + $DPBestaetigenButton.Location = New-Object System.Drawing.Size(10,500) + $DPBestaetigenButton.Size = New-Object System.Drawing.Size(860,30) + $DPBestaetigenButton.Text = "Programm beenden" + $DPBestaetigenButton.Add_Click({ + $Fenster.Dispose() + return + }) + $TabSeiteDuplikate.Controls.Add($DPBestaetigenButton) + + + $Fenster.Add_Shown({$Fenster.Activate()}) + [void]$Fenster.ShowDialog() + + return +} + +#------------------- Funktion nur für das txt-GUI -------------------------- + +Function TXTReaktionReturn ($Pfad) +{ + if (PfadExistiert $Pfad) + { + # Gültiger Pfad oder .txt-Datei + $PfadEnde = $(Split-Path $Pfad -Leaf) + if ($($PfadEnde -match ".txt")) + { + #$Fenster.Dispose() + ZuVERSpringen + # Ist zwar sachlich gesehen unsinn, aber sonst funktioniert Return in der GUI nicht richtig + $TXTPfadFeld.Text = $Pfad + return + } + else + { + AnzeigeAktualisieren "txt" $Pfad + } + } + else + { + # Laufwerke aktualisieren oder ungültiger Pfad + AnzeigeAktualisieren "txt" "" + } + return +} + +#------------------- Funktion nur für das VerzeichnisWaehlen-GUI -------------------------- + + +# Führt $Pfad und $Auswahl zusammen und überprüft ob der daraus resultierte neue Pfad vorhanden ist. Falls dies der Fall ist wird in den Bereich der Fortschrittsanzeige gewechselt +Function VERAuswahlBestaetigt($Pfad, $Auswahl) +{ +$Pfad = Join-Path -Path $Pfad -ChildPath $Auswahl -Resolve + +if (PfadExistiert $Pfad) +{ + ZuFASpringen + $VERPfadfeld.Text = $Pfad + return +} +} + + +#------------------- Funktionen zum wechseln der Tabs -------------------------- + +Function ZuVERSpringen +{ + AnzeigeAktualisieren "ver" $TXTPfadFeld.Text + AufgabenAktualisieren "Zielverzeichnis auswaehlen" + Write-Host "Gewaehlte txt-Datei: " $TXTPfadFeld.Text + $TabBasis.SelectedIndex = 1 +} + +Function ZuFASpringen +{ + # Falls Einstellungen eingefügt werden: in dieser Funktion viel Todo + + AufgabenAktualisieren "Zieldateinamen erstellen" + Write-Host "Gewaehltes Verzeichnis: " $VERPfadFeld.Text + $TabBasis.SelectedIndex = 2 + + $PfadUrsprungsdatei = $TXTPfadFeld.Text + $PfadZielDateien = $VERPfadFeld.Text + $PfadDateiEA = ExcelDateiNameErstellen "EA" $PfadUrsprungsdatei $PfadZielDateien + $PfadDateiDIDQ = ExcelDateiNameErstellen "DIDQ" $PfadUrsprungsdatei $PfadZielDateien + + AufgabenAktualisieren "Neue Excel-Dateien erstellen" + ExcelDateiErstellen $PfadDateiEA + ExcelDateiErstellen $PfadDateiDIDQ + + AufgabenAktualisieren "Excel-Dateien mit Inhalten befuellen und Duplikate finden" + $AlleGleichenEA = ExcelDateiBeschreibenStandard $PfadUrsprungsdatei "E" "A" $PfadDateiEA + $AlleGleichenDIDQ = ExcelDateiBeschreibenSpezial $PfadUrsprungsdatei "%I" "%Q" $PfadDateiDIDQ + #Write-Host "Gleiche EA nach Rückgabe: " $AlleGleichenEA + $GleicheEingaenge = $AlleGleichenEA[0] + $GleicheAusgaenge = $AlleGleichenEA[1] + $Fehler = $AlleGleichenEA[2] + + Write-Host "Gleiche Eingaenge: " $GleicheEingaenge + Write-Host "Gleiche Ausgaenge: " $GleicheAusgaenge + Write-Host "Fehler: " $Fehler + + AufgabenAktualisieren "Ausgabe Duplikate" + ZuDPSpringen $GleicheEingaenge $GleicheAusgaenge $Fehler +} + +Function ZuDPSpringen ($GleicheEingaenge, $GleicheAusgaenge, $Fehler) +{ + foreach ($GleichenEingang in $GleicheEingaenge) { + $DPListeEingaenge.Rows.Add($($GleichenEingang.Zeile),($GleichenEingang.Name)) + } + + foreach ($GleichenAusgang in $GleicheAusgaenge) { + $DPListeAusgaenge.Rows.Add($($GleichenAusgang.Zeile),($GleichenAusgang.Name)) + } + + foreach ($Fehlen in $Fehler) { + $DPListeFehler.Rows.Add($($Fehlen.Zeile),($Fehlen.Name)) + } + + $TabBasis.SelectedIndex = 3 +} + +#------------------- Funktionen für alle GUIs -------------------------- + + +# Bekommt Pfad, stellt fest ob Laufwerke oder Ordner angezeigt werden müssen und aktualisiert entsprechend alles +# Um die Laufwerke anzuzeigen, muss der $Pfad = "" sein +Function AnzeigeAktualisieren ($AuswahlTyp, $Pfad) +{ +# Write-Host "Übergebener Pfad: " $Pfad + +# Sicherstellen, dass es das Verzeichnis gibt +if (PfadExistiert $Pfad) +{ + Write-Host "Ordner anzeigen" + $Optionen = Optionen $AuswahlTyp $Pfad +} +elseif ($Pfad.Length -eq 0) { + Write-Host "Laufwerke anzeigen" + $Optionen = LaufwerkeFinden + $Pfad = "" +} +else +{ + AnzeigeAktualisieren "" + return +} + +if ($($AuswahlTyp -eq "txt")) { + $TXTPfadFeld.Text = $Pfad + $TXTListeOrdnernamen.Items.Clear() + foreach ($Option in $Optionen) + { + if ($Option.Length -gt 0) + { + $TXTListeOrdnernamen.Items.Add($Option) + } + } +} +elseif ($($AuswahlTyp -eq "ver")) { + $VERPfadFeld.Text = $Pfad + $VERListeOrdnernamen.Items.Clear() + foreach ($Option in $Optionen) + { + if ($Option.Length -gt 0) + { + $VERListeOrdnernamen.Items.Add($Option) + } + } +} + +return +} + +Function VerzeichnisAuswaehlen ($AuswahlTyp, $Pfad, $Auswahl) +{ +if (PfadExistiert $Pfad) +{ + $Pfad = Join-Path -Path $Pfad -ChildPath $Auswahl -Resolve +} +elseif ($Pfad.Length -eq 0) { + #Wenn der Pfad die Länge 0 hat, wurde ein Laufwerk gewählt + $Pfad = $Auswahl +} +else { + #Fehlerfall/ ungültiger Pfad: zurück zu Laufwerken navigieren + $Pfad = "" +} + +# Erkennen, ob *.txt-Datei gewählt wurde -> ggf. Auswahl abgeschlossen +if ($($($Auswahl -match ".txt") -and $($AuswahlTyp -eq "txt"))) +{ + # Für den Gesamtfortschritt Anzahl Dateien auslesen + $Datei = Get-Content $Pfad + $FATextfeldGesamtEintraege.Text = 2 * $($Datei.Length) + + # Write-Host ".txt-Datei ausgewählt, Pfad: " $Pfad + # Write-Host "Dateityp: " $Pfad.GetType() + ZuVERSpringen + # Ist zwar sachlich gesehen unsinn, aber sonst funktioniert Return in der GUI nicht + $TXTPfadFeld.Text = $Pfad + return +} + +AnzeigeAktualisieren $AuswahlTyp $Pfad + +return +} + +Function VerzeichnisZurueck ($AuswahlTyp, $Pfad) +{ +if ($Pfad.Length -gt 3) +{ + # Weiter mit Ordnern + # Write-Host "Ordner anzeigen" + $Pfad = Split-Path $Pfad +} +elseif ($Pfad.Length -le 3) +{ + # Weiter mit Laufwerken + # Write-Host "Laufwerke anzeigen" + $Pfad = "" +} +else +{ + Write-Host "Fehler bei Verzeichnis zurueck" + # Fehler/ Nichts tun? + # Ermitteln: wann tritt dieser Fall ein? + $Pfad = "" +} +AnzeigeAktualisieren $AuswahlTyp $Pfad +return +} + +Function TastenReaktionPfadFeld($AuswahlTyp, $Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +if ($AuswahlTyp -eq "txt") { + switch ($Taste){ + "Return" { + # Write-Host "Enter gedrückt" + $Pfad = $TXTPfadFeld.Text + # Write-Host "Pfad: " $Pfad + + TXTReaktionReturn $Pfad + } + Default { + # Write-Host "Gedrückte Taste: " $Taste + } + } +} +elseif ($AuswahlTyp -eq "ver") { + switch ($Taste) { + "Return" { + $Pfad = $VERPfadFeld.Text + + AnzeigeAktualisieren "ver" $Pfad + } + # Entfernt, da man sonst im PfadFeld nicht groß schreiben kann! + <#"ShiftKey" { + $Pfad = $VERPfadFeld.Text + $Auswahl = $VERListeOrdnernamen.SelectedItem + + ReaktionShiftKey $Pfad $Auswahl + }#> + Default { + # Write-Host "Gedrückte Taste: " $Taste + } + } +} +return +} + +Function TastenReaktionListeOrdnernamen($AuswahlTyp, $Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +if ($AuswahlTyp -eq "txt"){ + switch ($Taste){ + "Return" { + # Write-Host "Enter gedrückt" + $Auswahl = $TXTListeOrdnernamen.SelectedItem + $Pfad = $TXTPfadFeld.Text + # Write-Host "Auswahl: " $Auswahl + # Write-Host "Pfad: " $Pfad + + VerzeichnisAuswaehlen $AuswahlTyp $Pfad $Auswahl + } + "Back" { + # Write-Host "Back gedrückt" + $Pfad = $TXTPfadFeld.Text + # Write-Host "Pfad: " $Pfad + + # Pfad aktualisieren + VerzeichnisZurueck $AuswahlTyp $Pfad + } + Default { + # Write-Host "Gedrückte Taste: " $Taste + } + } +} +elseif ($AuswahlTyp -eq "ver") { + switch ($Taste) { + "Return" { + $Auswahl = $VERListeOrdnernamen.SelectedItem + $Pfad = $VERPfadFeld.Text + VerzeichnisAuswaehlen $AuswahlTyp $Pfad $Auswahl + } + "Back" { + $Pfad = $VERPfadFeld.Text + VerzeichnisZurueck $AuswahlTyp $Pfad + } + "ShiftKey" { + $Pfad = $VERPfadFeld.Text + $Auswahl = $VERListeOrdnernamen.SelectedItem + ReaktionShiftKey $Pfad $Auswahl + } + Default { + # Write-Hoste "Gedrückte Taste: " $Taste + } + } +} + +return +} + +Function TastenReaktionButtons($AuswahlTyp, $Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +if ($AuswahlTyp -eq "txt") { + switch ($Taste){ + "Back" { + # Write-Host "Back gedrückt" + $Pfad = $TXTPfadFeld.Text + # Write-Host "Pfad: " $Pfad + + # Pfad aktualisieren + VerzeichnisZurueck $AuswahlTyp $Pfad + } + Default { + # Write-Host "Gedrückte Taste: " $Taste + } + } +} +elseif ($AuswahlTyp -eq "ver") { + switch ($Taste) { + "Back" { + $Pfad = $VERPfadFeld.Text + VerzeichnisZurueck $AuswahlTyp $Pfad + } + "ShiftKey" { + $Pfad = $VERPfadFeld.Text + $Auswahl = $VERListeOrdnernamen.SelectedItem + ReaktionShiftKey $Pfad $Auswahl + } + Default { + # Write-Host "Gedrückte Taste: " $Taste + } + } +} +return +} + +Function Optionen($AuswahlTyp, $Pfad) +{ +# Unterordner und .txt-Dateien finden +# Typzuweisung nötig, da aus unbekanntem Grund sonst Unterordner, die mit "_" beginnen, nicht gefunden werden können +[System.Object[]]$UnterOrdner = UnterOrdnerFinden $Pfad + +if ($AuswahlTyp -eq "txt") { + $TxtDateien = TxtDateienFinden $Pfad + #Gibt aktuell auch Index und Typ (System.IO.DirectoryInfo bzw. System.String) zurück + $Optionen = $UnterOrdner + $TxtDateien +} +elseif ($AuswahlTyp -eq "ver") { + #Gibt aktuell auch Index und Typ (System.IO.DirectoryInfo bzw. System.String) zurück + $Optionen = $UnterOrdner +} +return $Optionen +} + +Function PfadExistiert ($Pfad) +{ +# Um Abzufangen, dass Test-Path mit leerem Wert durchlaufen wird. Leere Verzeichnisse gelten als ungültig. +if ($Pfad.Length -eq 0) { + return $false +} +if ($(Test-Path $Pfad -PathType Container) -or $(Test-Path $Pfad -Include "*.txt")) +{ + # Write-Host "Bei dem Verzeichnis handelt es sich um eine *.txt-Datei oder ein gültiges Verzeichnis" + return $true +} +else +{ + # Write-Host "Das Verzeichnis existiert nicht oder es wurde keine *.txt-Datei gewählt" + return $false +} +} + +Function LaufwerkeFinden() +{ +$Laufwerke = $(Get-PSDrive | Where-Object {$_.Free}).Name +$i = 0 + +foreach($Laufwerk in $Laufwerke) +{ + $Laufwerke[$i] = $Laufwerk + ":\" + $i++ +} +return $Laufwerke +} + +Function UnterOrdnerFinden($Pfad) +{ +$UnterOrdner = $(Get-ChildItem $Pfad -Directory) + +if ($($UnterOrdner.Length -gt 0)) +{ + $Ordner = $(Split-Path $UnterOrdner -Leaf) +} +else { + $Ordner = "" +} + +return $Ordner +} + +Function TxtDateienFinden($Pfad) +{ +$TxtDateien = $(Get-Childitem $Pfad\*.txt) + +if ($TxtDateien.Length -gt 0) +{ + return $(Split-Path $TxtDateien -Leaf) +} +else +{ + return +} +} + +Function ReaktionShiftKey ($Pfad, $Auswahl) +{ + if (PfadExistiert $Pfad) + { + VERAuswahlBestaetigt $Pfad $Auswahl + } + else + { + AnzeigeAktualisieren "ver" "" + } + return +} + + +Function AufgabenAktualisieren ($Aufgabe) +{ + $FAListeErledigteAufgaben.Items.Add($FATextfeldAktuelleAufgabe.Text) + $FATextfeldAktuelleAufgabe.Text = $Aufgabe +} + +Function DateiBeschreibenAktualisieren +{ + $AnteilJeBeschriftung = 100 / $($FATextfeldGesamtEintraege.Text) + [System.double] $FATextfeldRealwertFortschrittsbar.Text += $AnteilJeBeschriftung + + #Da $FAFortschrittsbar.Value anscheinend ein int ist, ist der letzte Wert i. d. R. höher als 100 -> Fehler, der hiermit abgefangen wird + if ($([System.Double]$FATextfeldRealwertFortschrittsbar.Text) -ge 100) + { + $FAFortschrittsbar.Value = 100 + } + else + { + $FAFortschrittsbar.Value = $FATextfeldRealwertFortschrittsbar.Text + } + + + [System.Int64] $BearbeiteteEintraege = $FATextfeldBearbeiteteEintraege.Text + $BearbeiteteEintraege++ + $FATextfeldBearbeiteteEintraege.Text = $BearbeiteteEintraege +} +#--------------------------------------- Ende Funktionen für GUI ------------------------------- + +Function ExcelDateiNameErstellen ($Prefix, $PfadUrsprungsdatei, $PfadZielDatei) +{ + $BasisNameZielDatei = Split-Path $PfadUrsprungsdatei -Leaf + $BasisNameZielDateiLaenge = $BasisNameZielDatei.Length + $BasisNameZielDateiKurz = $BasisNameZielDatei.Substring(0, $($BasisNameZielDateiLaenge - 4)) + $GesamtPfadZielDatei = $PfadZielDatei + "\" + $Prefix + "_" + $BasisNameZielDateiKurz + ".xlsx" + + return $GesamtPfadZielDatei +} + +Function ExcelDateiErstellen ($DateiPfad) +{ + $Datei = New-Object -ComObject Excel.Application + $Mappe = $Datei.Workbooks.Add() + $Mappe.SaveAs($DateiPfad) + $Datei.Quit() + + return +} + +Function ExcelDateiBeschreibenStandard ($PfadUrsprungsdatei, $PrefixEingang, $PrefixAusgang, $ZielDatei) +{ + $Datei = New-Object -ComObject Excel.Application + $Mappe = $Datei.Workbooks.Open($ZielDatei) + $Blatt = $Mappe.WorkSheets.item(1) + $Datei.Visible = $false + + $i = 1 + $Eingaenge = @() + $ZuEingang = @("B", "S", "E", "I", "DI", "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BJ", "BK", "BL", "BM", "BN", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", "FA", "FB", "FC", "FD", "FE", "FF", "FG", "FH", "FJ", "FK", "FL", "FM", "FN", "FP", "FQ", "FR", "FS", "FT", "FU", "FV", "FW", "FX", "FY", "FZ", "SA", "SB", "SC", "SD", "SE", "SF", "SG", "SH", "SJ", "SK", "SL", "SM", "SN", "SP", "SQ", "SR", "SS", "ST", "SU", "SV", "SW", "SX", "SY", "SZ") + $Ausgaenge = @() + $ZuAusgang = @("K", "O", "Q,", "M", "A", "P", "DQ", "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CJ", "CK", "CL", "CM", "CN", "CP", "CQ", "CR", "CS", "CT", "CU", "CV", "CW", "CX", "CY", "CZ", "EA", "EB", "EC", "ED", "EE", "EF", "EG", "EH", "EJ", "EK", "EL", "EM", "EN", "EP", "EQ", "ER", "ES", "ET", "EU", "EV", "EW", "EX", "EY", "EZ", "GA", "GB", "GC", "GD", "GE", "GF", "GG", "GH", "GJ", "GK", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GV", "GW", "GX", "GY", "GZ", "HA", "HB", "HC", "HD", "HE", "HF", "HG", "HH", "HJ", "HK", "HL", "HM", "HN", "HP", "HQ", "HR", "HS", "HT", "HU", "HV", "HW", "HX", "HY", "HZ", "KA", "KB", "KC", "KD", "KE", "KF", "KG", "KH", "KJ", "KK", "KL", "KM", "KN", "KP", "KQ", "KR", "KS", "KT", "KU", "KV", "KW", "KX", "KY", "KZ", "MA", "MB", "MC", "MD", "ME", "MF", "MG", "MH", "MJ", "MK", "ML", "MM", "MN", "MP", "MQ", "MR", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "PA", "PB", "PC", "PD", "PE", "PF", "PG", "PH", "PJ", "PK", "PL", "PM", "PN", "PP", "PQ", "PR", "PS", "PT", "PU", "PV", "PW", "PX", "PY", "PZ", "QA", "QB", "QC", "QD", "QE", "QF", "QG", "QH", "QJ", "QK", "QL", "QM", "QN", "QP", "QQ", "QR", "QS", "QT", "QU", "QV", "QW", "QX", "QY", "QZ", "RA", "RB", "RC", "RD", "RE", "RF", "RG", "RH", "RJ", "RK", "RL", "RM", "RN", "RP", "RQ", "RR", "RS", "RT", "RU", "RV", "RW", "RX", "RY", "RZ", "TA", "TB", "TC", "TD", "TE", "TF", "TG", "TH", "TJ", "TK", "TL", "TM", "TN", "TP", "TQ", "TR", "TS", "TT", "TU", "TV", "TW", "TX", "TY", "TZ") + $Fehler = @() + + $Ursprungdatei = Get-Content $PfadUrsprungsdatei + + foreach ($Eintrag in $Ursprungdatei) + { + $Eintragszeile = $Eintrag.Split("'") + $BMKZahl = $Eintragszeile[1] + $BMKZahl = $BMKZahl.TrimStart("'") + $Kommentar = $Eintragszeile[3] + $Kommentar = $Kommentar.TrimEnd("'") + + if ($($($BMKZahl -replace "[\d]") -in $ZuEingang)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $PrefixEingang + $BMKZahl + $Eingaenge += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + elseif ($($($BMKZahl -replace "[\d]") -in $ZuAusgang)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $PrefixAusgang + $BMKZahl + $Ausgaenge += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + else + { + Write-Host "Achtung, Fehler bei " $BMKZahl $Kommentar + $Fehler += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + + # Write-Host "In Excel schreiben: BMKZahl: " $BMKZahl " Kommentar: " $Kommentar + $Blatt.Cells.Item($i,1) = $BMKZahl + $Blatt.Cells.Item($i,2) = $Kommentar + + $i++ + + DateiBeschreibenAktualisieren + } + + $Mappe.Save() + $Datei.Quit() + + $GleicheEingaenge = GleicheFinden $Eingaenge + $GleicheAusgaenge = GleicheFinden $Ausgaenge + Write-Host "Gleiche fuer " $PrefixEingang ": " $GleicheEingaenge + Write-Host "Gleiche fuer " $PrefixAusgang ": " $GleicheAusgaenge + Write-Host "Fehler bei: " $Fehler + + if ( $($Fehler.Length -eq 0)) + { + $Fehler += @([PSCustomObject]@{ + Name = "Keine" + Zeile = "Alle" + }) + } + + return $GleicheEingaenge, $GleicheAusgaenge, $Fehler +} + +Function ExcelDateiBeschreibenSpezial ($PfadUrsprungsdatei, $PrefixEingang, $PrefixAusgang, $ZielDatei) +{ + $Datei = New-Object -ComObject Excel.Application + $Mappe = $Datei.Workbooks.Open($ZielDatei) + $Blatt = $Mappe.WorkSheets.item(1) + $Datei.Visible = $false + + $i = 2 + $Eingaenge = @() + $ZuEingang = @("B", "S", "E", "I", "DI", "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BJ", "BK", "BL", "BM", "BN", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", "FA", "FB", "FC", "FD", "FE", "FF", "FG", "FH", "FJ", "FK", "FL", "FM", "FN", "FP", "FQ", "FR", "FS", "FT", "FU", "FV", "FW", "FX", "FY", "FZ", "SA", "SB", "SC", "SD", "SE", "SF", "SG", "SH", "SJ", "SK", "SL", "SM", "SN", "SP", "SQ", "SR", "SS", "ST", "SU", "SV", "SW", "SX", "SY", "SZ") + $Ausgaenge = @() + $ZuAusgang = @("K", "O", "Q,", "M", "A", "P", "DQ", "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CJ", "CK", "CL", "CM", "CN", "CP", "CQ", "CR", "CS", "CT", "CU", "CV", "CW", "CX", "CY", "CZ", "EA", "EB", "EC", "ED", "EE", "EF", "EG", "EH", "EJ", "EK", "EL", "EM", "EN", "EP", "EQ", "ER", "ES", "ET", "EU", "EV", "EW", "EX", "EY", "EZ", "GA", "GB", "GC", "GD", "GE", "GF", "GG", "GH", "GJ", "GK", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GV", "GW", "GX", "GY", "GZ", "HA", "HB", "HC", "HD", "HE", "HF", "HG", "HH", "HJ", "HK", "HL", "HM", "HN", "HP", "HQ", "HR", "HS", "HT", "HU", "HV", "HW", "HX", "HY", "HZ", "KA", "KB", "KC", "KD", "KE", "KF", "KG", "KH", "KJ", "KK", "KL", "KM", "KN", "KP", "KQ", "KR", "KS", "KT", "KU", "KV", "KW", "KX", "KY", "KZ", "MA", "MB", "MC", "MD", "ME", "MF", "MG", "MH", "MJ", "MK", "ML", "MM", "MN", "MP", "MQ", "MR", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "PA", "PB", "PC", "PD", "PE", "PF", "PG", "PH", "PJ", "PK", "PL", "PM", "PN", "PP", "PQ", "PR", "PS", "PT", "PU", "PV", "PW", "PX", "PY", "PZ", "QA", "QB", "QC", "QD", "QE", "QF", "QG", "QH", "QJ", "QK", "QL", "QM", "QN", "QP", "QQ", "QR", "QS", "QT", "QU", "QV", "QW", "QX", "QY", "QZ", "RA", "RB", "RC", "RD", "RE", "RF", "RG", "RH", "RJ", "RK", "RL", "RM", "RN", "RP", "RQ", "RR", "RS", "RT", "RU", "RV", "RW", "RX", "RY", "RZ", "TA", "TB", "TC", "TD", "TE", "TF", "TG", "TH", "TJ", "TK", "TL", "TM", "TN", "TP", "TQ", "TR", "TS", "TT", "TU", "TV", "TW", "TX", "TY", "TZ") + $Fehler = @() + + $Blatt.Cells.Item(1,1) = "Name" + $Blatt.Cells.Item(1,2) = "Path" + $Blatt.Cells.Item(1,3) = "Data Type" + $Blatt.Cells.Item(1,4) = "Logical Address" + $Blatt.Cells.Item(1,5) = "Comment" + $Blatt.Cells.Item(1,6) = "Hmi Visible" + $Blatt.Cells.Item(1,7) = "Hmi Accessible" + $Blatt.Cells.Item(1,8) = "Hmi Writeable" + $Blatt.Cells.Item(1,9) = "Typeobject ID" + $Blatt.Cells.Item(1,10) = "Version ID" + + $Ursprungdatei = Get-Content $PfadUrsprungsdatei + + foreach ($Eintrag in $Ursprungdatei) + { + $Eintragszeile = $Eintrag.Split("'") + $BMKZahl = $Eintragszeile[1] + $BMKZahl = $BMKZahl.TrimStart("'") + $Kommentar = $Eintragszeile[3] + $Kommentar = $Kommentar.TrimEnd("'") + + if ($($($BMKZahl -replace "[\d]") -in $ZuEingang)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $PrefixEingang + $BMKZahl + $Eingaenge += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + elseif ($($($BMKZahl -replace "[\d]") -in $ZuAusgang)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $PrefixAusgang + $BMKZahl + $Ausgaenge += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + else + { + Write-Host "Achtung, Fehler bei " $BMKZahl $Kommentar + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $Fehler += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + + #Write-Host "In Excel schreiben: BMKZahl: " $BMKZahl " Kommentar: " $Kommentar + $Blatt.Cells.Item($i,1) = $Kommentar #Name + $Blatt.Cells.Item($i,2) = "Standard-Variablentabelle" #Path + $Blatt.Cells.Item($i,3) = "Bool" #Data Type + $Blatt.Cells.Item($i,4) = $BMKZahl #Logical Address + #$Blatt.Cells.Item($i,5) = "" #Comment + $Blatt.Cells.Item($i,6) = "'True" #Hmi Visible + $Blatt.Cells.Item($i,7) = "'True" #Hmi Accessible + $Blatt.Cells.Item($i,8) = "'True" #Hmi Writeable + #$Blatt.Cells.Item($i,9) = "" #Typeobject ID + #$Blatt.Cells.Item($i,10) = "" #Version ID + + + $i++ + + DateiBeschreibenAktualisieren + } + + $Mappe.Save() + $Datei.Quit() + + $GleicheEingaenge = GleicheFinden $Eingaenge + $GleicheAusgaenge = GleicheFinden $Ausgaenge + Write-Host "Gleiche fuer " $PrefixEingang ": " $GleicheEingaenge + Write-Host "Gleiche fuer " $PrefixAusgang ": " $GleicheAusgaenge + Write-Host "Fehler bei: " $Fehler + + if ( $($Fehler.Length -eq 0)) + { + $Fehler += @([PSCustomObject]@{ + Name = "Keine" + Zeile = "Alle" + }) + } + + return $GleicheEingaenge, $GleicheAusgaenge, $Fehler +} + +Function GleicheFinden ($ZuUeberpruefen) +{ + $ZuUeberpruefen = $ZuUeberpruefen | Sort-Object "Name" + $Gleiche = @() + for ($i = 0; $i -lt $($ZuUeberpruefen.Count - 1); $i++) + { + $IstGleich = $($ZuUeberpruefen[$i].Name -eq $ZuUeberpruefen[$($i+1)].Name) + if ($IstGleich) + { + # Eintrag hinzufügen + if (-not $($Gleiche[-1].Zeile -eq $ZuUeberpruefen[$i].Zeile)) + { + $Gleiche += $ZuUeberpruefen[$i] + } + $Gleiche += $ZuUeberpruefen[$($i+1)] + #Write-Host "Gleiche: " $Gleiche + } + } + + if ( $($Gleiche.Length -eq 0)) + { + $Gleiche += @([PSCustomObject]@{ + Name = "Keine" + Zeile = "Alle" + }) + } + + return $Gleiche +} + + +Main \ No newline at end of file diff --git a/Test-Skripte/GUI-Angepasst4_Backup1.ps1 b/Test-Skripte/GUI-Angepasst4_Backup1.ps1 new file mode 100644 index 0000000..c7f9480 --- /dev/null +++ b/Test-Skripte/GUI-Angepasst4_Backup1.ps1 @@ -0,0 +1,1270 @@ +Function Main +{ + Write-Host "Programmstart" + + $StartPfad = "R:\m.kraft\Excel Werte ändern" + + GUI $StartPfad + + <#$PfadUrsprungsdatei = GuiTxtWaehlen $StartPfad + Write-Host "Pfad Ursprungsdatei: " $PfadUrsprungsdatei + + + # Testen, ob übergebener Pfad gültig ist? Könnte ungültig sein, wenn in PfadFeld unsinn steht und das Fenster via x geschlossen wird + $PfadUrsprungsdateiMod = Split-Path $PfadUrsprungsdatei + $PfadZielDateien = GuiVerzeichnisWaehlen $PfadUrsprungsdateiMod + + Write-Host "Dateirückgabe in Main(2): " $PfadZielDateien + + GUI für Fortschrittsanzeige + GuiFortschrittsAnzeige $PfadUrsprungsdatei + + #Todo: Nur öffnen, wenn es weder gleiche Eingänge, noch gleiche Ausgänge gibt? + GuiGleicheAnzeigen $GleicheEingaenge $GleicheAusgaenge#> +} + + + +Function GUI ($StartPfad) +{ + [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") + [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") + + # Eigenschaften Fenster + $Fenster = New-Object System.Windows.Forms.Form + $Fenster.Size = New-Object System.Drawing.Size(940,660) #Breite, Höhe + $Fenster.StartPosition = "CenterScreen" + $Fenster.KeyPreview = $true # was macht das? + $Fenster.MaximumSize = $Fenster.Size # legt fest, dass Größe des Fensters nicht verändert werden kann + $Fenster.MinimumSize = $Fenster.Size + $Fenster.Text = "Dateikonvertierer txt zu xlsx" + + $TabBasis = New-Object System.Windows.Forms.TabControl + $TabBasis.Location = New-Object System.Drawing.Size(10,10) + $TabBasis.Size = New-Object System.Drawing.Size(900,600) + $TabBasis.DataBindings.DefaultDataSourceUpdateMode = 0 # Was macht das? + $Fenster.Controls.Add($TabBasis) + + $TabSeiteTXTAuswaehlen = New-Object System.Windows.Forms.TabPage + $TabSeiteTXTAuswaehlen.TabIndex = 0 + $TabSeiteTXTAuswaehlen.UseVisualStyleBackColor = $true + $TabSeiteTXTAuswaehlen.Text = "txt-Datei Auswaehlen" + #Paddings + $TabSeiteTXTAuswaehlen.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteTXTAuswaehlen) + + # TXTPfadFeld + $TXTPfadFeld = New-Object System.Windows.Forms.TextBox + $TXTPfadFeld.Location = New-Object System.Drawing.Size(10,10) + $TXTPfadFeld.Size = New-Object System.Drawing.Size(860,20) + $TXTPfadFeld.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TXTTastenReaktionPfadFeld $Taste + }) + $TabSeiteTXTAuswaehlen.Controls.Add($TXTPfadFeld) + + # TXTListeOrdnernamen + $TXTListeOrdnernamen = New-Object System.Windows.Forms.ListBox + $TXTListeOrdnernamen.Location = New-Object System.Drawing.Size(10,40) + $TXTListeOrdnernamen.Size = New-Object System.Drawing.Size(860,20) + $TXTListeOrdnernamen.Height = 450 + $TXTListeOrdnernamen.Font = New-Object System.Drawing.Font("Arial",12,[System.Drawing.FontStyle]::Regular) + $TXTListeOrdnernamen.Add_DoubleClick({ + # Variablen bestimmen zur Übergabe + $Auswahl = $TXTListeOrdnernamen.SelectedItem + $Pfad = $TXTPfadFeld.Text + # Write-Host "Gewählter Ordner/ Datei: " $Auswahl + # Write-Host "Vorheriger Pfad: " $TXTPfad + + # Pfad aktualisieren + TXTVerzeichnisAuswaehlen $Pfad $Auswahl + }) + $TXTListeOrdnernamen.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TXTTastenReaktionListeOrdnernamen $Taste + }) + $TabSeiteTXTAuswaehlen.Controls.Add($TXTListeOrdnernamen) + + # ZurückButton + $TXTZurueckButton = New-Object System.Windows.Forms.Button + $TXTZurueckButton.Location = New-Object System.Drawing.Size(10,500) + $TXTZurueckButton.Size = New-Object System.Drawing.Size(100,30) + $TXTZurueckButton.Text = "Zurueck" + $TXTZurueckButton.Add_Click({ + # Write-Host "Pfad ausgabe: " $TXTPfadFeld.Text + $Pfad = $TXTPfadFeld.Text + + #Pfad aktualisieren + TXTVerzeichnisZurueck $Pfad + }) + $TXTZurueckButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TXTTastenReaktionButtons $Taste + }) + $TabSeiteTXTAuswaehlen.Controls.Add($TXTZurueckButton) + + # AuswaehlenButton + $TXTAuswaehlenButton = New-Object System.Windows.Forms.Button + $TXTAuswaehlenButton.Location = New-Object System.Drawing.Size(750,500) + $TXTAuswaehlenButton.Size = New-Object System.Drawing.Size(100,30) + $TXTAuswaehlenButton.Text = "Auswaehlen" + $TXTAuswaehlenButton.Add_Click({ + # Variablen bestimmen zur Übergabe + $Auswahl = $TXTListeOrdnernamen.SelectedItem + # Falls nicht aktiv ein Eintrag gewählt wurde, in den obersten navigieren + <#if ($($Auswahl.length -eq 0)) + { + $Auswahl = $TXTListeOrdnernamen.Items[0] + }#> + $Pfad= $TXTPfadFeld.Text + # Write-Host "Gewählter Ordner/ Datei: " $Auswahl + # Write-Host "Vorheriger Pfad: " $TXTPfad + + # Pfad aktualisieren + TXTVerzeichnisAuswaehlen $Pfad $Auswahl + }) + $TXTAuswaehlenButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TXTTastenReaktionButtons $Taste + }) + $TabSeiteTXTAuswaehlen.Controls.Add($TXTAuswaehlenButton) + + # Dieser Funktionsaufruf zerstört die Rückgabe, wenn er keiner Variable zugewiesen wird + $A = TXTAnzeigeAktualisieren $StartPfad + + $TXTDatei = $TXTPfadFeld.Text + # return $Rueckgabe + #$TabBasis.SelectedIndex = 1 + + + $TabSeiteZielVerzeichnisAuswaehlen = New-Object System.Windows.Forms.TabPage + $TabSeiteZielVerzeichnisAuswaehlen.TabIndex = 1 + $TabSeiteZielVerzeichnisAuswaehlen.UseVisualStyleBackColor = $true + $TabSeiteZielVerzeichnisAuswaehlen.Text = "Zielverzeichnis Auswaehlen" + #Paddings + $TabSeiteZielVerzeichnisAuswaehlen.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteZielVerzeichnisAuswaehlen) + + # PfadFeld + $VERPfadFeld = New-Object System.Windows.Forms.TextBox + $VERPfadFeld.Location = New-Object System.Drawing.Size(10,10) + $VERPfadFeld.Size = New-Object System.Drawing.Size(860,20) + $VERPfadFeld.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + VERTastenReaktionPfadFeld $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERPfadFeld) + + # ListeOrdnernamen + $VERListeOrdnernamen = New-Object System.Windows.Forms.ListBox + $VERListeOrdnernamen.Location = New-Object System.Drawing.Size(10,40) + $VERListeOrdnernamen.Size = New-Object System.Drawing.Size(860,20) + $VERListeOrdnernamen.Height = 450 + $VERListeOrdnernamen.Font = New-Object System.Drawing.Font("Arial",12,[System.Drawing.FontStyle]::Regular) + $VERListeOrdnernamen.Add_DoubleClick({ + # Variablen bestimmen zur Übergabe + $Auswahl = $VERListeOrdnernamen.SelectedItem + $Pfad = $VERPfadFeld.Text + # Write-Host "Gewählter Ordner/ Datei: " $Auswahl + # Write-Host "Vorheriger Pfad: " $VERPfad + + # Pfad aktualisieren + VERVerzeichnisAuswaehlen $Pfad $Auswahl + }) + $VERListeOrdnernamen.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + VERTastenReaktionListeOrdnernamen $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERListeOrdnernamen) + + # ZurückButton + $VERZurueckButton = New-Object System.Windows.Forms.Button + $VERZurueckButton.Location = New-Object System.Drawing.Size(10,500) + $VERZurueckButton.Size = New-Object System.Drawing.Size(100,30) + $VERZurueckButton.Text = "Zurueck" + $VERZurueckButton.Add_Click({ + # Write-Host "Pfad ausgabe: " $VERPfadFeld.Text + $Pfad = $VERPfadFeld.Text + + #Pfad aktualisieren + VERVerzeichnisZurueck $Pfad + }) + $VERZurueckButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + VERTastenReaktionButtons $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERZurueckButton) + + # AuswaehlenButton + $VERAuswaehlenButton = New-Object System.Windows.Forms.Button + $VERAuswaehlenButton.Location = New-Object System.Drawing.Size(630,500) + $VERAuswaehlenButton.Size = New-Object System.Drawing.Size(100,30) + $VERAuswaehlenButton.Text = "Auswaehlen" + $VERAuswaehlenButton.Add_Click({ + # Variablen bestimmen zur Übergabe + $Auswahl = $VERListeOrdnernamen.SelectedItem + # Falls nicht aktiv ein Eintrag gewählt wurde, in den obersten navigieren + <#if ($($Auswahl.length -eq 0)) + { + $Auswahl = $VERListeOrdnernamen.Items[0] + }#> + $Pfad = $VERPfadFeld.Text + # Write-Host "Gewählter Ordner/ Datei: " $Auswahl + # Write-Host "Vorheriger Pfad: " $VERPfad + + if ($($VERListeOrdnernamen.Items[0] -eq "")) + { + VERAuswahlBestaetigt $Pfad $Auswahl + } + else + { + # Pfad aktualisieren + VERVerzeichnisAuswaehlen $Pfad $Auswahl + } + }) + $VERAuswaehlenButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + VERTastenReaktionButtons $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERAuswaehlenButton) + + # BestaetigenButton + $VERBestaetigenButton = New-Object System.Windows.Forms.Button + $VERBestaetigenButton.Location = New-Object System.Drawing.Size(750,500) + $VERBestaetigenButton.Size = New-Object System.Drawing.Size(100,30) + $VERBestaetigenButton.Text = "Bestaetigen" + $VERBestaetigenButton.Add_Click({ + $Auswahl = $VERListeOrdnernamen.SelectedItem + # Falls nicht aktiv ein Eintrag gewählt wurde, in den obersten navigieren + <#if ($($Auswahl.length -eq 0)) + { + $Auswahl = $VERListeOrdnernamen.Items[0] + }#> + $Pfad = $VERPfadFeld.Text + + VERAuswahlBestaetigt $Pfad $Auswahl + }) + $VERBestaetigenButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + VERTastenReaktionButtons $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERBestaetigenButton) + + # Dieser Funktionsaufruf zerstört die Rückgabe, wenn er keiner Variable zugewiesen wird + $A = VERAnzeigeAktualisieren $TXTPfadFeld.Text + + $ZielVerzeichnis = $VERPfadFeld.Text + #return $Rueckgabe2 + #$TabBasis.SelectedIndex = 2 + + + $TabSeiteFortschrittsanzeige = New-Object System.Windows.Forms.TabPage + $TabSeiteFortschrittsanzeige.TabIndex = 2 + $TabSeiteFortschrittsanzeige.UseVisualStyleBackColor = $true + $TabSeiteFortschrittsanzeige.Text = "Bearbeitungsfortschritt" + #Paddings + $TabSeiteFortschrittsanzeige.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteFortschrittsanzeige) + + $FATextfeld1 = New-Object System.Windows.Forms.Label + $FATextfeld1.Location = New-Object System.Drawing.Size(10,10) + $FATextfeld1.Size = New-Object System.Drawing.Size(200,20) + $FATextfeld1.Text = "Aktuelle Aufgabe" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld1) + + $FATextfeld2 = New-Object System.Windows.Forms.Label + $FATextfeld2.Location = New-Object System.Drawing.Size(300,10) + $FATextfeld2.Size = New-Object System.Drawing.Size(430,20) + $FATextfeld2.Text = "Erledigte Aufgaben" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld2) + + $FATextfeldAktuelleAufgabe = New-Object System.Windows.Forms.Label + $FATextfeldAktuelleAufgabe.Location = New-Object System.Drawing.Size(10,40) + $FATextfeldAktuelleAufgabe.Size = New-Object System.Drawing.Size(280,60) + $FATextfeldAktuelleAufgabe.Text = "txt-Datei auswaehlen" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeldAktuelleAufgabe) + + $FAListeErledigteAufgaben = New-Object System.Windows.Forms.ListBox + $FAListeErledigteAufgaben.Location = New-Object System.Drawing.Size(300,40) + $FAListeErledigteAufgaben.Size = New-Object System.Drawing.Size(430,20) + $FAListeErledigteAufgaben.Height = 150 + $FAListeErledigteAufgaben.Font = New-Object System.Drawing.Font("Arial",12,[System.Drawing.FontStyle]::Regular) + $TabSeiteFortschrittsanzeige.Controls.Add($FAListeErledigteAufgaben) + + $FATextfeld3 = New-Object System.Windows.Forms.Label + $FATextfeld3.Location = New-Object System.Drawing.Size(10,100) + $FATextfeld3.Size = New-Object System.Drawing.Size(430,20) + $FATextfeld3.Text = "Fortschritt Excel-Dateien beschreiben" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld3) + + $FAFortschrittsbar = New-Object System.Windows.Forms.ProgressBar + $FAFortschrittsbar.Location = New-Object System.Drawing.Size(10,120) + $FAFortschrittsbar.Size = New-Object System.Drawing.Size(260,30) + #$FAFortschrittsbar.Name = "Fortschrittsanzeige" + $FAFortschrittsbar.Value = 0 + $TabSeiteFortschrittsanzeige.Controls.Add($FAFortschrittsbar) + + $FATextfeldRealwertFortschrittsbar = New-Object System.Windows.Forms.Label # Stimmt nicht, wird verwendet, aber VSC erkennt das nicht + + $FATextfeld4 = New-Object System.Windows.Forms.Label + $FATextfeld4.Location = New-Object System.Drawing.Size(10,170) + $FATextfeld4.Size = New-Object System.Drawing.Size(140,20) + $FATextfeld4.Text = "Bearbeitete Eintraege:" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld4) + + $FATextfeld5 = New-Object System.Windows.Forms.Label + $FATextfeld5.Location = New-Object System.Drawing.Size(10,200) + $FATextfeld5.Size = New-Object System.Drawing.Size(100,20) + $FATextfeld5.Text = "Gesamteintraege:" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld5) + + $FATextfeldBearbeiteteEintraege = New-Object System.Windows.Forms.Label + $FATextfeldBearbeiteteEintraege.Location = New-Object System.Drawing.Size(170,170) + $FATextfeldBearbeiteteEintraege.Size = New-Object System.Drawing.Size(430,20) + $FATextfeldBearbeiteteEintraege.Text = "0" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeldBearbeiteteEintraege) + + $FATextfeldGesamtEintraege = New-Object System.Windows.Forms.Label + $FATextfeldGesamtEintraege.Location = New-Object System.Drawing.Size(170,200) + $FATextfeldGesamtEintraege.Size = New-Object System.Drawing.Size(430,20) + <#if (PfadExistiert $TXTPfadFeld.Text) + { + $Ursprungdatei = Get-Content $TXTPfadFeld.Text + }#> + $FATextfeldGesamtEintraege.Text = $($Ursprungdatei.Length) + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeldGesamtEintraege) + + # Todo: Von hier aus Funktionsaufruf zum erstellen der xlsx-Dateien, konvertieren, ... + # $GleicheEingaenge und $GleicheAusgaenge muss am Ende festgelegt sein + if ($FAFortschrittsbar.Value -eq 100) + { + ZuDPSpringen + } + + + $TabSeiteDuplikate = New-Object System.Windows.Forms.TabPage + $TabSeiteDuplikate.TabIndex = 3 + $TabSeiteDuplikate.UseVisualStyleBackColor = $true + $TabSeiteDuplikate.Text = "Doppelte Ein- und Ausgaenge" + #Paddings + $TabSeiteDuplikate.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteDuplikate) + + $DPTextfeld1 = New-Object System.Windows.Forms.Label + $DPTextfeld1.Location = New-Object System.Drawing.Size(10,10) + $DPTextfeld1.Size = New-Object System.Drawing.Size(275,40) + $DPTextfeld1.Text = "Bei den Eingaengen gibt es folgende Duplikate: " + $TabSeiteDuplikate.Controls.Add($DPTextfeld1) + + $DPListeEingaenge = New-Object System.Windows.Forms.DataGridView + $DPListeEingaenge.Location = New-Object System.Drawing.Size(10,60) + $DPListeEingaenge.Size = New-Object System.Drawing.Size(275,20) + $DPListeEingaenge.Height = 430 + $DPListeEingaenge.ColumnCount = 2 + $DPListeEingaenge.ColumnHeadersVisible = $true + $DPListeEingaenge.Columns[0].Name = "Zeile" + $DPListeEingaenge.Columns[1].Name = "Kennzeichnung" + $TabSeiteDuplikate.Controls.Add($DPListeEingaenge) + + $DPTextfeld2 = New-Object System.Windows.Forms.Label + $DPTextfeld2.Location = New-Object System.Drawing.Size(295,10) + $DPTextfeld2.Size = New-Object System.Drawing.Size(275,40) + $DPTextfeld2.Text = "Bei den Ausgaengen gibt es folgende Duplikate: " + $TabSeiteDuplikate.Controls.Add($DPTextfeld2) + + $DPListeAusgaenge = New-Object System.Windows.Forms.DataGridView + $DPListeAusgaenge.Location = New-Object System.Drawing.Size(295,60) + $DPListeAusgaenge.Size = New-Object System.Drawing.Size(275,20) + $DPListeAusgaenge.Height = 430 + $DPListeAusgaenge.ColumnCount = 2 + $DPListeAusgaenge.ColumnHeadersVisible = $true + $DPListeAusgaenge.Columns[0].Name = "Zeile" + $DPListeAusgaenge.Columns[1].Name = "Kennzeichnung" + $TabSeiteDuplikate.Controls.Add($DPListeAusgaenge) + + $DPTextfeld3 = New-Object System.Windows.Forms.Label + $DPTextfeld3.Location = New-Object System.Drawing.Size(580,10) + $DPTextfeld3.Size = New-Object System.Drawing.Size(275,40) + $DPTextfeld3.Text = "Folgende Eintraege konnten keinem Betriebsmittel zugewiesen werden:" + $TabSeiteDuplikate.Controls.Add($DPTextfeld3) + + $DPListeFehler = New-Object System.Windows.Forms.DataGridView + $DPListeFehler.Location = New-Object System.Drawing.Size(580,60) + $DPListeFehler.Size = New-Object System.Drawing.Size(275,20) + $DPListeFehler.Height = 430 + $DPListeFehler.ColumnCount = 2 + $DPListeFehler.ColumnHeadersVisible = $true + $DPListeFehler.Columns[0].Name = "Zeile" + $DPListeFehler.Columns[1].Name = "Kennzeichnung" + $TabSeiteDuplikate.Controls.Add($DPListeFehler) + + $DPBestaetigenButton = New-Object System.Windows.Forms.Button + $DPBestaetigenButton.Location = New-Object System.Drawing.Size(10,500) + $DPBestaetigenButton.Size = New-Object System.Drawing.Size(860,30) + $DPBestaetigenButton.Text = "Programm beenden" + $DPBestaetigenButton.Add_Click({ + $Fenster.Dispose() + return + }) + $TabSeiteDuplikate.Controls.Add($DPBestaetigenButton) + + + $Fenster.Add_Shown({$Fenster.Activate()}) + [void]$Fenster.ShowDialog() + + return +} + +#------------------- Funktionen nur für das txt-GUI -------------------------- + +# Bekommt Pfad, stellt fest ob Laufwerke oder Ordner angezeigt werden müssen und aktualisiert entsprechend alles +# Für Laufwerke muss $Pfad = "" sein +Function TXTAnzeigeAktualisieren ($Pfad) +{ +# Write-Host "Übergebener Pfad: " $Pfad + +# Sicherstellen, dass es das Verzeichnis gibt +if ($($Pfad -eq "") -or $(PfadExistiert $Pfad)) +{ + # Feststellen, ob Ordner oder Laufwerke angezeigt werden müssen + if ($Pfad.Length -ne "") + { + # Es handelt sich um Ordner + $Optionen = TXTOptionen $Pfad + #$Fenster.Text = $(Split-Path $Pfad -Leaf) + } + elseif ($Pfad.Length -eq "") + { + # Es handelt sich um Laufwerke + $Optionen = LaufwerkeFinden + $Pfad = "" + #$Fenster.Text = "Laufwerke" + } + else + { + Write-Host "Fehler bei Anzeige aktualisieren" + # Fehler(?) + } + $TXTPfadFeld.Text = $Pfad + $TXTListeOrdnernamen.Items.Clear() + foreach ($Option in $Optionen) + { + if ($Option.Length -gt 0) + { + $TXTListeOrdnernamen.Items.Add($Option) + } + } +} +else +{ + TXTAnzeigeAktualisieren "" +} +return +} + +Function TXTVerzeichnisAuswaehlen ($Pfad, $Auswahl) +{ +if ($Pfad.length -gt 0) +{ + $Pfad = Join-Path -Path $Pfad -ChildPath $Auswahl -Resolve +} +else +{ + #Wenn der Pfad die Länge 0 hat, wurde ein Laufwerk gewählt + $Pfad = $Auswahl +} + +#Falls nicht aktiv ein Eintrag ausgewählt wurde, den obersten wählen +<#if ($Auswahl.length -eq 0) +{ + $Auswahl = $TXTListeOrdnernamen.Items[0] +}#> + +# Erkennen, ob *.txt-Datei gewählt wurde -> ggf. Auswahl abgeschlossen +if ($($Auswahl -match ".txt")) +{ + # Für den Gesamtfortschritt Anzahl Dateien auslesen + $Datei = Get-Content $Pfad + $FATextfeldGesamtEintraege.Text = 2 * $($Datei.Length) + + # Write-Host ".txt-Datei ausgewählt, Pfad: " $Pfad + # Write-Host "Dateityp: " $Pfad.GetType() + ZuVERSpringen + # Ist zwar sachlich gesehen unsinn, aber sonst funktioniert Return in der GUI nicht + $TXTPfadFeld.Text = $Pfad + return +} + +TXTAnzeigeAktualisieren $Pfad + +return +} + +Function TXTVerzeichnisZurueck ($Pfad) +{ +if ($Pfad.Length -gt 3) +{ + # Weiter mit Ordnern + # Write-Host "Ordner anzeigen" + $Pfad = Split-Path $Pfad +} +elseif ($Pfad.Length -le 3) +{ + # Weiter mit Laufwerken + # Write-Host "Laufwerke anzeigen" + $Pfad = "" +} +else +{ + Write-Host "Fehler bei Verzeichnis zurueck" + # Fehler/ Nichts tun? + # Ermitteln: wann tritt dieser Fall ein? +} +TXTAnzeigeAktualisieren $Pfad +return +} + +Function TXTTastenReaktionPfadFeld($Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +switch ($Taste){ + "Return" { + # Write-Host "Enter gedrückt" + $Pfad = $TXTPfadFeld.Text + # Write-Host "Pfad: " $Pfad + + TXTReaktionReturn $Pfad + } + default { + # Write-Host "Gedrückte Taste: " $Taste + } +} +return +} + +Function TXTTastenReaktionListeOrdnernamen($Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +switch ($Taste){ + "Return" { + # Write-Host "Enter gedrückt" + $Auswahl = $TXTListeOrdnernamen.SelectedItem + <#if ($($Auswahl.Length -eq 0)) + { + $Auswahl = $TXTListeOrdnernamen.Items[0] + }#> + $Pfad = $TXTPfadFeld.Text + # Write-Host "Auswahl: " $Auswahl + # Write-Host "Pfad: " $Pfad + + TXTVerzeichnisAuswaehlen $Pfad $Auswahl + } + "Back" { + # Write-Host "Back gedrückt" + $Pfad = $TXTPfadFeld.Text + # Write-Host "Pfad: " $Pfad + + # Pfad aktualisieren + TXTVerzeichnisZurueck $Pfad + } + default { + # Write-Host "Gedrückte Taste: " $Taste + } +} +return +} + +Function TXTTastenReaktionButtons($Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +switch ($Taste){ + "Back" { + # Write-Host "Back gedrückt" + $Pfad = $TXTPfadFeld.Text + # Write-Host "Pfad: " $Pfad + + # Pfad aktualisieren + TXTVerzeichnisZurueck $Pfad + } + default { + # Write-Host "Gedrückte Taste: " $Taste + } +} +return +} + +Function TXTOptionen($Pfad) +{ +# Unterordner und .txt-Dateien finden +# Typzuweisung nötig, da aus unbekanntem Grund sonst Unterordner eines Ordners, der mit "_" beginnt, nicht gefunden werden können +[System.Object[]]$UnterOrdner = UnterOrdnerFinden $Pfad +$TxtDateien = TxtDateienFinden $Pfad + +#Gibt aktuell auch Index und Typ (System.IO.DirectoryInfo bzw. System.String) zurück +$Optionen = $UnterOrdner + $TxtDateien + +return $Optionen +} + +Function TXTReaktionReturn ($Pfad) +{ + if (PfadExistiert $Pfad) + { + # Gültiger Pfad oder .txt-Datei + $PfadEnde = $(Split-Path $Pfad -Leaf) + if ($($PfadEnde -match ".txt")) + { + #$Fenster.Dispose() + ZuVERSpringen + # Ist zwar sachlich gesehen unsinn, aber sonst funktioniert Return in der GUI nicht richtig + $TXTPfadFeld.Text = $Pfad + return + } + else + { + TXTAnzeigeAktualisieren $Pfad + } + } + else + { + # Laufwerke aktualisieren oder ungültiger Pfad + TXTAnzeigeAktualisieren "" + } + return +} + + +#------------------- Funktionen nur für das VerzeichnisWaehlen-GUI -------------------------- + +# Bekommt Pfad, stellt fest ob Laufwerke oder Ordner angezeigt werden müssen und aktualisiert entsprechend alles +# Für Laufwerke muss $Pfad = "" sein +Function VERAnzeigeAktualisieren ($Pfad) +{ +# Write-Host "Übergebener Pfad: " $Pfad + +# Sicherstellen, dass es das Verzeichnis gibt +if ($($Pfad -eq "") -or $(PfadExistiert $Pfad)) +{ + # Feststellen, ob Ordner oder Laufwerke angezeigt werden müssen + if ($Pfad.Length -ne "") + { + # Es handelt sich um Ordner + $Optionen = VEROptionen $Pfad + #$Fenster.Text = $(Split-Path $Pfad -Leaf) + } + elseif ($Pfad.Length -eq "") + { + # Es handelt sich um Laufwerke + $Optionen = LaufwerkeFinden + $Pfad = "" + #$Fenster.Text = "Laufwerke" + } + else + { + Write-Host "Fehler bei Anzeige aktualisieren" + # Fehler(?) + } + $VERPfadFeld.Text = $Pfad + $VERListeOrdnernamen.Items.Clear() + foreach ($Option in $Optionen) + { + if ($Option.Length -gt 0) + { + $VERListeOrdnernamen.Items.Add($Option) + } + } +} +else +{ + VERAnzeigeAktualisieren "" +} +return +} + + +Function VERVerzeichnisAuswaehlen ($Pfad, $Auswahl) +{ +#Falls nicht aktiv ein Eintrag ausgewählt wurde, den obersten wählen +<#if ($Auswahl.length -eq 0) +{ + $Auswahl = $VERListeOrdnernamen.Items[0] +}#> + +if ($Pfad.length -gt 0) +{ + $Pfad = Join-Path -Path $Pfad -ChildPath $Auswahl -Resolve +} +else +{ + $Pfad = $Auswahl +} + +VERAnzeigeAktualisieren $Pfad +return +} + +Function VERVerzeichnisZurueck ($Pfad) +{ +if ($Pfad.Length -gt 3) +{ + # Weiter mit Ordnern + # Write-Host "Ordner anzeigen" + $Pfad = Split-Path $Pfad +} +elseif ($Pfad.Length -le 3) +{ + # Weiter mit Laufwerken + # Write-Host "Laufwerke anzeigen" + $Pfad = "" +} +else +{ + Write-Host "Fehler bei Verzeichnis zurueck" + # Fehler/ Nichts tun? + # Ermitteln: wann tritt dieser Fall ein? +} +VERAnzeigeAktualisieren $Pfad +return +} + +Function VERTastenReaktionPfadFeld($Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +switch ($Taste){ + "Return" { + # Write-Host "Enter gedrückt" + $Pfad = $VERPfadFeld.Text + # Write-Host "Pfad: " $Pfad + # Es muss nicht überprüft werden, ob es das Verzeichnis gibt, da dies auch in VERAnzeigeAktualisieren gemacht wird + VERAnzeigeAktualisieren $Pfad + } + "ShiftKey" { + $Pfad = $VERPfadFeld.Text + $Auswahl = $VERListeOrdnernamen.SelectedItem + # Falls nicht aktiv ein Eintrag gewählt wurde, in den obersten navigieren + <#if ($($Auswahl.length -eq 0)) + { + $Auswahl = $VERListeOrdnernamen.Items[0] + }#> + + ReaktionShiftKey $Pfad $Auswahl + } + default { + # Write-Host "Gedrückte Taste: " $Taste + } +} +return +} + +Function VERTastenReaktionListeOrdnernamen($Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +switch ($Taste){ + "Return" { + # Write-Host "Enter gedrückt" + $Auswahl = $VERListeOrdnernamen.SelectedItem + <#if ($($Auswahl.Length -eq 0)) + { + $Auswahl = $VERListeOrdnernamen.Items[0] + }#> + $Pfad = $VERPfadFeld.Text + # Write-Host "Auswahl: " $Auswahl + # Write-Host "Pfad: " $Pfad + + VERVerzeichnisAuswaehlen $Pfad $Auswahl + } + "Back" { + # Write-Host "Back gedrückt" + $Pfad = $VERPfadFeld.Text + # Write-Host "Pfad: " $Pfad + + # Pfad aktualisieren + VERVerzeichnisZurueck $Pfad + } + "ShiftKey" { + $Pfad = $VERPfadFeld.Text + $Auswahl = $VERListeOrdnernamen.SelectedItem + # Falls nicht aktiv ein Eintrag gewählt wurde, in den obersten navigieren + <#if ($($Auswahl.length -eq 0)) + { + $Auswahl = $VERListeOrdnernamen.Items[0] + }#> + + ReaktionShiftKey $Pfad $Auswahl + } + default { + # Write-Host "Gedrückte Taste: " $Taste + } +} +return +} + +Function VERTastenReaktionButtons($Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +switch ($Taste){ + "Back" { + # Write-Host "Back gedrückt" + $Pfad = $VERPfadFeld.Text + # Write-Host "Pfad: " $Pfad + + # Pfad aktualisieren + VERVerzeichnisZurueck $Pfad + } + "ShiftKey" { + $Pfad = $VERPfadFeld.Text + $Auswahl = $VERListeOrdnernamen.SelectedItem + # Falls nicht aktiv ein Eintrag gewählt wurde, in den obersten navigieren + <#if ($($Auswahl.length -eq 0)) + { + $Auswahl = $VERListeOrdnernamen.Items[0] + }#> + + ReaktionShiftKey $Pfad $Auswahl + } + default { + # Write-Host "Gedrückte Taste: " $Taste + } +} +return +} + +Function VEROptionen($Pfad) +{ +# Unterordner und .txt-Dateien finden +# Typzuweisung nötig, da aus unbekanntem Grund sonst Unterordner eines Ordners, der mit "_" beginnt, nicht gefunden werden können +[System.Object[]]$UnterOrdner = UnterOrdnerFinden $Pfad +# $TxtDateien = TxtDateienFinden $Pfad + +#Gibt aktuell auch Index und Typ (System.IO.DirectoryInfo bzw. System.String) zurück +$Optionen = $UnterOrdner +return $Optionen +} + +Function VERAuswahlBestaetigt($Pfad, $Auswahl) +{ +$Pfad = Join-Path -Path $Pfad -ChildPath $Auswahl -Resolve + +if (PfadExistiert $Pfad) +{ + #Write-Host "Pfad zur Rückgabe: " $Pfad + #$Fenster.Dispose() + ZuFASpringen + $VERPfadfeld.Text = $Pfad + return +} +} + +#------------------- Funktionen für alle GUIs -------------------------- + +Function PfadExistiert ($Pfad) +{ +if ($(Test-Path $Pfad -PathType Container) -or $(Test-Path $Pfad -Include "*.txt")) +{ + # Write-Host "Bei dem Verzeichnis handelt es sich um eine *.txt-Datei oder ein gültiges Verzeichnis" + return $true +} +else +{ + # Write-Host "Das Verzeichnis existiert nicht oder es wurde keine *.txt-Datei gewählt" + return $false +} +} + +Function LaufwerkeFinden() +{ +$Laufwerke = $(Get-PSDrive | Where-Object {$_.Free}).Name +$i = 0 + +foreach($Laufwerk in $Laufwerke) +{ + $Laufwerke[$i] = $Laufwerk + ":\" + $i++ +} +return $Laufwerke +} + +Function UnterOrdnerFinden($Pfad) +{ +# Write-Host "Ordner zum suchen von Unterordnern: " $Pfad +$UnterOrdner = $(Get-ChildItem $Pfad -Directory) +# Write-Host "Gefundene Unterordner: " $UnterOrdner +if ($($UnterOrdner.Length -gt 0)) +{ + $Ordner = $(Split-Path $UnterOrdner -Leaf) +} +else { + $Ordner = "" +} + +# Write-Host "Gefundene Ordner: " $Ordner +return $Ordner +} + +Function TxtDateienFinden($Pfad) +{ +$TxtDateien = $(Get-Childitem $Pfad\*.txt) + +if ($TxtDateien.Length -gt 0) +{ + return $(Split-Path $TxtDateien -Leaf) +} +else +{ + return +} +} + +Function ReaktionShiftKey ($Pfad, $Auswahl) +{ + if (PfadExistiert $Pfad) + { + VERAuswahlBestaetigt $Pfad $Auswahl + } + else + { + VERAnzeigeAktualisieren "" + } + + return +} + +Function ZuVERSpringen +{ + VERAnzeigeAktualisieren $TXTPfadFeld.Text + AufgabenAktualisieren "Zielverzeichnis auswaehlen" + Write-Host "Gewaehlte txt-Datei: " $TXTPfadFeld.Text + $TabBasis.SelectedIndex = 1 +} + +Function ZuFASpringen +{ + AufgabenAktualisieren "Zieldateinamen erstellen" + Write-Host "Gewaehltes Verzeichnis: " $VERPfadFeld.Text + $TabBasis.SelectedIndex = 2 + + #Hier Logische Berechnungen einfügen + $PfadUrsprungsdatei = $TXTPfadFeld.Text + $PfadZielDateien = $VERPfadFeld.Text + $PfadDateiEA = ExcelDateiNameErstellen "EA" $PfadUrsprungsdatei $PfadZielDateien + $PfadDateiDIDQ = ExcelDateiNameErstellen "DIDQ" $PfadUrsprungsdatei $PfadZielDateien + + AufgabenAktualisieren "Neue Excel-Dateien erstellen" + + ExcelDateiErstellen $PfadDateiEA + ExcelDateiErstellen $PfadDateiDIDQ + + AufgabenAktualisieren "Excel-Dateien mit Inhalten befuellen und Duplikate finden" + + $AlleGleichenEA = ExcelDateiBeschreibenStandard $PfadUrsprungsdatei "E" "A" $PfadDateiEA + $AlleGleichenDIDQ = ExcelDateiBeschreibenSpezial $PfadUrsprungsdatei "%I" "%Q" $PfadDateiDIDQ + #Write-Host "Gleiche EA nach Rückgabe: " $AlleGleichenEA + $GleicheEingaenge = $AlleGleichenEA[0] + $GleicheAusgaenge = $AlleGleichenEA[1] + $Fehler = $AlleGleichenEA[2] + + Write-Host "Gleiche Eingaenge: " $GleicheEingaenge + Write-Host "Gleiche Ausgaenge: " $GleicheAusgaenge + Write-Host "Fehler: " $Fehler + + AufgabenAktualisieren "Ausgabe Duplikate" + + ZuDPSpringen $GleicheEingaenge $GleicheAusgaenge $Fehler +} + +Function ZuDPSpringen ($GleicheEingaenge, $GleicheAusgaenge, $Fehler) +{ + foreach ($GleichenEingang in $GleicheEingaenge) { + $DPListeEingaenge.Rows.Add($($GleichenEingang.Zeile),($GleichenEingang.Name)) + } + + foreach ($GleichenAusgang in $GleicheAusgaenge) { + $DPListeAusgaenge.Rows.Add($($GleichenAusgang.Zeile),($GleichenAusgang.Name)) + } + + foreach ($Fehlen in $Fehler) { + $DPListeFehler.Rows.Add($($Fehlen.Zeile),($Fehlen.Name)) + } + + $TabBasis.SelectedIndex = 3 +} + +Function AufgabenAktualisieren ($Aufgabe) +{ + $FAListeErledigteAufgaben.Items.Add($FATextfeldAktuelleAufgabe.Text) + $FATextfeldAktuelleAufgabe.Text = $Aufgabe +} + +Function DateiBeschreibenAktualisieren +{ + $AnteilJeBeschriftung = 100 / $($FATextfeldGesamtEintraege.Text) + [System.double] $FATextfeldRealwertFortschrittsbar.Text += $AnteilJeBeschriftung + + #Known issue: Die Fortschrittsbar springt immer wieder kurzteitig auf 100% + #Da $FAFortschrittsbar.Value anscheinend ein int ist, ist der letzte Wert i. d. R. höher als 100 -> Fehler, der hiermit umgangen wird + if ( $($FATextfeldRealwertFortschrittsbar.Text -lt 100) ) + { + $FAFortschrittsbar.Value = 100 + } + else + { + $FAFortschrittsbar.Value = $FATextfeldRealwertFortschrittsbar.Text + } + + [System.Int64] $BearbeiteteEintraege = $FATextfeldBearbeiteteEintraege.Text + $BearbeiteteEintraege++ + $FATextfeldBearbeiteteEintraege.Text = $BearbeiteteEintraege +} +#--------------------------------------- Ende Funktionen für GUI ------------------------------- + +Function ExcelDateiNameErstellen ($Prefix, $PfadUrsprungsdatei, $PfadZielDatei) +{ + $BasisNameZielDatei = Split-Path $PfadUrsprungsdatei -Leaf + $BasisNameZielDateiLaenge = $BasisNameZielDatei.Length + $BasisNameZielDateiKurz = $BasisNameZielDatei.Substring(0, $($BasisNameZielDateiLaenge - 4)) + $GesamtPfadZielDatei = $PfadZielDatei + "\" + $Prefix + "_" + $BasisNameZielDateiKurz + ".xlsx" + + return $GesamtPfadZielDatei +} + +Function ExcelDateiErstellen ($DateiPfad) +{ + $Datei = New-Object -ComObject Excel.Application + $Mappe = $Datei.Workbooks.Add() + $Mappe.SaveAs($DateiPfad) + $Datei.Quit() + + return +} + +Function ExcelDateiBeschreibenStandard ($PfadUrsprungsdatei, $Umwandler1, $Umwandler2, $ZielDatei) +{ + $Datei = New-Object -ComObject Excel.Application + $Mappe = $Datei.Workbooks.Open($ZielDatei) + $Blatt = $Mappe.WorkSheets.item(1) + $Datei.Visible = $false + + $i = 1 + $Wandler1 = @() + $ZuWandler1 = @("DI", "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BJ", "BK", "BL", "BM", "BN", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", "FA", "FB", "FC", "FD", "FE", "FF", "FG", "FH", "FJ", "FK", "FL", "FM", "FN", "FP", "FQ", "FR", "FS", "FT", "FU", "FV", "FW", "FX", "FY", "FZ", "SA", "SB", "SC", "SD", "SE", "SF", "SG", "SH", "SJ", "SK", "SL", "SM", "SN", "SP", "SQ", "SR", "SS", "ST", "SU", "SV", "SW", "SX", "SY", "SZ") + $Wandler2 = @() + $ZuWandler2 = @("DQ", "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CJ", "CK", "CL", "CM", "CN", "CP", "CQ", "CR", "CS", "CT", "CU", "CV", "CW", "CX", "CY", "CZ", "EA", "EB", "EC", "ED", "EE", "EF", "EG", "EH", "EJ", "EK", "EL", "EM", "EN", "EP", "EQ", "ER", "ES", "ET", "EU", "EV", "EW", "EX", "EY", "EZ", "GA", "GB", "GC", "GD", "GE", "GF", "GG", "GH", "GJ", "GK", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GV", "GW", "GX", "GY", "GZ", "HA", "HB", "HC", "HD", "HE", "HF", "HG", "HH", "HJ", "HK", "HL", "HM", "HN", "HP", "HQ", "HR", "HS", "HT", "HU", "HV", "HW", "HX", "HY", "HZ", "KA", "KB", "KC", "KD", "KE", "KF", "KG", "KH", "KJ", "KK", "KL", "KM", "KN", "KP", "KQ", "KR", "KS", "KT", "KU", "KV", "KW", "KX", "KY", "KZ", "MA", "MB", "MC", "MD", "ME", "MF", "MG", "MH", "MJ", "MK", "ML", "MM", "MN", "MP", "MQ", "MR", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "PA", "PB", "PC", "PD", "PE", "PF", "PG", "PH", "PJ", "PK", "PL", "PM", "PN", "PP", "PQ", "PR", "PS", "PT", "PU", "PV", "PW", "PX", "PY", "PZ", "QA", "QB", "QC", "QD", "QE", "QF", "QG", "QH", "QJ", "QK", "QL", "QM", "QN", "QP", "QQ", "QR", "QS", "QT", "QU", "QV", "QW", "QX", "QY", "QZ", "RA", "RB", "RC", "RD", "RE", "RF", "RG", "RH", "RJ", "RK", "RL", "RM", "RN", "RP", "RQ", "RR", "RS", "RT", "RU", "RV", "RW", "RX", "RY", "RZ", "TA", "TB", "TC", "TD", "TE", "TF", "TG", "TH", "TJ", "TK", "TL", "TM", "TN", "TP", "TQ", "TR", "TS", "TT", "TU", "TV", "TW", "TX", "TY", "TZ") + $Fehler = @() + + $Ursprungdatei = Get-Content $PfadUrsprungsdatei + + foreach ($Eintrag in $Ursprungdatei) + { + $Eintragszeile = $Eintrag.Split("'") + $BMKZahl = $Eintragszeile[1] + $BMKZahl = $BMKZahl.TrimStart("'") + $Kommentar = $Eintragszeile[3] + $Kommentar = $Kommentar.TrimEnd("'") + + if ($($($BMKZahl.Substring(0,2)) -in $ZuWandler1)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $Umwandler1 + $BMKZahl + $Wandler1 += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + elseif ($($($BMKZahl.Substring(0,2)) -in $ZuWandler2)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $Umwandler2 + $BMKZahl + $Wandler2 += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + else + { + Write-Host "Achtung, Fehler bei " $BMKZahl $Kommentar + $Fehler += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + + # Write-Host "In Excel schreiben: BMKZahl: " $BMKZahl " Kommentar: " $Kommentar + $Blatt.Cells.Item($i,1) = $BMKZahl + $Blatt.Cells.Item($i,2) = $Kommentar + + $i++ + + DateiBeschreibenAktualisieren + } + + $Mappe.Save() + $Datei.Quit() + + $GleicheWandler1 = GleicheFinden $Wandler1 + $GleicheWandler2 = GleicheFinden $Wandler2 + Write-Host "Gleiche fuer " $Umwandler1 ": " $GleicheWandler1 + Write-Host "Gleiche fuer " $Umwandler2 ": " $GleicheWandler2 + Write-Host "Fehler bei: " $Fehler + + if ( $($Fehler.Length -eq 0)) + { + $Fehler += @([PSCustomObject]@{ + Name = "Keine" + Zeile = "Alle" + }) + } + + return $GleicheWandler1, $GleicheWandler2, $Fehler +} + +Function ExcelDateiBeschreibenSpezial ($PfadUrsprungsdatei, $Umwandler1, $Umwandler2, $ZielDatei) +{ + $Datei = New-Object -ComObject Excel.Application + $Mappe = $Datei.Workbooks.Open($ZielDatei) + $Blatt = $Mappe.WorkSheets.item(1) + $Datei.Visible = $false + + $i = 2 + $Wandler1 = @() + $ZuWandler1 = @("DI", "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BJ", "BK", "BL", "BM", "BN", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", "FA", "FB", "FC", "FD", "FE", "FF", "FG", "FH", "FJ", "FK", "FL", "FM", "FN", "FP", "FQ", "FR", "FS", "FT", "FU", "FV", "FW", "FX", "FY", "FZ", "SA", "SB", "SC", "SD", "SE", "SF", "SG", "SH", "SJ", "SK", "SL", "SM", "SN", "SP", "SQ", "SR", "SS", "ST", "SU", "SV", "SW", "SX", "SY", "SZ") + $Wandler2 = @() + $ZuWandler2 = @("DQ", "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CJ", "CK", "CL", "CM", "CN", "CP", "CQ", "CR", "CS", "CT", "CU", "CV", "CW", "CX", "CY", "CZ", "EA", "EB", "EC", "ED", "EE", "EF", "EG", "EH", "EJ", "EK", "EL", "EM", "EN", "EP", "EQ", "ER", "ES", "ET", "EU", "EV", "EW", "EX", "EY", "EZ", "GA", "GB", "GC", "GD", "GE", "GF", "GG", "GH", "GJ", "GK", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GV", "GW", "GX", "GY", "GZ", "HA", "HB", "HC", "HD", "HE", "HF", "HG", "HH", "HJ", "HK", "HL", "HM", "HN", "HP", "HQ", "HR", "HS", "HT", "HU", "HV", "HW", "HX", "HY", "HZ", "KA", "KB", "KC", "KD", "KE", "KF", "KG", "KH", "KJ", "KK", "KL", "KM", "KN", "KP", "KQ", "KR", "KS", "KT", "KU", "KV", "KW", "KX", "KY", "KZ", "MA", "MB", "MC", "MD", "ME", "MF", "MG", "MH", "MJ", "MK", "ML", "MM", "MN", "MP", "MQ", "MR", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "PA", "PB", "PC", "PD", "PE", "PF", "PG", "PH", "PJ", "PK", "PL", "PM", "PN", "PP", "PQ", "PR", "PS", "PT", "PU", "PV", "PW", "PX", "PY", "PZ", "QA", "QB", "QC", "QD", "QE", "QF", "QG", "QH", "QJ", "QK", "QL", "QM", "QN", "QP", "QQ", "QR", "QS", "QT", "QU", "QV", "QW", "QX", "QY", "QZ", "RA", "RB", "RC", "RD", "RE", "RF", "RG", "RH", "RJ", "RK", "RL", "RM", "RN", "RP", "RQ", "RR", "RS", "RT", "RU", "RV", "RW", "RX", "RY", "RZ", "TA", "TB", "TC", "TD", "TE", "TF", "TG", "TH", "TJ", "TK", "TL", "TM", "TN", "TP", "TQ", "TR", "TS", "TT", "TU", "TV", "TW", "TX", "TY", "TZ") + $Fehler = @() + + $Blatt.Cells.Item(1,1) = "Name" + $Blatt.Cells.Item(1,2) = "Path" + $Blatt.Cells.Item(1,3) = "Data Type" + $Blatt.Cells.Item(1,4) = "Logical Address" + $Blatt.Cells.Item(1,5) = "Comment" + $Blatt.Cells.Item(1,6) = "Hmi Visible" + $Blatt.Cells.Item(1,7) = "Hmi Accessible" + $Blatt.Cells.Item(1,8) = "Hmi Writeable" + $Blatt.Cells.Item(1,9) = "Typeobject ID" + $Blatt.Cells.Item(1,10) = "Version ID" + + $Ursprungdatei = Get-Content $PfadUrsprungsdatei + + foreach ($Eintrag in $Ursprungdatei) + { + $Eintragszeile = $Eintrag.Split("'") + $BMKZahl = $Eintragszeile[1] + $BMKZahl = $BMKZahl.TrimStart("'") + $Kommentar = $Eintragszeile[3] + $Kommentar = $Kommentar.TrimEnd("'") + + if ($($($BMKZahl.Substring(0,2)) -in $ZuWandler1)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $Umwandler1 + $BMKZahl + $Wandler1 += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + elseif ($($($BMKZahl.Substring(0,2)) -in $ZuWandler2)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $Umwandler2 + $BMKZahl + $Wandler2 += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + else + { + Write-Host "Achtung, Fehler bei " $BMKZahl $Kommentar + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $Fehler += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + + #Write-Host "In Excel schreiben: BMKZahl: " $BMKZahl " Kommentar: " $Kommentar + $Blatt.Cells.Item($i,1) = $Kommentar #Name + $Blatt.Cells.Item($i,2) = "Standard-Variablentabelle" #Path + $Blatt.Cells.Item($i,3) = "Bool" #Data Type + $Blatt.Cells.Item($i,4) = $BMKZahl #Logical Address + #$Blatt.Cells.Item($i,5) = "" #Comment + $Blatt.Cells.Item($i,6) = "'True" #Hmi Visible + $Blatt.Cells.Item($i,7) = "'True" #Hmi Accessible + $Blatt.Cells.Item($i,8) = "'True" #Hmi Writeable + #$Blatt.Cells.Item($i,9) = "" #Typeobject ID + #$Blatt.Cells.Item($i,10) = "" #Version ID + + + $i++ + + DateiBeschreibenAktualisieren + } + + $Mappe.Save() + $Datei.Quit() + + $GleicheWandler1 = GleicheFinden $Wandler1 + $GleicheWandler2 = GleicheFinden $Wandler2 + Write-Host "Gleiche fuer " $Umwandler1 ": " $GleicheWandler1 + Write-Host "Gleiche fuer " $Umwandler2 ": " $GleicheWandler2 + Write-Host "Fehler bei: " $Fehler + + if ( $($Fehler.Length -eq 0)) + { + $Fehler += @([PSCustomObject]@{ + Name = "Keine" + Zeile = "Alle" + }) + } + + return $GleicheWandler1, $GleicheWandler2, $Fehler +} + +Function GleicheFinden ($ZuUeberpruefen) +{ + $ZuUeberpruefen = $ZuUeberpruefen | Sort-Object "Name" + $Gleiche = @() + for ($i = 0; $i -lt $($ZuUeberpruefen.Count - 1); $i++) + { + $IstGleich = $($ZuUeberpruefen[$i].Name -eq $ZuUeberpruefen[$($i+1)].Name) + if ($IstGleich) + { + # Eintrag hinzufügen + if (-not $($Gleiche[-1].Zeile -eq $ZuUeberpruefen[$i].Zeile)) + { + $Gleiche += $ZuUeberpruefen[$i] + } + $Gleiche += $ZuUeberpruefen[$($i+1)] + #Write-Host "Gleiche: " $Gleiche + } + } + + if ( $($Gleiche.Length -eq 0)) + { + $Gleiche += @([PSCustomObject]@{ + Name = "Keine" + Zeile = "Alle" + }) + } + + return $Gleiche +} + + +Main \ No newline at end of file diff --git a/Test-Skripte/GUI-Angepasst5 - Backup1.ps1 b/Test-Skripte/GUI-Angepasst5 - Backup1.ps1 new file mode 100644 index 0000000..2986caf --- /dev/null +++ b/Test-Skripte/GUI-Angepasst5 - Backup1.ps1 @@ -0,0 +1,1515 @@ +Function Main +{ + Write-Host "Programmstart" + + # Überprüfen, ob Einstellungsdatei vorhanden, ggf. erstellen + $AktuellesVerzeichnis = Get-Location + $PfadEinstellungsDatei = $("$AktuellesVerzeichnis\" + "EinstellungenSkriptKonvertierung.txt") + #Write-Host "AktuellesVerzeichnis: " $AktuellesVerzeichnis + #Write-Host "Einstellungsdatei: " $PfadEinstellungsDatei + + if (Test-Path $PfadEinstellungsDatei) { + #Es gibt eine Datei mit den Einstellungen -> auslesen + #Todo: Checken, ob Inhalte plausibel sind -> ggf. neue mit Standardwerten erstellen! + $EinstellungsInhalte = Get-Content $PfadEinstellungsDatei + Write-Host "Einstellungsinhalte: " $EinstellungsInhalte + + $StartPfad = $EinstellungsInhalte[0] + foreach ($EinstellungsZeile in $EinstellungsInhalte) { + $EinstellungsInhalt = $EinstellungsZeile.Split("|") + if ($EinstellungsInhalt[0] -eq "Datei") { + $ZielDateien += @([PSCustomObject]@{ + PrefixEingang = $EinstellungsInhalt[1] + PrefixAusgang = $EinstellungsInhalt[2] + DateiName = $EinstellungsInhalt[3] + WandlungsTyp = $EinstellungsInhalt[4] + }) + } + } + #Write-Host "Zieldateien: " $ZielDateien + } + else { + #Es gibt keine Datei mit den Einstellungen -> erstellen + #Todo: Umbauen: Eintraege via EinstellungsDateiAendern hinzufuegen!!! + + # Mögliches Problem mit der Funktion "StartVerzeichnisAendern". Überprüfen! + + New-Item $PfadEinstellungsDatei -ItemType File + + $StartPfad = $AktuellesVerzeichnis + $ZielDateien = @([PSCustomObject]@{ + PrefixEingang = "E" + PrefixAusgang = "A" + DateiName = "EA_[Ursprungsdatei]" + WandlungsTyp = "Simpel" + }) + + $ZielDateien += @([PSCustomObject]@{ + PrefixEingang = "%I" + PrefixAusgang = "%Q" + DateiName = "DIDQ_[Ursprungsdatei]" + WandlungsTyp = "TIA" + }) + + Add-Content $PfadEinstellungsDatei $($StartPfad) + Add-Content $PfadEinstellungsDatei $("Datei|" + $ZielDateien[0].PrefixEingang + "|" + $ZielDateien[0].PrefixAusgang + "|" + $ZielDateien[0].DateiName + "|" + $ZielDateien[0].WandlungsTyp) + Add-Content $PfadEinstellungsDatei $("Datei|" + $ZielDateien[1].PrefixEingang + "|" + $ZielDateien[1].PrefixAusgang + "|" + $ZielDateien[1].DateiName + "|" + $ZielDateien[1].WandlungsTyp) + } + + GUI $StartPfad $ZielDateien + +} + + + +Function GUI ($StartPfad, $ZielDateien) +{ + [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") + [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") + + # Eigenschaften Fenster + $Fenster = New-Object System.Windows.Forms.Form + $Fenster.Size = New-Object System.Drawing.Size(940,660) #Breite, Höhe + $Fenster.StartPosition = "CenterScreen" + $Fenster.KeyPreview = $true # was macht das? + $Fenster.MaximumSize = $Fenster.Size # legt fest, dass Größe des Fensters nicht verändert werden kann + $Fenster.MinimumSize = $Fenster.Size + $Fenster.Text = "Dateikonvertierer txt zu xlsx" + + # Eigenschaften Tabs + $TabBasis = New-Object System.Windows.Forms.TabControl + $TabBasis.Location = New-Object System.Drawing.Size(10,10) + $TabBasis.Size = New-Object System.Drawing.Size(900,600) + $TabBasis.DataBindings.DefaultDataSourceUpdateMode = 0 # Was macht das? + $Fenster.Controls.Add($TabBasis) + + # Tab: TXT-Pfad auswaehlen + $TabSeiteTXTAuswaehlen = New-Object System.Windows.Forms.TabPage + $TabSeiteTXTAuswaehlen.TabIndex = 0 + $TabSeiteTXTAuswaehlen.UseVisualStyleBackColor = $true + $TabSeiteTXTAuswaehlen.Text = "txt-Datei Auswaehlen" + #Paddings + $TabSeiteTXTAuswaehlen.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteTXTAuswaehlen) + + # TXTPfadFeld + $TXTPfadFeld = New-Object System.Windows.Forms.TextBox + $TXTPfadFeld.Location = New-Object System.Drawing.Size(10,10) + $TXTPfadFeld.Size = New-Object System.Drawing.Size(860,20) + $TXTPfadFeld.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionPfadFeld "txt" $Taste + }) + $TabSeiteTXTAuswaehlen.Controls.Add($TXTPfadFeld) + + # TXTListeOrdnernamen + $TXTListeOrdnernamen = New-Object System.Windows.Forms.ListBox + $TXTListeOrdnernamen.Location = New-Object System.Drawing.Size(10,40) + $TXTListeOrdnernamen.Size = New-Object System.Drawing.Size(860,20) + $TXTListeOrdnernamen.Height = 450 + $TXTListeOrdnernamen.Font = New-Object System.Drawing.Font("Arial",12,[System.Drawing.FontStyle]::Regular) + $TXTListeOrdnernamen.Add_DoubleClick({ + # Variablen bestimmen zur Übergabe + $Auswahl = $TXTListeOrdnernamen.SelectedItem + $Pfad = $TXTPfadFeld.Text + # Write-Host "Gewählter Ordner/ Datei: " $Auswahl + # Write-Host "Vorheriger Pfad: " $TXTPfad + + # Pfad aktualisieren + VerzeichnisAuswaehlen "txt" $Pfad $Auswahl + }) + $TXTListeOrdnernamen.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionListeOrdnernamen "txt" $Taste + }) + $TabSeiteTXTAuswaehlen.Controls.Add($TXTListeOrdnernamen) + + # ZurückButton + $TXTZurueckButton = New-Object System.Windows.Forms.Button + $TXTZurueckButton.Location = New-Object System.Drawing.Size(10,500) + $TXTZurueckButton.Size = New-Object System.Drawing.Size(100,30) + $TXTZurueckButton.Text = "Zurueck" + $TXTZurueckButton.Add_Click({ + # Write-Host "Pfad ausgabe: " $TXTPfadFeld.Text + $Pfad = $TXTPfadFeld.Text + + #Pfad aktualisieren + VerzeichnisZurueck "txt" $Pfad + }) + $TXTZurueckButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionButtons "txt" $Taste + }) + $TabSeiteTXTAuswaehlen.Controls.Add($TXTZurueckButton) + + # AuswaehlenButton + $TXTAuswaehlenButton = New-Object System.Windows.Forms.Button + $TXTAuswaehlenButton.Location = New-Object System.Drawing.Size(750,500) + $TXTAuswaehlenButton.Size = New-Object System.Drawing.Size(100,30) + $TXTAuswaehlenButton.Text = "Auswaehlen" + $TXTAuswaehlenButton.Add_Click({ + # Variablen bestimmen zur Übergabe + $Auswahl = $TXTListeOrdnernamen.SelectedItem + $Pfad= $TXTPfadFeld.Text + # Write-Host "Gewählter Ordner/ Datei: " $Auswahl + # Write-Host "Vorheriger Pfad: " $TXTPfad + + # Pfad aktualisieren + VerzeichnisAuswaehlen "txt" $Pfad $Auswahl + }) + $TXTAuswaehlenButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionButtons "txt" $Taste + }) + $TabSeiteTXTAuswaehlen.Controls.Add($TXTAuswaehlenButton) + + $A = AnzeigeAktualisieren "txt" $StartPfad # Ohne dem Aufruf kann kein Startverzeichnis übergeben werden. Wird der Aufruf keiner Variable zugewiesen verursacht dies Fehler bei der Rückgabe. + + #$TXTDatei = $TXTPfadFeld.Text + + # Tab: Zielverzeichnis auswaehlen + $TabSeiteZielVerzeichnisAuswaehlen = New-Object System.Windows.Forms.TabPage + $TabSeiteZielVerzeichnisAuswaehlen.TabIndex = 1 + $TabSeiteZielVerzeichnisAuswaehlen.UseVisualStyleBackColor = $true + $TabSeiteZielVerzeichnisAuswaehlen.Text = "Zielverzeichnis Auswaehlen" + #Paddings + $TabSeiteZielVerzeichnisAuswaehlen.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteZielVerzeichnisAuswaehlen) + + # PfadFeld + $VERPfadFeld = New-Object System.Windows.Forms.TextBox + $VERPfadFeld.Location = New-Object System.Drawing.Size(10,10) + $VERPfadFeld.Size = New-Object System.Drawing.Size(860,20) + $VERPfadFeld.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionPfadFeld "ver" $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERPfadFeld) + + # ListeOrdnernamen + $VERListeOrdnernamen = New-Object System.Windows.Forms.ListBox + $VERListeOrdnernamen.Location = New-Object System.Drawing.Size(10,40) + $VERListeOrdnernamen.Size = New-Object System.Drawing.Size(860,20) + $VERListeOrdnernamen.Height = 450 + $VERListeOrdnernamen.Font = New-Object System.Drawing.Font("Arial",12,[System.Drawing.FontStyle]::Regular) + $VERListeOrdnernamen.Add_DoubleClick({ + # Variablen bestimmen zur Übergabe + $Auswahl = $VERListeOrdnernamen.SelectedItem + $Pfad = $VERPfadFeld.Text + # Write-Host "Gewählter Ordner/ Datei: " $Auswahl + # Write-Host "Vorheriger Pfad: " $VERPfad + + # Pfad aktualisieren + VerzeichnisAuswaehlen "ver" $Pfad $Auswahl + }) + $VERListeOrdnernamen.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionListeOrdnernamen "ver" $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERListeOrdnernamen) + + # ZurückButton + $VERZurueckButton = New-Object System.Windows.Forms.Button + $VERZurueckButton.Location = New-Object System.Drawing.Size(10,500) + $VERZurueckButton.Size = New-Object System.Drawing.Size(100,30) + $VERZurueckButton.Text = "Zurueck" + $VERZurueckButton.Add_Click({ + # Write-Host "Pfad ausgabe: " $VERPfadFeld.Text + $Pfad = $VERPfadFeld.Text + + #Pfad aktualisieren + VerzeichnisZurueck "ver" $Pfad + }) + $VERZurueckButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionButtons "ver" $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERZurueckButton) + + # AuswaehlenButton + $VERAuswaehlenButton = New-Object System.Windows.Forms.Button + $VERAuswaehlenButton.Location = New-Object System.Drawing.Size(630,500) + $VERAuswaehlenButton.Size = New-Object System.Drawing.Size(100,30) + $VERAuswaehlenButton.Text = "Auswaehlen" + $VERAuswaehlenButton.Add_Click({ + # Variablen bestimmen zur Übergabe + $Auswahl = $VERListeOrdnernamen.SelectedItem + $Pfad = $VERPfadFeld.Text + # Write-Host "Gewählter Ordner/ Datei: " $Auswahl + # Write-Host "Vorheriger Pfad: " $VERPfad + + if ($($VERListeOrdnernamen.Items[0] -eq "")) + { + VERAuswahlBestaetigt $Pfad $Auswahl + } + else + { + # Pfad aktualisieren + VerzeichnisAuswaehlen "ver" $Pfad $Auswahl + } + }) + $VERAuswaehlenButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionButtons "ver" $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERAuswaehlenButton) + + # BestaetigenButton + $VERBestaetigenButton = New-Object System.Windows.Forms.Button + $VERBestaetigenButton.Location = New-Object System.Drawing.Size(750,500) + $VERBestaetigenButton.Size = New-Object System.Drawing.Size(100,30) + $VERBestaetigenButton.Text = "Bestaetigen" + $VERBestaetigenButton.Add_Click({ + $Auswahl = $VERListeOrdnernamen.SelectedItem + $Pfad = $VERPfadFeld.Text + + VERAuswahlBestaetigt $Pfad $Auswahl + }) + $VERBestaetigenButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionButtons "ver" $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERBestaetigenButton) + + # Dieser Funktionsaufruf zerstört die Rückgabe, wenn er keiner Variable zugewiesen wird + #$A = AnzeigeAktualisieren "ver" $TXTPfadFeld.Text + + #$ZielVerzeichnis = $VERPfadFeld.Text + + # Tab: Ausgabe Fortschritt + $TabSeiteFortschrittsanzeige = New-Object System.Windows.Forms.TabPage + $TabSeiteFortschrittsanzeige.TabIndex = 2 + $TabSeiteFortschrittsanzeige.UseVisualStyleBackColor = $true + $TabSeiteFortschrittsanzeige.Text = "Bearbeitungsfortschritt" + #Paddings + $TabSeiteFortschrittsanzeige.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteFortschrittsanzeige) + + $FATextfeld1 = New-Object System.Windows.Forms.Label + $FATextfeld1.Location = New-Object System.Drawing.Size(10,10) + $FATextfeld1.Size = New-Object System.Drawing.Size(200,20) + $FATextfeld1.Text = "Aktuelle Aufgabe" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld1) + + $FATextfeld2 = New-Object System.Windows.Forms.Label + $FATextfeld2.Location = New-Object System.Drawing.Size(300,10) + $FATextfeld2.Size = New-Object System.Drawing.Size(430,20) + $FATextfeld2.Text = "Erledigte Aufgaben" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld2) + + $FATextfeldAktuelleAufgabe = New-Object System.Windows.Forms.Label + $FATextfeldAktuelleAufgabe.Location = New-Object System.Drawing.Size(10,40) + $FATextfeldAktuelleAufgabe.Size = New-Object System.Drawing.Size(280,60) + $FATextfeldAktuelleAufgabe.Text = "txt-Datei auswaehlen" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeldAktuelleAufgabe) + + $FAListeErledigteAufgaben = New-Object System.Windows.Forms.ListBox + $FAListeErledigteAufgaben.Location = New-Object System.Drawing.Size(300,40) + $FAListeErledigteAufgaben.Size = New-Object System.Drawing.Size(430,20) + $FAListeErledigteAufgaben.Height = 150 + $FAListeErledigteAufgaben.Font = New-Object System.Drawing.Font("Arial",12,[System.Drawing.FontStyle]::Regular) + $TabSeiteFortschrittsanzeige.Controls.Add($FAListeErledigteAufgaben) + + $FATextfeld3 = New-Object System.Windows.Forms.Label + $FATextfeld3.Location = New-Object System.Drawing.Size(10,100) + $FATextfeld3.Size = New-Object System.Drawing.Size(430,20) + $FATextfeld3.Text = "Fortschritt Excel-Dateien beschreiben" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld3) + + $FAFortschrittsbar = New-Object System.Windows.Forms.ProgressBar + $FAFortschrittsbar.Location = New-Object System.Drawing.Size(10,120) + $FAFortschrittsbar.Size = New-Object System.Drawing.Size(260,30) + #$FAFortschrittsbar.Name = "Fortschrittsanzeige" + $FAFortschrittsbar.Value = 0 + $TabSeiteFortschrittsanzeige.Controls.Add($FAFortschrittsbar) + + $FATextfeldRealwertFortschrittsbar = New-Object System.Windows.Forms.Label # Wird verwendet, aber VSC erkennt das nicht + + $FATextfeld4 = New-Object System.Windows.Forms.Label + $FATextfeld4.Location = New-Object System.Drawing.Size(10,170) + $FATextfeld4.Size = New-Object System.Drawing.Size(140,20) + $FATextfeld4.Text = "Bearbeitete Eintraege:" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld4) + + $FATextfeld5 = New-Object System.Windows.Forms.Label + $FATextfeld5.Location = New-Object System.Drawing.Size(10,200) + $FATextfeld5.Size = New-Object System.Drawing.Size(100,20) + $FATextfeld5.Text = "Gesamteintraege:" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld5) + + $FATextfeldBearbeiteteEintraege = New-Object System.Windows.Forms.Label + $FATextfeldBearbeiteteEintraege.Location = New-Object System.Drawing.Size(170,170) + $FATextfeldBearbeiteteEintraege.Size = New-Object System.Drawing.Size(430,20) + $FATextfeldBearbeiteteEintraege.Text = "0" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeldBearbeiteteEintraege) + + $FATextfeldGesamtEintraege = New-Object System.Windows.Forms.Label + $FATextfeldGesamtEintraege.Location = New-Object System.Drawing.Size(170,200) + $FATextfeldGesamtEintraege.Size = New-Object System.Drawing.Size(430,20) + $FATextfeldGesamtEintraege.Text = $($Ursprungdatei.Length) + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeldGesamtEintraege) + + # Tab: Ausgabe doppelte Ein- und Ausgänge sowie nicht zurordnebare Betriebsmittel + $TabSeiteDuplikate = New-Object System.Windows.Forms.TabPage + $TabSeiteDuplikate.TabIndex = 3 + $TabSeiteDuplikate.UseVisualStyleBackColor = $true + $TabSeiteDuplikate.Text = "Doppelte Ein- und Ausgaenge" + #Paddings + $TabSeiteDuplikate.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteDuplikate) + + $DPTextfeld1 = New-Object System.Windows.Forms.Label + $DPTextfeld1.Location = New-Object System.Drawing.Size(10,10) + $DPTextfeld1.Size = New-Object System.Drawing.Size(275,40) + $DPTextfeld1.Text = "Bei den Eingaengen gibt es folgende Duplikate: " + $TabSeiteDuplikate.Controls.Add($DPTextfeld1) + + $DPListeEingaenge = New-Object System.Windows.Forms.DataGridView + $DPListeEingaenge.Location = New-Object System.Drawing.Size(10,60) + $DPListeEingaenge.Size = New-Object System.Drawing.Size(275,20) + $DPListeEingaenge.Height = 430 + $DPListeEingaenge.ColumnCount = 2 + $DPListeEingaenge.ColumnHeadersVisible = $true + $DPListeEingaenge.Columns[0].Name = "Zeile" + $DPListeEingaenge.Columns[1].Name = "Kennzeichnung" + $TabSeiteDuplikate.Controls.Add($DPListeEingaenge) + + $DPTextfeld2 = New-Object System.Windows.Forms.Label + $DPTextfeld2.Location = New-Object System.Drawing.Size(295,10) + $DPTextfeld2.Size = New-Object System.Drawing.Size(275,40) + $DPTextfeld2.Text = "Bei den Ausgaengen gibt es folgende Duplikate: " + $TabSeiteDuplikate.Controls.Add($DPTextfeld2) + + $DPListeAusgaenge = New-Object System.Windows.Forms.DataGridView + $DPListeAusgaenge.Location = New-Object System.Drawing.Size(295,60) + $DPListeAusgaenge.Size = New-Object System.Drawing.Size(275,20) + $DPListeAusgaenge.Height = 430 + $DPListeAusgaenge.ColumnCount = 2 + $DPListeAusgaenge.ColumnHeadersVisible = $true + $DPListeAusgaenge.Columns[0].Name = "Zeile" + $DPListeAusgaenge.Columns[1].Name = "Kennzeichnung" + $TabSeiteDuplikate.Controls.Add($DPListeAusgaenge) + + $DPTextfeld3 = New-Object System.Windows.Forms.Label + $DPTextfeld3.Location = New-Object System.Drawing.Size(580,10) + $DPTextfeld3.Size = New-Object System.Drawing.Size(275,40) + $DPTextfeld3.Text = "Folgende Eintraege konnten keinem Betriebsmittel zugewiesen werden:" + $TabSeiteDuplikate.Controls.Add($DPTextfeld3) + + $DPListeFehler = New-Object System.Windows.Forms.DataGridView + $DPListeFehler.Location = New-Object System.Drawing.Size(580,60) + $DPListeFehler.Size = New-Object System.Drawing.Size(275,20) + $DPListeFehler.Height = 430 + $DPListeFehler.ColumnCount = 2 + $DPListeFehler.ColumnHeadersVisible = $true + $DPListeFehler.Columns[0].Name = "Zeile" + $DPListeFehler.Columns[1].Name = "Kennzeichnung" + $TabSeiteDuplikate.Controls.Add($DPListeFehler) + + $DPBestaetigenButton = New-Object System.Windows.Forms.Button + $DPBestaetigenButton.Location = New-Object System.Drawing.Size(10,500) + $DPBestaetigenButton.Size = New-Object System.Drawing.Size(860,30) + $DPBestaetigenButton.Text = "Programm beenden" + $DPBestaetigenButton.Add_Click({ + $Fenster.Dispose() + return + }) + $TabSeiteDuplikate.Controls.Add($DPBestaetigenButton) + + # Tab: Einstellungen + $TabSeiteEigenschaften = New-Object System.Windows.Forms.TabPage + $TabSeiteEigenschaften.TabIndex = 0 + $TabSeiteEigenschaften.UseVisualStyleBackColor = $true + $TabSeiteEigenschaften.Text = "Einstellungen" + #Paddings + $TabSeiteEigenschaften.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteEigenschaften) + + $BasisHoehe1 = 80 #80 + $BasisHoehe2 = $BasisHoehe1 + 20 #100 + $BasisHoehe2x = $BasisHoehe2 + 30 #130 + $BasisHoehe3 = $BasisHoehe2 + 65 #165 + + $BasisBreite1 = 10 #10 + $BasisBreite2 = $BasisBreite1 + 70 #80 + $BasisBreite3 = $BasisBreite2 + 60 #140 + $BasisBreite4 = $BasisBreite3 + 210 #350 + $BasisBreite5 = $BasisBreite4 + 55 #405 + + + $ESTextfeld1 = New-Object System.Windows.Forms.Label + $ESTextfeld1.Location = New-Object System.Drawing.Size($BasisBreite1,10) + $ESTextfeld1.Size = New-Object System.Drawing.Size(710,20) + $ESTextfeld1.Text = "Startverzeichnis Navigation: $StartPfad" + $TabSeiteEigenschaften.Controls.Add($ESTextfeld1) + + $ESAendernButton = New-Object System.Windows.Forms.Button + $ESAendernButton.Location = New-Object System.Drawing.Size(730,10) + $ESAendernButton.Size = New-Object System.Drawing.Size(150,30) + $ESAendernButton.Text = "Aendern" + $ESAendernButton.Add_Click({ + StartVerzeichnisAendern + }) + $TabSeiteEigenschaften.Controls.Add($ESAendernButton) + +#------------------- Tabelle mit ZielDateien + + $ESTextfeld2 = New-Object System.Windows.Forms.Label + $ESTextfeld2.Location = New-Object System.Drawing.Size($BasisBreite1,50) + $ESTextfeld2.Size = New-Object System.Drawing.Size(200,20) + $ESTextfeld2.Text = "Zieldateien:" + $TabSeiteEigenschaften.Controls.Add($ESTextfeld2) + + $ESTextfeld3 = New-Object System.Windows.Forms.Label + $ESTextfeld3.Location = New-Object System.Drawing.Size(($BasisBreite1+30),$BasisHoehe1) + $ESTextfeld3.Size = New-Object System.Drawing.Size(80,20) + $ESTextfeld3.Text = "Prefix für" + $TabSeiteEigenschaften.Controls.Add($ESTextfeld3) + + $ESTextfeld4 = New-Object System.Windows.Forms.Label + $ESTextfeld4.Location = New-Object System.Drawing.Size($BasisBreite1,$BasisHoehe2) + $ESTextfeld4.Size = New-Object System.Drawing.Size(50,20) + $ESTextfeld4.Text = "Eingang" + $TabSeiteEigenschaften.Controls.Add($ESTextfeld4) + + $ESTextfeld5 = New-Object System.Windows.Forms.Label + $ESTextfeld5.Location = New-Object System.Drawing.Size(($BasisBreite2-5),$BasisHoehe2) + $ESTextfeld5.Size = New-Object System.Drawing.Size(55,20) + $ESTextfeld5.Text = "Ausgang" + $TabSeiteEigenschaften.Controls.Add($ESTextfeld5) + + $ESTextfeld6 = New-Object System.Windows.Forms.Label + $ESTextfeld6.Location = New-Object System.Drawing.Size($BasisBreite3,$BasisHoehe1) + $ESTextfeld6.Size = New-Object System.Drawing.Size(150,40) + $ESTextfeld6.Text = "Dateiname" + $TabSeiteEigenschaften.Controls.Add($ESTextfeld6) + + $ESTextfeld7 = New-Object System.Windows.Forms.Label + $ESTextfeld7.Location = New-Object System.Drawing.Size($BasisBreite4,$BasisHoehe1) + $ESTextfeld7.Size = New-Object System.Drawing.Size(100,20) + $ESTextfeld7.Text = "Wandlungsart" + $TabSeiteEigenschaften.Controls.Add($ESTextfeld7) + + $ESTextfeld8 = New-Object System.Windows.Forms.Label + $ESTextfeld8.Location = New-Object System.Drawing.Size($BasisBreite4,$BasisHoehe2) + $ESTextfeld8.Size = New-Object System.Drawing.Size(50,20) + $ESTextfeld8.Text = "Simpel" + $TabSeiteEigenschaften.Controls.Add($ESTextfeld8) + + $ESTextfeld9 = New-Object System.Windows.Forms.Label + $ESTextfeld9.Location = New-Object System.Drawing.Size($BasisBreite5,$BasisHoehe2) + $ESTextfeld9.Size = New-Object System.Drawing.Size(50,20) + $ESTextfeld9.Text = "TIA" + $TabSeiteEigenschaften.Controls.Add($ESTextfeld9) + +#--------------------------- Eintrag hinzufuegen Elemente + + $ESTextfeldPrefixENew = New-Object System.Windows.Forms.TextBox + $ESTextfeldPrefixENew.Location = New-Object System.Drawing.Size($BasisBreite1,$Basishoehe2x) + $ESTextfeldPrefixENew.Size = New-Object System.Drawing.Size(40,20) + $ESTextfeldPrefixENew.Name = "ESTextfeldENew" + $ESTextfeldPrefixENew.Add_Click({ + Write-Host "Ausgabe bei ESTextfeldENew" + }.GetNewClosure()) + $TabSeiteEigenschaften.Controls.Add($ESTextfeldPrefixENew) + + $ESTextfeldPrefixANew = New-Object System.Windows.Forms.TextBox + $ESTextfeldPrefixANew.Location = New-Object System.Drawing.Size($BasisBreite2,$Basishoehe2x) + $ESTextfeldPrefixANew.Size = New-Object System.Drawing.Size(40,20) + $ESTextfeldPrefixANew.Name = "ESTextfeldANew" + $ESTextfeldPrefixANew.Add_Click({ + Write-Host "Ausgabe bei Button ESTextfeldANew" + }.GetNewClosure()) + $TabSeiteEigenschaften.Controls.Add($ESTextfeldPrefixANew) + + $ESTextfeldDateiNameNew = New-Object System.Windows.Forms.TextBox + $ESTextfeldDateiNameNew.Location = New-Object System.Drawing.Size($BasisBreite3,$Basishoehe2x) + $ESTextfeldDateiNameNew.Size = New-Object System.Drawing.Size(200,20) + $ESTextfeldDateiNameNew.Name = "ESTextfeldDateiNameNew" + $ESTextfeldDateiNameNew.Add_Click({ + Write-Host "Ausgabe bei Button ESTextfeldDateiNameNew" + }.GetNewClosure()) + $TabSeiteEigenschaften.Controls.Add($ESTextfeldDateiNameNew) + + $ESRadioButtonSimpelNew = New-Object System.Windows.Forms.RadioButton + $ESRadioButtonSimpelNew.Location = New-Object System.Drawing.Size(15,10) + $ESRadioButtonSimpelNew.Size = New-Object System.Drawing.Size(17,17) + $ESRadioButtonSimpelNew.Name = "ESRadioButtonSimpelNew" + <#$ESRadioButtonSimpelNew.Add_Click({ + Write-Host "Ausgabe bei Button $FaktorHoehe" + }.GetNewClosure())#> + #$TabSeiteEigenschaften.Controls.Add($ESRadioButtonSimpelNew) + + $ESRadioButtonTIANew = New-Object System.Windows.Forms.RadioButton + $ESRadioButtonTIANew.Location = New-Object System.Drawing.Size(60,10) + $ESRadioButtonTIANew.Size = New-Object System.Drawing.Size(17,17) + $ESRadioButtonTIANew.Name = "ESRadioButtonTIANew" + <#$ESRadioButtonTIANew.Add_Click({ + Write-Host "Ausgabe bei Button $FaktorHoehe" + }.GetNewClosure())#> + #$TabSeiteEigenschaften.Controls.Add($ESRadioButtonTIANew) + + $ESGroupBoxRadioButtons = New-Object System.Windows.Forms.GroupBox + $ESGroupBoxRadioButtons.Location = New-Object System.Drawing.Size($BasisBreite4,($BasisHoehe2x-5)) + $ESGroupBoxRadioButtons.Size = New-Object System.Drawing.Size(85,30) + $ESGroupBoxRadioButtons.Controls.Add($ESRadioButtonSimpelNew) + $ESGroupBoxRadioButtons.Controls.Add($ESRadioButtonTIANew) + $TabSeiteEigenschaften.Controls.Add($ESGroupBoxRadioButtons) + + $ESHinzufuegenButton = New-Object System.Windows.Forms.Button + $ESHinzufuegenButton.Location = New-Object System.Drawing.Size(730,$BasisHoehe2x) + $ESHinzufuegenButton.Size = New-Object System.Drawing.Size(150,30) + $ESHinzufuegenButton.Text = "Eintrag hinzufuegen" + $ESHinzufuegenButton.Add_Click({ + Write-Host "Eintrag hinzufuegen" + + if ($ESRadioButtonTIANew.Checked) { + $WandlungsTyp = "TIA" + } + else { + $WandlungsTyp = "Simpel" + } + Write-Host "WandlungsTyp: " $WandlungsTyp + + $NeueZielDatei = @([PSCustomObject]@{ + PrefixEingang = $ESTextfeldPrefixENew.Text + PrefixAusgang = $ESTextfeldPrefixANew.Text + DateiName = $ESTextfeldDateiNameNew.Text + WandlungsTyp = $WandlungsTyp + }) + EinstellungsDateiAendern "New" $FaktorHoehe $ZielDateien $NeueZielDatei + }) + $TabSeiteEigenschaften.Controls.Add($ESHinzufuegenButton) + + # Das hier später auslagern + Write-Host "Alle ZielDateien: " $ZielDateien + $FaktorHoehe = 0 + foreach ($ZielDatei in $ZielDateien) { + # Eintrag hinzufügen mit #1 Textfeldern für a) Eingang b) Ausgang #2 Textfeld für Dateiname #3 Radio-Buttons für a) Simpel b) TIA + # Todo: Wie kann ich weitere Eigenschaften festlegen? Probieren: Set-Variable + #New-Variable -Name ("ESTextFeldPrefixE" + $i) -Value $(New-Object System.Windows.Forms.TextBox) + <#Set-Variable -Name ("ESTextFeldPrefixE" + $i + ".Location") -Value $(New-Object System.Drawing.Size(10,100)) + Set-Variable -Name ("ESTextFeldPrefixE" + $i + ".Size") -Value $(New-Object System.Drawing.Size(400,20)) + Set-Variable -Name ("ESTextFeldPrefixE" + $i + ".Text") -Value $("Test zur Laufzeitgenerierung")#> + <#$(New-Variable -Name ("ESTextFeldPrefixE" + $i + ".Location")) # = New-Object System.Drawing.Size(10,100) + $(Get-Variable -Name ("ESTextFeldPrefixE" + $i + ".Location")).Value = New-Object System.Drawing.Size(10,100) + + $(New-Variable -Name ("ESTextFeldPrefixE" + $i + ".Size")) #= New-Object System.Drawing.Size(400,20) + $(New-Variable -Name ("ESTextFeldPrefixE" + $i + ".Text")) #= "Test zur Laufzeitgenerierung" + $TabSeiteEigenschaften.Controls.Add($(Get-Variable -Name $("ESTextFeldPrefixE" + $i)).Value)#> + + $ESTextfeldPrefixE = New-Object System.Windows.Forms.TextBox + $ESTextfeldPrefixE.Location = New-Object System.Drawing.Size($BasisBreite1,($BasisHoehe3+35*$FaktorHoehe)) + $ESTextfeldPrefixE.Size = New-Object System.Drawing.Size(40,20) + $ESTextfeldPrefixE.Text = $ZielDatei.PrefixEingang + $ESTextfeldPrefixE.Name = "ESTextfeldE$FaktorHoehe" + $ESTextfeldPrefixE.Add_Click({ + Write-Host "Ausgabe bei Button $FaktorHoehe" + }.GetNewClosure()) + $TabSeiteEigenschaften.Controls.Add($ESTextfeldPrefixE) + + $ESTextfeldPrefixA = New-Object System.Windows.Forms.TextBox + $ESTextfeldPrefixA.Location = New-Object System.Drawing.Size($BasisBreite2,($BasisHoehe3+35*$FaktorHoehe)) + $ESTextfeldPrefixA.Size = New-Object System.Drawing.Size(40,20) + $ESTextfeldPrefixA.Text = $ZielDatei.PrefixAusgang + $ESTextfeldPrefixA.Name = "ESTextfeldA$FaktorHoehe" + $ESTextfeldPrefixA.Add_Click({ + Write-Host "Ausgabe bei Button $FaktorHoehe" + }.GetNewClosure()) + $TabSeiteEigenschaften.Controls.Add($ESTextfeldPrefixA) + + $ESTextfeldDateiName = New-Object System.Windows.Forms.TextBox + $ESTextfeldDateiName.Location = New-Object System.Drawing.Size($BasisBreite3,($BasisHoehe3+35*$FaktorHoehe)) + $ESTextfeldDateiName.Size = New-Object System.Drawing.Size(200,20) + $ESTextfeldDateiName.Text = $ZielDatei.DateiName + $ESTextfeldDateiName.Name = "ESTextfeldDateiName$FaktorHoehe" + $ESTextfeldDateiName.Add_Click({ + Write-Host "Ausgabe bei Button $FaktorHoehe" + }.GetNewClosure()) + $TabSeiteEigenschaften.Controls.Add($ESTextfeldDateiName) + + $ESRadioButtonSimpel = New-Object System.Windows.Forms.RadioButton + $ESRadioButtonSimpel.Location = New-Object System.Drawing.Size(15,10) + $ESRadioButtonSimpel.Size = New-Object System.Drawing.Size(17,17) + #$ESRadioButtonSimpel.Text = "Text Radio Button1" #$ZielDatei.DateiName + $ESRadioButtonSimpel.Name = "ESRadioButtonSimpel$FaktorHoehe" + <#$ESRadioButtonSimpel.Add_Click({ + Write-Host "Ausgabe bei Button $FaktorHoehe" + }.GetNewClosure())#> + #$TabSeiteEigenschaften.Controls.Add($ESRadioButtonSimpel) + + $ESRadioButtonTIA = New-Object System.Windows.Forms.RadioButton + $ESRadioButtonTIA.Location = New-Object System.Drawing.Size(60,10) + $ESRadioButtonTIA.Size = New-Object System.Drawing.Size(17,17) + #$ESRadioButtonTIA.Text = "Text Radio Button2" #$ZielDatei.DateiName + $ESRadioButtonTIA.Name = "ESRadioButtonTIA$FaktorHoehe" + <#$ESRadioButtonTIA.Add_Click({ + Write-Host "Ausgabe bei Button $FaktorHoehe" + }.GetNewClosure())#> + #$TabSeiteEigenschaften.Controls.Add($ESRadioButtonTIA) + + $ESGroupBoxRadioButtons = New-Object System.Windows.Forms.GroupBox + $ESGroupBoxRadioButtons.Location = New-Object System.Drawing.Size($BasisBreite4,($BasisHoehe3-5+35*$FaktorHoehe)) + $ESGroupBoxRadioButtons.Size = New-Object System.Drawing.Size(85,30) + #$ESGroupBoxRadioButtons.Text = "Text ControlBox" + $ESGroupBoxRadioButtons.Controls.Add($ESRadioButtonSimpel) + $ESGroupBoxRadioButtons.Controls.Add($ESRadioButtonTIA) + $TabSeiteEigenschaften.Controls.Add($ESGroupBoxRadioButtons) + + if ($ZielDatei.WandlungsTyp -eq "TIA") { + $ESRadioButtonTIA.Checked = $true + } + else { + $ESRadioButtonSimpel.Checked = $true + } + + $ESLoeschenButton = New-Object System.Windows.Forms.Button + $ESLoeschenButton.Location = New-Object System.Drawing.Size(730,($BasisHoehe3+35*$FaktorHoehe)) + $ESLoeschenButton.Size = New-Object System.Drawing.Size(150,30) + $ESLoeschenButton.Text = "Loeschen" + $ESLoeschenButton.Add_Click({ + Write-Host "Loeschen von " $ZielDatei.DateiName " mit i-Wert " $FaktorHoehe + Write-Host "ZielDateien vor Übergabe: " $ZielDateien + EinstellungsDateiAendern "Del" $FaktorHoehe $ZielDateien "" + }.GetNewClosure()) + $TabSeiteEigenschaften.Controls.Add($ESLoeschenButton) + + $ESSpeichernButton = New-Object System.Windows.Forms.Button + $ESSpeichernButton.Location = New-Object System.Drawing.Size(570,($BasisHoehe3+35*$FaktorHoehe)) + $ESSpeichernButton.Size = New-Object System.Drawing.Size(150,30) + $ESSpeichernButton.Text = "Aenderungen Speichern" + $ESSpeichernButton.Add_Click({ + Write-Host "Speichern von " $ZielDatei.DateiName " mit i-Wert " $FaktorHoehe + + if ($ESRadioButtonTIA.Checked) { + $WandlungsTyp = "TIA" + } + else { + $WandlungsTyp = "Simpel" + } + Write-Host "Wandlungstyp: " $WandlungsTyp + + $ZielDateiNeu = @([PSCustomObject]@{ + PrefixEingang = $ESTextfeldPrefixE.Text + PrefixAusgang = $ESTextfeldPrefixA.Text + DateiName = $ESTextfeldDateiName.Text + WandlungsTyp = $WandlungsTyp + }) + Write-Host "Neue ZielDatei vor Übergabe: " $ZielDateiNeu + EinstellungsDateiAendern "Upd" $FaktorHoehe $ZielDateien $ZielDateiNeu + }.GetNewClosure()) + $TabSeiteEigenschaften.Controls.Add($ESSpeichernButton) + + Write-Host "Counter i: " $FaktorHoehe + Write-Host "Wert Zieldatei: " $ZielDatei + #Write-Host "Ausgabe: " $(Get-Variable -Name ("ESTextFeldPrefixE" + $i + ".Location")).Value + + $FaktorHoehe++ + } + + + $Fenster.Add_Shown({$Fenster.Activate()}) + [void]$Fenster.ShowDialog() + + return +} + +#------------------- Funktion nur für das txt-GUI -------------------------- + +Function TXTReaktionReturn ($Pfad) +{ + if (PfadExistiert $Pfad) + { + # Gültiger Pfad oder .txt-Datei + $PfadEnde = $(Split-Path $Pfad -Leaf) + if ($($PfadEnde -match ".txt")) + { + #$Fenster.Dispose() + ZuVERSpringen + # Ist zwar sachlich gesehen unsinn, aber sonst funktioniert Return in der GUI nicht richtig + $TXTPfadFeld.Text = $Pfad + return + } + else + { + AnzeigeAktualisieren "txt" $Pfad + } + } + else + { + # Laufwerke aktualisieren oder ungültiger Pfad + AnzeigeAktualisieren "txt" "" + } + return +} + +#------------------- Funktion nur für das VerzeichnisWaehlen-GUI -------------------------- + + +# Führt $Pfad und $Auswahl zusammen und überprüft ob der daraus resultierte neue Pfad vorhanden ist. Falls dies der Fall ist wird in den Bereich der Fortschrittsanzeige gewechselt +Function VERAuswahlBestaetigt($Pfad, $Auswahl) +{ +$Pfad = Join-Path -Path $Pfad -ChildPath $Auswahl -Resolve + +if (PfadExistiert $Pfad) +{ + ZuFASpringen + $VERPfadfeld.Text = $Pfad + return +} +} + + +#------------------- Funktionen zum wechseln der Tabs -------------------------- + +Function ZuVERSpringen +{ + AnzeigeAktualisieren "ver" $TXTPfadFeld.Text + AufgabenAktualisieren "Zielverzeichnis auswaehlen" + Write-Host "Gewaehlte txt-Datei: " $TXTPfadFeld.Text + $TabBasis.SelectedIndex = 1 +} + +Function ZuFASpringen +{ + # Falls Einstellungen eingefügt werden: in dieser Funktion viel Todo + + AufgabenAktualisieren "Zieldateinamen erstellen" + Write-Host "Gewaehltes Verzeichnis: " $VERPfadFeld.Text + $TabBasis.SelectedIndex = 2 + + $PfadUrsprungsdatei = $TXTPfadFeld.Text + $PfadZielDateien = $VERPfadFeld.Text + $PfadDateiEA = ExcelDateiNameErstellen "EA" $PfadUrsprungsdatei $PfadZielDateien + $PfadDateiDIDQ = ExcelDateiNameErstellen "DIDQ" $PfadUrsprungsdatei $PfadZielDateien + + AufgabenAktualisieren "Neue Excel-Dateien erstellen" + ExcelDateiErstellen $PfadDateiEA + ExcelDateiErstellen $PfadDateiDIDQ + + AufgabenAktualisieren "Excel-Dateien mit Inhalten befuellen und Duplikate finden" + $AlleGleichenEA = ExcelDateiBeschreibenStandard $PfadUrsprungsdatei "E" "A" $PfadDateiEA + $AlleGleichenDIDQ = ExcelDateiBeschreibenSpezial $PfadUrsprungsdatei "%I" "%Q" $PfadDateiDIDQ + #Write-Host "Gleiche EA nach Rückgabe: " $AlleGleichenEA + $GleicheEingaenge = $AlleGleichenEA[0] + $GleicheAusgaenge = $AlleGleichenEA[1] + $Fehler = $AlleGleichenEA[2] + + Write-Host "Gleiche Eingaenge: " $GleicheEingaenge + Write-Host "Gleiche Ausgaenge: " $GleicheAusgaenge + Write-Host "Fehler: " $Fehler + + AufgabenAktualisieren "Ausgabe Duplikate" + ZuDPSpringen $GleicheEingaenge $GleicheAusgaenge $Fehler +} + +Function ZuDPSpringen ($GleicheEingaenge, $GleicheAusgaenge, $Fehler) +{ + foreach ($GleichenEingang in $GleicheEingaenge) { + $DPListeEingaenge.Rows.Add($($GleichenEingang.Zeile),($GleichenEingang.Name)) + } + + foreach ($GleichenAusgang in $GleicheAusgaenge) { + $DPListeAusgaenge.Rows.Add($($GleichenAusgang.Zeile),($GleichenAusgang.Name)) + } + + foreach ($Fehlen in $Fehler) { + $DPListeFehler.Rows.Add($($Fehlen.Zeile),($Fehlen.Name)) + } + + $TabBasis.SelectedIndex = 3 +} + +#------------------- Funktionen für alle GUIs -------------------------- + + +# Bekommt Pfad, stellt fest ob Laufwerke oder Ordner angezeigt werden müssen und aktualisiert entsprechend alles +# Um die Laufwerke anzuzeigen, muss der $Pfad = "" sein +Function AnzeigeAktualisieren ($AuswahlTyp, $Pfad) +{ +# Write-Host "Übergebener Pfad: " $Pfad + +# Sicherstellen, dass es das Verzeichnis gibt +if (PfadExistiert $Pfad) +{ + Write-Host "Ordner anzeigen" + $Optionen = Optionen $AuswahlTyp $Pfad +} +elseif ($Pfad.Length -eq 0) { + Write-Host "Laufwerke anzeigen" + $Optionen = LaufwerkeFinden + $Pfad = "" +} +else +{ + AnzeigeAktualisieren "" + return +} + +if ($($AuswahlTyp -eq "txt")) { + $TXTPfadFeld.Text = $Pfad + $TXTListeOrdnernamen.Items.Clear() + foreach ($Option in $Optionen) + { + if ($Option.Length -gt 0) + { + $TXTListeOrdnernamen.Items.Add($Option) + } + } +} +elseif ($($AuswahlTyp -eq "ver")) { + $VERPfadFeld.Text = $Pfad + $VERListeOrdnernamen.Items.Clear() + foreach ($Option in $Optionen) + { + if ($Option.Length -gt 0) + { + $VERListeOrdnernamen.Items.Add($Option) + } + } +} + +return +} + +Function VerzeichnisAuswaehlen ($AuswahlTyp, $Pfad, $Auswahl) +{ +if (PfadExistiert $Pfad) +{ + $Pfad = Join-Path -Path $Pfad -ChildPath $Auswahl -Resolve +} +elseif ($Pfad.Length -eq 0) { + #Wenn der Pfad die Länge 0 hat, wurde ein Laufwerk gewählt + $Pfad = $Auswahl +} +else { + #Fehlerfall/ ungültiger Pfad: zurück zu Laufwerken navigieren + $Pfad = "" +} + +# Erkennen, ob *.txt-Datei gewählt wurde -> ggf. Auswahl abgeschlossen +if ($($($Auswahl -match ".txt") -and $($AuswahlTyp -eq "txt"))) +{ + # Für den Gesamtfortschritt Anzahl Dateien auslesen + $Datei = Get-Content $Pfad + $FATextfeldGesamtEintraege.Text = 2 * $($Datei.Length) + + # Write-Host ".txt-Datei ausgewählt, Pfad: " $Pfad + # Write-Host "Dateityp: " $Pfad.GetType() + ZuVERSpringen + # Ist zwar sachlich gesehen unsinn, aber sonst funktioniert Return in der GUI nicht + $TXTPfadFeld.Text = $Pfad + return +} + +AnzeigeAktualisieren $AuswahlTyp $Pfad + +return +} + +Function VerzeichnisZurueck ($AuswahlTyp, $Pfad) +{ +if ($Pfad.Length -gt 3) +{ + # Weiter mit Ordnern + # Write-Host "Ordner anzeigen" + $Pfad = Split-Path $Pfad +} +elseif ($Pfad.Length -le 3) +{ + # Weiter mit Laufwerken + # Write-Host "Laufwerke anzeigen" + $Pfad = "" +} +else +{ + Write-Host "Fehler bei Verzeichnis zurueck" + # Fehler/ Nichts tun? + # Ermitteln: wann tritt dieser Fall ein? + $Pfad = "" +} +AnzeigeAktualisieren $AuswahlTyp $Pfad +return +} + +Function TastenReaktionPfadFeld($AuswahlTyp, $Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +if ($AuswahlTyp -eq "txt") { + switch ($Taste){ + "Return" { + # Write-Host "Enter gedrückt" + $Pfad = $TXTPfadFeld.Text + # Write-Host "Pfad: " $Pfad + + TXTReaktionReturn $Pfad + } + Default { + # Write-Host "Gedrückte Taste: " $Taste + } + } +} +elseif ($AuswahlTyp -eq "ver") { + switch ($Taste) { + "Return" { + $Pfad = $VERPfadFeld.Text + + AnzeigeAktualisieren "ver" $Pfad + } + # Entfernt, da man sonst im PfadFeld nicht groß schreiben kann! + <#"ShiftKey" { + $Pfad = $VERPfadFeld.Text + $Auswahl = $VERListeOrdnernamen.SelectedItem + + ReaktionShiftKey $Pfad $Auswahl + }#> + Default { + # Write-Host "Gedrückte Taste: " $Taste + } + } +} +return +} + +Function TastenReaktionListeOrdnernamen($AuswahlTyp, $Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +if ($AuswahlTyp -eq "txt"){ + switch ($Taste){ + "Return" { + # Write-Host "Enter gedrückt" + $Auswahl = $TXTListeOrdnernamen.SelectedItem + $Pfad = $TXTPfadFeld.Text + # Write-Host "Auswahl: " $Auswahl + # Write-Host "Pfad: " $Pfad + + VerzeichnisAuswaehlen $AuswahlTyp $Pfad $Auswahl + } + "Back" { + # Write-Host "Back gedrückt" + $Pfad = $TXTPfadFeld.Text + # Write-Host "Pfad: " $Pfad + + # Pfad aktualisieren + VerzeichnisZurueck $AuswahlTyp $Pfad + } + Default { + # Write-Host "Gedrückte Taste: " $Taste + } + } +} +elseif ($AuswahlTyp -eq "ver") { + switch ($Taste) { + "Return" { + $Auswahl = $VERListeOrdnernamen.SelectedItem + $Pfad = $VERPfadFeld.Text + VerzeichnisAuswaehlen $AuswahlTyp $Pfad $Auswahl + } + "Back" { + $Pfad = $VERPfadFeld.Text + VerzeichnisZurueck $AuswahlTyp $Pfad + } + "ShiftKey" { + $Pfad = $VERPfadFeld.Text + $Auswahl = $VERListeOrdnernamen.SelectedItem + ReaktionShiftKey $Pfad $Auswahl + } + Default { + # Write-Hoste "Gedrückte Taste: " $Taste + } + } +} + +return +} + +Function TastenReaktionButtons($AuswahlTyp, $Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +if ($AuswahlTyp -eq "txt") { + switch ($Taste){ + "Back" { + # Write-Host "Back gedrückt" + $Pfad = $TXTPfadFeld.Text + # Write-Host "Pfad: " $Pfad + + # Pfad aktualisieren + VerzeichnisZurueck $AuswahlTyp $Pfad + } + Default { + # Write-Host "Gedrückte Taste: " $Taste + } + } +} +elseif ($AuswahlTyp -eq "ver") { + switch ($Taste) { + "Back" { + $Pfad = $VERPfadFeld.Text + VerzeichnisZurueck $AuswahlTyp $Pfad + } + "ShiftKey" { + $Pfad = $VERPfadFeld.Text + $Auswahl = $VERListeOrdnernamen.SelectedItem + ReaktionShiftKey $Pfad $Auswahl + } + Default { + # Write-Host "Gedrückte Taste: " $Taste + } + } +} +return +} + +Function Optionen($AuswahlTyp, $Pfad) +{ +# Unterordner und .txt-Dateien finden +# Typzuweisung nötig, da aus unbekanntem Grund sonst Unterordner, die mit "_" beginnen, nicht gefunden werden können +[System.Object[]]$UnterOrdner = UnterOrdnerFinden $Pfad + +if ($AuswahlTyp -eq "txt") { + $TxtDateien = TxtDateienFinden $Pfad + #Gibt aktuell auch Index und Typ (System.IO.DirectoryInfo bzw. System.String) zurück + $Optionen = $UnterOrdner + $TxtDateien +} +elseif ($AuswahlTyp -eq "ver") { + #Gibt aktuell auch Index und Typ (System.IO.DirectoryInfo bzw. System.String) zurück + $Optionen = $UnterOrdner +} +return $Optionen +} + +Function PfadExistiert ($Pfad) +{ +# Um Abzufangen, dass Test-Path mit leerem Wert durchlaufen wird. Leere Verzeichnisse gelten als ungültig. +if ($Pfad.Length -eq 0) { + return $false +} +if ($(Test-Path $Pfad -PathType Container) -or $(Test-Path $Pfad -Include "*.txt")) +{ + # Write-Host "Bei dem Verzeichnis handelt es sich um eine *.txt-Datei oder ein gültiges Verzeichnis" + return $true +} +else +{ + # Write-Host "Das Verzeichnis existiert nicht oder es wurde keine *.txt-Datei gewählt" + return $false +} +} + +Function LaufwerkeFinden() +{ +$Laufwerke = $(Get-PSDrive | Where-Object {$_.Free}).Name +$i = 0 + +foreach($Laufwerk in $Laufwerke) +{ + $Laufwerke[$i] = $Laufwerk + ":\" + $i++ +} +return $Laufwerke +} + +Function UnterOrdnerFinden($Pfad) +{ +$UnterOrdner = $(Get-ChildItem $Pfad -Directory) + +if ($($UnterOrdner.Length -gt 0)) +{ + $Ordner = $(Split-Path $UnterOrdner -Leaf) +} +else { + $Ordner = "" +} + +return $Ordner +} + +Function TxtDateienFinden($Pfad) +{ +$TxtDateien = $(Get-Childitem $Pfad\*.txt) + +if ($TxtDateien.Length -gt 0) +{ + return $(Split-Path $TxtDateien -Leaf) +} +else +{ + return +} +} + +Function ReaktionShiftKey ($Pfad, $Auswahl) +{ + if (PfadExistiert $Pfad) + { + VERAuswahlBestaetigt $Pfad $Auswahl + } + else + { + AnzeigeAktualisieren "ver" "" + } + return +} + + +Function AufgabenAktualisieren ($Aufgabe) +{ + $FAListeErledigteAufgaben.Items.Add($FATextfeldAktuelleAufgabe.Text) + $FATextfeldAktuelleAufgabe.Text = $Aufgabe +} + +Function DateiBeschreibenAktualisieren +{ + $AnteilJeBeschriftung = 100 / $($FATextfeldGesamtEintraege.Text) + [System.double] $FATextfeldRealwertFortschrittsbar.Text += $AnteilJeBeschriftung + + #Da $FAFortschrittsbar.Value anscheinend ein int ist, ist der letzte Wert i. d. R. höher als 100 -> Fehler, der hiermit abgefangen wird + if ($([System.Double]$FATextfeldRealwertFortschrittsbar.Text) -ge 100) + { + $FAFortschrittsbar.Value = 100 + } + else + { + $FAFortschrittsbar.Value = $FATextfeldRealwertFortschrittsbar.Text + } + + + [System.Int64] $BearbeiteteEintraege = $FATextfeldBearbeiteteEintraege.Text + $BearbeiteteEintraege++ + $FATextfeldBearbeiteteEintraege.Text = $BearbeiteteEintraege +} + +#--------------------------------------- Start Funktionen für Einstellungen ------------------------------- + +Function AnzeigeEinstellungenAktualisieren () +{ + +} + +Function StartVerzeichnisAendern () +{ + $Explorer = New-Object System.Windows.Forms.FolderBrowserDialog + $Explorer.ShowDialog() + $Pfad = $Explorer.SelectedPath + Write-Host "Einstellungsdatei: " $PfadEinstellungsDatei + Write-Host "Pfad: " $Pfad + #$PfadEinstellungsDatei | Out-File -FilePath $PfadEinstellungsDatei + $DateiInhalt = Get-Content $PfadEinstellungsDatei + $DateiInhalt[0] = $Pfad + Clear-Content $PfadEinstellungsDatei + Add-Content $PfadEinstellungsDatei $DateiInhalt + + AnzeigeAktualisieren "txt" $Pfad + AnzeigeAktualisieren "ver" $Pfad + #AnzeigenEinstellungenAktualisieren +} + +Function EinstellungsDateiAendern($Art, $Eintrag, $ZielDateien, $ZielDatei) +{ + # Anpassen von $ZielDateien + switch ($Art) { + New { + Write-Host "[New] Alte ZielDateien: " $ZielDateien + $ZielDateien += $ZielDatei + + Write-Host "[New] Neue ZielDateien: " $ZielDateien + + # Felder leeren + # Todo: auslagern in AnzeigenEinstellungenAktualisieren. Soll auch gemacht werden, nachdem Einträge geloescht oder veraendert wurden! + $ESTextfeldPrefixENew.Text = "" + $ESTextfeldPrefixANew.Text = "" + $ESTextfeldDateiNameNew.Text = "" + $ESRadioButtonSimpelNew.Checked = $false + $ESRadioButtonTIANew.Checked = $false + } + Upd { + Write-Host "[Upd] Alte ZielDateien: " $ZielDateien + Write-Host "Einzufuegende Zieldatei: " $ZielDatei + + $ZielDateien[$Eintrag] = $ZielDatei + + Write-Host "[Upd] Neue ZielDateien: " $ZielDateien + } + Del { + Write-Host "[Del] Alte ZielDateien: " $ZielDateien ", Eintrag: " $Eintrag + + $i = 0 + foreach ($ZielDatei in $ZielDateien) { + if ($Eintrag -ne $i) { + $NeueZielDateien += $ZielDatei + } + $i++ + } + + Clear-Variable ZielDateien + $ZielDateien = $NeueZielDateien + Write-Host "[Del] Neue ZielDateien: " $ZielDateien + } + Default {} + } + + # Schreiben in Einstellungsdatei + $StartPfad = $(Get-Content $PfadEinstellungsDatei)[0] + Clear-Content $PfadEinstellungsDatei + Write-Host "StartPfad: " $StartPfad " Pfad Einstellungsdatei: " $PfadEinstellungsDatei + Add-Content $PfadEinstellungsDatei $StartPfad + foreach ($ZielDatei in $ZielDateien) { + Add-Content $PfadEinstellungsDatei $("Datei|" + $ZielDatei.PrefixEingang + "|" + $ZielDatei.PrefixAusgang + "|" + $ZielDatei.DateiName + "|" + $ZielDatei.WandlungsTyp) + } + + + # Anzeige in Einstellungen aktualisieren +} +#--------------------------------------- Ende Funktionen für GUI ------------------------------- + +Function ExcelDateiNameErstellen ($Prefix, $PfadUrsprungsdatei, $PfadZielDatei) +{ + $BasisNameZielDatei = Split-Path $PfadUrsprungsdatei -Leaf + $BasisNameZielDateiLaenge = $BasisNameZielDatei.Length + $BasisNameZielDateiKurz = $BasisNameZielDatei.Substring(0, $($BasisNameZielDateiLaenge - 4)) + $GesamtPfadZielDatei = $PfadZielDatei + "\" + $Prefix + "_" + $BasisNameZielDateiKurz + ".xlsx" + + return $GesamtPfadZielDatei +} + +Function ExcelDateiErstellen ($DateiPfad) +{ + $Datei = New-Object -ComObject Excel.Application + $Mappe = $Datei.Workbooks.Add() + $Mappe.SaveAs($DateiPfad) + $Datei.Quit() + + return +} + +Function ExcelDateiBeschreibenStandard ($PfadUrsprungsdatei, $PrefixEingang, $PrefixAusgang, $ZielDatei) +{ + $Datei = New-Object -ComObject Excel.Application + $Mappe = $Datei.Workbooks.Open($ZielDatei) + $Blatt = $Mappe.WorkSheets.item(1) + $Datei.Visible = $false + + $i = 1 + $Eingaenge = @() + $ZuEingang = @("DI", "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BJ", "BK", "BL", "BM", "BN", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", "FA", "FB", "FC", "FD", "FE", "FF", "FG", "FH", "FJ", "FK", "FL", "FM", "FN", "FP", "FQ", "FR", "FS", "FT", "FU", "FV", "FW", "FX", "FY", "FZ", "SA", "SB", "SC", "SD", "SE", "SF", "SG", "SH", "SJ", "SK", "SL", "SM", "SN", "SP", "SQ", "SR", "SS", "ST", "SU", "SV", "SW", "SX", "SY", "SZ") + $Ausgaenge = @() + $ZuAusgang = @("DQ", "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CJ", "CK", "CL", "CM", "CN", "CP", "CQ", "CR", "CS", "CT", "CU", "CV", "CW", "CX", "CY", "CZ", "EA", "EB", "EC", "ED", "EE", "EF", "EG", "EH", "EJ", "EK", "EL", "EM", "EN", "EP", "EQ", "ER", "ES", "ET", "EU", "EV", "EW", "EX", "EY", "EZ", "GA", "GB", "GC", "GD", "GE", "GF", "GG", "GH", "GJ", "GK", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GV", "GW", "GX", "GY", "GZ", "HA", "HB", "HC", "HD", "HE", "HF", "HG", "HH", "HJ", "HK", "HL", "HM", "HN", "HP", "HQ", "HR", "HS", "HT", "HU", "HV", "HW", "HX", "HY", "HZ", "KA", "KB", "KC", "KD", "KE", "KF", "KG", "KH", "KJ", "KK", "KL", "KM", "KN", "KP", "KQ", "KR", "KS", "KT", "KU", "KV", "KW", "KX", "KY", "KZ", "MA", "MB", "MC", "MD", "ME", "MF", "MG", "MH", "MJ", "MK", "ML", "MM", "MN", "MP", "MQ", "MR", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "PA", "PB", "PC", "PD", "PE", "PF", "PG", "PH", "PJ", "PK", "PL", "PM", "PN", "PP", "PQ", "PR", "PS", "PT", "PU", "PV", "PW", "PX", "PY", "PZ", "QA", "QB", "QC", "QD", "QE", "QF", "QG", "QH", "QJ", "QK", "QL", "QM", "QN", "QP", "QQ", "QR", "QS", "QT", "QU", "QV", "QW", "QX", "QY", "QZ", "RA", "RB", "RC", "RD", "RE", "RF", "RG", "RH", "RJ", "RK", "RL", "RM", "RN", "RP", "RQ", "RR", "RS", "RT", "RU", "RV", "RW", "RX", "RY", "RZ", "TA", "TB", "TC", "TD", "TE", "TF", "TG", "TH", "TJ", "TK", "TL", "TM", "TN", "TP", "TQ", "TR", "TS", "TT", "TU", "TV", "TW", "TX", "TY", "TZ") + $Fehler = @() + + $Ursprungdatei = Get-Content $PfadUrsprungsdatei + + foreach ($Eintrag in $Ursprungdatei) + { + $Eintragszeile = $Eintrag.Split("'") + $BMKZahl = $Eintragszeile[1] + $BMKZahl = $BMKZahl.TrimStart("'") + $Kommentar = $Eintragszeile[3] + $Kommentar = $Kommentar.TrimEnd("'") + + if ($($($BMKZahl.Substring(0,2)) -in $ZuEingang)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $PrefixEingang + $BMKZahl + $Eingaenge += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + elseif ($($($BMKZahl.Substring(0,2)) -in $ZuAusgang)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $PrefixAusgang + $BMKZahl + $Ausgaenge += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + else + { + Write-Host "Achtung, Fehler bei " $BMKZahl $Kommentar + $Fehler += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + + # Write-Host "In Excel schreiben: BMKZahl: " $BMKZahl " Kommentar: " $Kommentar + $Blatt.Cells.Item($i,1) = $BMKZahl + $Blatt.Cells.Item($i,2) = $Kommentar + + $i++ + + DateiBeschreibenAktualisieren + } + + $Mappe.Save() + $Datei.Quit() + + $GleicheEingaenge = GleicheFinden $Eingaenge + $GleicheAusgaenge = GleicheFinden $Ausgaenge + Write-Host "Gleiche fuer " $PrefixEingang ": " $GleicheEingaenge + Write-Host "Gleiche fuer " $PrefixAusgang ": " $GleicheAusgaenge + Write-Host "Fehler bei: " $Fehler + + if ( $($Fehler.Length -eq 0)) + { + $Fehler += @([PSCustomObject]@{ + Name = "Keine" + Zeile = "Alle" + }) + } + + return $GleicheEingaenge, $GleicheAusgaenge, $Fehler +} + +Function ExcelDateiBeschreibenSpezial ($PfadUrsprungsdatei, $PrefixEingang, $PrefixAusgang, $ZielDatei) +{ + $Datei = New-Object -ComObject Excel.Application + $Mappe = $Datei.Workbooks.Open($ZielDatei) + $Blatt = $Mappe.WorkSheets.item(1) + $Datei.Visible = $false + + $i = 2 + $Eingaenge = @() + $ZuEingang = @("DI", "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BJ", "BK", "BL", "BM", "BN", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", "FA", "FB", "FC", "FD", "FE", "FF", "FG", "FH", "FJ", "FK", "FL", "FM", "FN", "FP", "FQ", "FR", "FS", "FT", "FU", "FV", "FW", "FX", "FY", "FZ", "SA", "SB", "SC", "SD", "SE", "SF", "SG", "SH", "SJ", "SK", "SL", "SM", "SN", "SP", "SQ", "SR", "SS", "ST", "SU", "SV", "SW", "SX", "SY", "SZ") + $Ausgaenge = @() + $ZuAusgang = @("DQ", "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CJ", "CK", "CL", "CM", "CN", "CP", "CQ", "CR", "CS", "CT", "CU", "CV", "CW", "CX", "CY", "CZ", "EA", "EB", "EC", "ED", "EE", "EF", "EG", "EH", "EJ", "EK", "EL", "EM", "EN", "EP", "EQ", "ER", "ES", "ET", "EU", "EV", "EW", "EX", "EY", "EZ", "GA", "GB", "GC", "GD", "GE", "GF", "GG", "GH", "GJ", "GK", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GV", "GW", "GX", "GY", "GZ", "HA", "HB", "HC", "HD", "HE", "HF", "HG", "HH", "HJ", "HK", "HL", "HM", "HN", "HP", "HQ", "HR", "HS", "HT", "HU", "HV", "HW", "HX", "HY", "HZ", "KA", "KB", "KC", "KD", "KE", "KF", "KG", "KH", "KJ", "KK", "KL", "KM", "KN", "KP", "KQ", "KR", "KS", "KT", "KU", "KV", "KW", "KX", "KY", "KZ", "MA", "MB", "MC", "MD", "ME", "MF", "MG", "MH", "MJ", "MK", "ML", "MM", "MN", "MP", "MQ", "MR", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "PA", "PB", "PC", "PD", "PE", "PF", "PG", "PH", "PJ", "PK", "PL", "PM", "PN", "PP", "PQ", "PR", "PS", "PT", "PU", "PV", "PW", "PX", "PY", "PZ", "QA", "QB", "QC", "QD", "QE", "QF", "QG", "QH", "QJ", "QK", "QL", "QM", "QN", "QP", "QQ", "QR", "QS", "QT", "QU", "QV", "QW", "QX", "QY", "QZ", "RA", "RB", "RC", "RD", "RE", "RF", "RG", "RH", "RJ", "RK", "RL", "RM", "RN", "RP", "RQ", "RR", "RS", "RT", "RU", "RV", "RW", "RX", "RY", "RZ", "TA", "TB", "TC", "TD", "TE", "TF", "TG", "TH", "TJ", "TK", "TL", "TM", "TN", "TP", "TQ", "TR", "TS", "TT", "TU", "TV", "TW", "TX", "TY", "TZ") + $Fehler = @() + + $Blatt.Cells.Item(1,1) = "Name" + $Blatt.Cells.Item(1,2) = "Path" + $Blatt.Cells.Item(1,3) = "Data Type" + $Blatt.Cells.Item(1,4) = "Logical Address" + $Blatt.Cells.Item(1,5) = "Comment" + $Blatt.Cells.Item(1,6) = "Hmi Visible" + $Blatt.Cells.Item(1,7) = "Hmi Accessible" + $Blatt.Cells.Item(1,8) = "Hmi Writeable" + $Blatt.Cells.Item(1,9) = "Typeobject ID" + $Blatt.Cells.Item(1,10) = "Version ID" + + $Ursprungdatei = Get-Content $PfadUrsprungsdatei + + foreach ($Eintrag in $Ursprungdatei) + { + $Eintragszeile = $Eintrag.Split("'") + $BMKZahl = $Eintragszeile[1] + $BMKZahl = $BMKZahl.TrimStart("'") + $Kommentar = $Eintragszeile[3] + $Kommentar = $Kommentar.TrimEnd("'") + + if ($($($BMKZahl.Substring(0,2)) -in $ZuEingang)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $PrefixEingang + $BMKZahl + $Eingaenge += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + elseif ($($($BMKZahl.Substring(0,2)) -in $ZuAusgang)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $PrefixAusgang + $BMKZahl + $Ausgaenge += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + else + { + Write-Host "Achtung, Fehler bei " $BMKZahl $Kommentar + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $Fehler += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + + #Write-Host "In Excel schreiben: BMKZahl: " $BMKZahl " Kommentar: " $Kommentar + $Blatt.Cells.Item($i,1) = $Kommentar #Name + $Blatt.Cells.Item($i,2) = "Standard-Variablentabelle" #Path + $Blatt.Cells.Item($i,3) = "Bool" #Data Type + $Blatt.Cells.Item($i,4) = $BMKZahl #Logical Address + #$Blatt.Cells.Item($i,5) = "" #Comment + $Blatt.Cells.Item($i,6) = "'True" #Hmi Visible + $Blatt.Cells.Item($i,7) = "'True" #Hmi Accessible + $Blatt.Cells.Item($i,8) = "'True" #Hmi Writeable + #$Blatt.Cells.Item($i,9) = "" #Typeobject ID + #$Blatt.Cells.Item($i,10) = "" #Version ID + + + $i++ + + DateiBeschreibenAktualisieren + } + + $Mappe.Save() + $Datei.Quit() + + $GleicheEingaenge = GleicheFinden $Eingaenge + $GleicheAusgaenge = GleicheFinden $Ausgaenge + Write-Host "Gleiche fuer " $PrefixEingang ": " $GleicheEingaenge + Write-Host "Gleiche fuer " $PrefixAusgang ": " $GleicheAusgaenge + Write-Host "Fehler bei: " $Fehler + + if ( $($Fehler.Length -eq 0)) + { + $Fehler += @([PSCustomObject]@{ + Name = "Keine" + Zeile = "Alle" + }) + } + + return $GleicheEingaenge, $GleicheAusgaenge, $Fehler +} + +Function GleicheFinden ($ZuUeberpruefen) +{ + $ZuUeberpruefen = $ZuUeberpruefen | Sort-Object "Name" + $Gleiche = @() + for ($i = 0; $i -lt $($ZuUeberpruefen.Count - 1); $i++) + { + $IstGleich = $($ZuUeberpruefen[$i].Name -eq $ZuUeberpruefen[$($i+1)].Name) + if ($IstGleich) + { + # Eintrag hinzufügen + if (-not $($Gleiche[-1].Zeile -eq $ZuUeberpruefen[$i].Zeile)) + { + $Gleiche += $ZuUeberpruefen[$i] + } + $Gleiche += $ZuUeberpruefen[$($i+1)] + #Write-Host "Gleiche: " $Gleiche + } + } + + if ( $($Gleiche.Length -eq 0)) + { + $Gleiche += @([PSCustomObject]@{ + Name = "Keine" + Zeile = "Alle" + }) + } + + return $Gleiche +} + + +Main \ No newline at end of file diff --git a/Test-Skripte/GUI-Angepasst5.ps1 b/Test-Skripte/GUI-Angepasst5.ps1 new file mode 100644 index 0000000..4c488d5 --- /dev/null +++ b/Test-Skripte/GUI-Angepasst5.ps1 @@ -0,0 +1,1604 @@ +Function Main +{ + Write-Host "Programmstart" + + $ZielDateien = EinstellungsDateiVorhanden + Write-Host "Zieldateien in Main: " $ZielDateien + + $StartPfad = StartPfadHolen + + GUI $StartPfad $ZielDateien + +} + + + +Function GUI ($StartPfad, $ZielDateien) +{ + [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") + [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") + + # Eigenschaften Fenster + $Fenster = New-Object System.Windows.Forms.Form + $Fenster.Size = New-Object System.Drawing.Size(940,660) #Breite, Höhe + $Fenster.StartPosition = "CenterScreen" + $Fenster.KeyPreview = $true # was macht das? + $Fenster.MaximumSize = $Fenster.Size # legt fest, dass Größe des Fensters nicht verändert werden kann + $Fenster.MinimumSize = $Fenster.Size + $Fenster.Text = "Dateikonvertierer txt zu xlsx" + + # Eigenschaften Tabs + $TabBasis = New-Object System.Windows.Forms.TabControl + $TabBasis.Location = New-Object System.Drawing.Size(10,10) + $TabBasis.Size = New-Object System.Drawing.Size(900,600) + $TabBasis.DataBindings.DefaultDataSourceUpdateMode = 0 # Was macht das? + $Fenster.Controls.Add($TabBasis) + + # Tab: TXT-Pfad auswaehlen + $TabSeiteTXTAuswaehlen = New-Object System.Windows.Forms.TabPage + $TabSeiteTXTAuswaehlen.TabIndex = 0 + $TabSeiteTXTAuswaehlen.UseVisualStyleBackColor = $true + $TabSeiteTXTAuswaehlen.Text = "txt-Datei Auswaehlen" + #Paddings + $TabSeiteTXTAuswaehlen.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteTXTAuswaehlen) + + # TXTPfadFeld + $TXTPfadFeld = New-Object System.Windows.Forms.TextBox + $TXTPfadFeld.Location = New-Object System.Drawing.Size(10,10) + $TXTPfadFeld.Size = New-Object System.Drawing.Size(860,20) + $TXTPfadFeld.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionPfadFeld "txt" $Taste + }) + $TabSeiteTXTAuswaehlen.Controls.Add($TXTPfadFeld) + + # TXTListeOrdnernamen + $TXTListeOrdnernamen = New-Object System.Windows.Forms.ListBox + $TXTListeOrdnernamen.Location = New-Object System.Drawing.Size(10,40) + $TXTListeOrdnernamen.Size = New-Object System.Drawing.Size(860,20) + $TXTListeOrdnernamen.Height = 450 + $TXTListeOrdnernamen.Font = New-Object System.Drawing.Font("Arial",12,[System.Drawing.FontStyle]::Regular) + $TXTListeOrdnernamen.Add_DoubleClick({ + # Variablen bestimmen zur Übergabe + $Auswahl = $TXTListeOrdnernamen.SelectedItem + $Pfad = $TXTPfadFeld.Text + # Write-Host "Gewählter Ordner/ Datei: " $Auswahl + # Write-Host "Vorheriger Pfad: " $TXTPfad + + # Pfad aktualisieren + VerzeichnisAuswaehlen "txt" $Pfad $Auswahl + }) + $TXTListeOrdnernamen.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionListeOrdnernamen "txt" $Taste + }) + $TabSeiteTXTAuswaehlen.Controls.Add($TXTListeOrdnernamen) + + # ZurückButton + $TXTZurueckButton = New-Object System.Windows.Forms.Button + $TXTZurueckButton.Location = New-Object System.Drawing.Size(10,500) + $TXTZurueckButton.Size = New-Object System.Drawing.Size(100,30) + $TXTZurueckButton.Text = "Zurueck" + $TXTZurueckButton.Add_Click({ + # Write-Host "Pfad ausgabe: " $TXTPfadFeld.Text + $Pfad = $TXTPfadFeld.Text + + #Pfad aktualisieren + VerzeichnisZurueck "txt" $Pfad + }) + $TXTZurueckButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionButtons "txt" $Taste + }) + $TabSeiteTXTAuswaehlen.Controls.Add($TXTZurueckButton) + + # AuswaehlenButton + $TXTAuswaehlenButton = New-Object System.Windows.Forms.Button + $TXTAuswaehlenButton.Location = New-Object System.Drawing.Size(750,500) + $TXTAuswaehlenButton.Size = New-Object System.Drawing.Size(100,30) + $TXTAuswaehlenButton.Text = "Auswaehlen" + $TXTAuswaehlenButton.Add_Click({ + # Variablen bestimmen zur Übergabe + $Auswahl = $TXTListeOrdnernamen.SelectedItem + $Pfad= $TXTPfadFeld.Text + # Write-Host "Gewählter Ordner/ Datei: " $Auswahl + # Write-Host "Vorheriger Pfad: " $TXTPfad + + # Pfad aktualisieren + VerzeichnisAuswaehlen "txt" $Pfad $Auswahl + }) + $TXTAuswaehlenButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionButtons "txt" $Taste + }) + $TabSeiteTXTAuswaehlen.Controls.Add($TXTAuswaehlenButton) + + $A = AnzeigeAktualisieren "txt" $StartPfad # Ohne dem Aufruf kann kein Startverzeichnis übergeben werden. Wird der Aufruf keiner Variable zugewiesen verursacht dies Fehler bei der Rückgabe. + + #$TXTDatei = $TXTPfadFeld.Text + + # Tab: Zielverzeichnis auswaehlen + $TabSeiteZielVerzeichnisAuswaehlen = New-Object System.Windows.Forms.TabPage + $TabSeiteZielVerzeichnisAuswaehlen.TabIndex = 1 + $TabSeiteZielVerzeichnisAuswaehlen.UseVisualStyleBackColor = $true + $TabSeiteZielVerzeichnisAuswaehlen.Text = "Zielverzeichnis Auswaehlen" + #Paddings + $TabSeiteZielVerzeichnisAuswaehlen.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteZielVerzeichnisAuswaehlen) + + # PfadFeld + $VERPfadFeld = New-Object System.Windows.Forms.TextBox + $VERPfadFeld.Location = New-Object System.Drawing.Size(10,10) + $VERPfadFeld.Size = New-Object System.Drawing.Size(860,20) + $VERPfadFeld.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionPfadFeld "ver" $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERPfadFeld) + + # ListeOrdnernamen + $VERListeOrdnernamen = New-Object System.Windows.Forms.ListBox + $VERListeOrdnernamen.Location = New-Object System.Drawing.Size(10,40) + $VERListeOrdnernamen.Size = New-Object System.Drawing.Size(860,20) + $VERListeOrdnernamen.Height = 450 + $VERListeOrdnernamen.Font = New-Object System.Drawing.Font("Arial",12,[System.Drawing.FontStyle]::Regular) + $VERListeOrdnernamen.Add_DoubleClick({ + # Variablen bestimmen zur Übergabe + $Auswahl = $VERListeOrdnernamen.SelectedItem + $Pfad = $VERPfadFeld.Text + # Write-Host "Gewählter Ordner/ Datei: " $Auswahl + # Write-Host "Vorheriger Pfad: " $VERPfad + + # Pfad aktualisieren + VerzeichnisAuswaehlen "ver" $Pfad $Auswahl + }) + $VERListeOrdnernamen.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionListeOrdnernamen "ver" $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERListeOrdnernamen) + + # ZurückButton + $VERZurueckButton = New-Object System.Windows.Forms.Button + $VERZurueckButton.Location = New-Object System.Drawing.Size(10,500) + $VERZurueckButton.Size = New-Object System.Drawing.Size(100,30) + $VERZurueckButton.Text = "Zurueck" + $VERZurueckButton.Add_Click({ + # Write-Host "Pfad ausgabe: " $VERPfadFeld.Text + $Pfad = $VERPfadFeld.Text + + #Pfad aktualisieren + VerzeichnisZurueck "ver" $Pfad + }) + $VERZurueckButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionButtons "ver" $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERZurueckButton) + + # AuswaehlenButton + $VERAuswaehlenButton = New-Object System.Windows.Forms.Button + $VERAuswaehlenButton.Location = New-Object System.Drawing.Size(630,500) + $VERAuswaehlenButton.Size = New-Object System.Drawing.Size(100,30) + $VERAuswaehlenButton.Text = "Auswaehlen" + $VERAuswaehlenButton.Add_Click({ + # Variablen bestimmen zur Übergabe + $Auswahl = $VERListeOrdnernamen.SelectedItem + $Pfad = $VERPfadFeld.Text + # Write-Host "Gewählter Ordner/ Datei: " $Auswahl + # Write-Host "Vorheriger Pfad: " $VERPfad + + if ($($VERListeOrdnernamen.Items[0] -eq "")) + { + VERAuswahlBestaetigt $Pfad $Auswahl + } + else + { + # Pfad aktualisieren + VerzeichnisAuswaehlen "ver" $Pfad $Auswahl + } + }) + $VERAuswaehlenButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionButtons "ver" $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERAuswaehlenButton) + + # BestaetigenButton + $VERBestaetigenButton = New-Object System.Windows.Forms.Button + $VERBestaetigenButton.Location = New-Object System.Drawing.Size(750,500) + $VERBestaetigenButton.Size = New-Object System.Drawing.Size(100,30) + $VERBestaetigenButton.Text = "Bestaetigen" + $VERBestaetigenButton.Add_Click({ + $Auswahl = $VERListeOrdnernamen.SelectedItem + $Pfad = $VERPfadFeld.Text + + VERAuswahlBestaetigt $Pfad $Auswahl + }) + $VERBestaetigenButton.Add_KeyDown({ + # Reaktion bei gedrückter Taste + $Taste = $_.KeyCode + TastenReaktionButtons "ver" $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERBestaetigenButton) + + # Dieser Funktionsaufruf zerstört die Rückgabe, wenn er keiner Variable zugewiesen wird + #$A = AnzeigeAktualisieren "ver" $TXTPfadFeld.Text + + #$ZielVerzeichnis = $VERPfadFeld.Text + + # Tab: Ausgabe Fortschritt + $TabSeiteFortschrittsanzeige = New-Object System.Windows.Forms.TabPage + $TabSeiteFortschrittsanzeige.TabIndex = 2 + $TabSeiteFortschrittsanzeige.UseVisualStyleBackColor = $true + $TabSeiteFortschrittsanzeige.Text = "Bearbeitungsfortschritt" + #Paddings + $TabSeiteFortschrittsanzeige.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteFortschrittsanzeige) + + $FATextfeld1 = New-Object System.Windows.Forms.Label + $FATextfeld1.Location = New-Object System.Drawing.Size(10,10) + $FATextfeld1.Size = New-Object System.Drawing.Size(200,20) + $FATextfeld1.Text = "Aktuelle Aufgabe" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld1) + + $FATextfeld2 = New-Object System.Windows.Forms.Label + $FATextfeld2.Location = New-Object System.Drawing.Size(300,10) + $FATextfeld2.Size = New-Object System.Drawing.Size(430,20) + $FATextfeld2.Text = "Erledigte Aufgaben" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld2) + + $FATextfeldAktuelleAufgabe = New-Object System.Windows.Forms.Label + $FATextfeldAktuelleAufgabe.Location = New-Object System.Drawing.Size(10,40) + $FATextfeldAktuelleAufgabe.Size = New-Object System.Drawing.Size(280,60) + $FATextfeldAktuelleAufgabe.Text = "txt-Datei auswaehlen" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeldAktuelleAufgabe) + + $FAListeErledigteAufgaben = New-Object System.Windows.Forms.ListBox + $FAListeErledigteAufgaben.Location = New-Object System.Drawing.Size(300,40) + $FAListeErledigteAufgaben.Size = New-Object System.Drawing.Size(430,20) + $FAListeErledigteAufgaben.Height = 150 + $FAListeErledigteAufgaben.Font = New-Object System.Drawing.Font("Arial",12,[System.Drawing.FontStyle]::Regular) + $TabSeiteFortschrittsanzeige.Controls.Add($FAListeErledigteAufgaben) + + $FATextfeld3 = New-Object System.Windows.Forms.Label + $FATextfeld3.Location = New-Object System.Drawing.Size(10,100) + $FATextfeld3.Size = New-Object System.Drawing.Size(430,20) + $FATextfeld3.Text = "Fortschritt Excel-Dateien beschreiben" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld3) + + $FAFortschrittsbar = New-Object System.Windows.Forms.ProgressBar + $FAFortschrittsbar.Location = New-Object System.Drawing.Size(10,120) + $FAFortschrittsbar.Size = New-Object System.Drawing.Size(260,30) + #$FAFortschrittsbar.Name = "Fortschrittsanzeige" + $FAFortschrittsbar.Value = 0 + $TabSeiteFortschrittsanzeige.Controls.Add($FAFortschrittsbar) + + $FATextfeldRealwertFortschrittsbar = New-Object System.Windows.Forms.Label # Wird verwendet, aber VSC erkennt das nicht + + $FATextfeld4 = New-Object System.Windows.Forms.Label + $FATextfeld4.Location = New-Object System.Drawing.Size(10,170) + $FATextfeld4.Size = New-Object System.Drawing.Size(140,20) + $FATextfeld4.Text = "Bearbeitete Eintraege:" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld4) + + $FATextfeld5 = New-Object System.Windows.Forms.Label + $FATextfeld5.Location = New-Object System.Drawing.Size(10,200) + $FATextfeld5.Size = New-Object System.Drawing.Size(100,20) + $FATextfeld5.Text = "Gesamteintraege:" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld5) + + $FATextfeldBearbeiteteEintraege = New-Object System.Windows.Forms.Label + $FATextfeldBearbeiteteEintraege.Location = New-Object System.Drawing.Size(170,170) + $FATextfeldBearbeiteteEintraege.Size = New-Object System.Drawing.Size(430,20) + $FATextfeldBearbeiteteEintraege.Text = "0" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeldBearbeiteteEintraege) + + $FATextfeldGesamtEintraege = New-Object System.Windows.Forms.Label + $FATextfeldGesamtEintraege.Location = New-Object System.Drawing.Size(170,200) + $FATextfeldGesamtEintraege.Size = New-Object System.Drawing.Size(430,20) + $FATextfeldGesamtEintraege.Text = $($Ursprungdatei.Length) + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeldGesamtEintraege) + + # Tab: Ausgabe doppelte Ein- und Ausgänge sowie nicht zurordnebare Betriebsmittel + $TabSeiteDuplikate = New-Object System.Windows.Forms.TabPage + $TabSeiteDuplikate.TabIndex = 3 + $TabSeiteDuplikate.UseVisualStyleBackColor = $true + $TabSeiteDuplikate.Text = "Doppelte Ein- und Ausgaenge" + #Paddings + $TabSeiteDuplikate.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteDuplikate) + + $DPTextfeld1 = New-Object System.Windows.Forms.Label + $DPTextfeld1.Location = New-Object System.Drawing.Size(10,10) + $DPTextfeld1.Size = New-Object System.Drawing.Size(275,40) + $DPTextfeld1.Text = "Bei den Eingaengen gibt es folgende Duplikate: " + $TabSeiteDuplikate.Controls.Add($DPTextfeld1) + + $DPListeEingaenge = New-Object System.Windows.Forms.DataGridView + $DPListeEingaenge.Location = New-Object System.Drawing.Size(10,60) + $DPListeEingaenge.Size = New-Object System.Drawing.Size(275,20) + $DPListeEingaenge.Height = 430 + $DPListeEingaenge.ColumnCount = 2 + $DPListeEingaenge.ColumnHeadersVisible = $true + $DPListeEingaenge.Columns[0].Name = "Zeile" + $DPListeEingaenge.Columns[1].Name = "Kennzeichnung" + $TabSeiteDuplikate.Controls.Add($DPListeEingaenge) + + $DPTextfeld2 = New-Object System.Windows.Forms.Label + $DPTextfeld2.Location = New-Object System.Drawing.Size(295,10) + $DPTextfeld2.Size = New-Object System.Drawing.Size(275,40) + $DPTextfeld2.Text = "Bei den Ausgaengen gibt es folgende Duplikate: " + $TabSeiteDuplikate.Controls.Add($DPTextfeld2) + + $DPListeAusgaenge = New-Object System.Windows.Forms.DataGridView + $DPListeAusgaenge.Location = New-Object System.Drawing.Size(295,60) + $DPListeAusgaenge.Size = New-Object System.Drawing.Size(275,20) + $DPListeAusgaenge.Height = 430 + $DPListeAusgaenge.ColumnCount = 2 + $DPListeAusgaenge.ColumnHeadersVisible = $true + $DPListeAusgaenge.Columns[0].Name = "Zeile" + $DPListeAusgaenge.Columns[1].Name = "Kennzeichnung" + $TabSeiteDuplikate.Controls.Add($DPListeAusgaenge) + + $DPTextfeld3 = New-Object System.Windows.Forms.Label + $DPTextfeld3.Location = New-Object System.Drawing.Size(580,10) + $DPTextfeld3.Size = New-Object System.Drawing.Size(275,40) + $DPTextfeld3.Text = "Folgende Eintraege konnten keinem Betriebsmittel zugewiesen werden:" + $TabSeiteDuplikate.Controls.Add($DPTextfeld3) + + $DPListeFehler = New-Object System.Windows.Forms.DataGridView + $DPListeFehler.Location = New-Object System.Drawing.Size(580,60) + $DPListeFehler.Size = New-Object System.Drawing.Size(275,20) + $DPListeFehler.Height = 430 + $DPListeFehler.ColumnCount = 2 + $DPListeFehler.ColumnHeadersVisible = $true + $DPListeFehler.Columns[0].Name = "Zeile" + $DPListeFehler.Columns[1].Name = "Kennzeichnung" + $TabSeiteDuplikate.Controls.Add($DPListeFehler) + + $DPBestaetigenButton = New-Object System.Windows.Forms.Button + $DPBestaetigenButton.Location = New-Object System.Drawing.Size(10,500) + $DPBestaetigenButton.Size = New-Object System.Drawing.Size(860,30) + $DPBestaetigenButton.Text = "Programm beenden" + $DPBestaetigenButton.Add_Click({ + $Fenster.Dispose() + return + }) + $TabSeiteDuplikate.Controls.Add($DPBestaetigenButton) + + # Tab: Einstellungen + $TabSeiteEigenschaften = New-Object System.Windows.Forms.TabPage + $TabSeiteEigenschaften.TabIndex = 0 + $TabSeiteEigenschaften.UseVisualStyleBackColor = $true + $TabSeiteEigenschaften.Text = "Einstellungen" + #Paddings + $TabSeiteEigenschaften.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteEigenschaften) + + $BasisHoehe1 = 80 #80 + $BasisHoehe2 = $BasisHoehe1 + 20 #100 + $BasisHoehe2x = $BasisHoehe2 + 30 #130 + $BasisHoehe3 = $BasisHoehe2 + 65 #165 + + $BasisBreite1 = 10 #10 + $BasisBreite2 = $BasisBreite1 + 70 #80 + $BasisBreite3 = $BasisBreite2 + 60 #140 + $BasisBreite4 = $BasisBreite3 + 210 #350 + $BasisBreite5 = $BasisBreite4 + 55 #405 + + + $ESTextfeld1 = New-Object System.Windows.Forms.Label + $ESTextfeld1.Location = New-Object System.Drawing.Size($BasisBreite1,10) + $ESTextfeld1.Size = New-Object System.Drawing.Size(180,20) + $ESTextfeld1.Text = "Startverzeichnis Navigation:" + $TabSeiteEigenschaften.Controls.Add($ESTextfeld1) + + $ESTextfeldStartPfad = New-Object System.Windows.Forms.Label + $ESTextfeldStartPfad.Location = New-Object System.Drawing.Size(($BasisBreite1+180),10) + $ESTextfeldStartPfad.Size = New-Object System.Drawing.Size(530,20) + #$ESTextfeldStartPfad.Text = "$StartPfad" + $TabSeiteEigenschaften.Controls.Add($ESTextfeldStartPfad) + + $ESAendernButton = New-Object System.Windows.Forms.Button + $ESAendernButton.Location = New-Object System.Drawing.Size(730,10) + $ESAendernButton.Size = New-Object System.Drawing.Size(150,30) + $ESAendernButton.Text = "Aendern" + $ESAendernButton.Add_Click({ + StartVerzeichnisAendern + }) + $TabSeiteEigenschaften.Controls.Add($ESAendernButton) + + $ESTrollButton = New-Object System.Windows.Forms.Button + $ESTrollButton.Location = New-Object System.Drawing.Size(730,50) + $ESTrollButton.Size = New-Object System.Drawing.Size(150,50) + $ESTrollButton.Text = "Dinge entfernen" + $ESTrollButton.Add_Click({ + $TabSeiteEigenschaften.Controls.Remove($ESTextBoxPrefixE) + }) + $TabSeiteEigenschaften.Controls.Add($ESTrollButton) + +#------------------- Tabelle mit ZielDateien + + $ESTextfeld2 = New-Object System.Windows.Forms.Label + $ESTextfeld2.Location = New-Object System.Drawing.Size($BasisBreite1,50) + $ESTextfeld2.Size = New-Object System.Drawing.Size(200,20) + $ESTextfeld2.Text = "Zieldateien:" + $TabSeiteEigenschaften.Controls.Add($ESTextfeld2) + + $ESTextfeld3 = New-Object System.Windows.Forms.Label + $ESTextfeld3.Location = New-Object System.Drawing.Size(($BasisBreite1+30),$BasisHoehe1) + $ESTextfeld3.Size = New-Object System.Drawing.Size(80,20) + $ESTextfeld3.Text = "Prefix für" + $TabSeiteEigenschaften.Controls.Add($ESTextfeld3) + + $ESTextfeld4 = New-Object System.Windows.Forms.Label + $ESTextfeld4.Location = New-Object System.Drawing.Size($BasisBreite1,$BasisHoehe2) + $ESTextfeld4.Size = New-Object System.Drawing.Size(50,20) + $ESTextfeld4.Text = "Eingang" + $TabSeiteEigenschaften.Controls.Add($ESTextfeld4) + + $ESTextfeld5 = New-Object System.Windows.Forms.Label + $ESTextfeld5.Location = New-Object System.Drawing.Size(($BasisBreite2-5),$BasisHoehe2) + $ESTextfeld5.Size = New-Object System.Drawing.Size(55,20) + $ESTextfeld5.Text = "Ausgang" + $TabSeiteEigenschaften.Controls.Add($ESTextfeld5) + + $ESTextfeld6 = New-Object System.Windows.Forms.Label + $ESTextfeld6.Location = New-Object System.Drawing.Size($BasisBreite3,$BasisHoehe1) + $ESTextfeld6.Size = New-Object System.Drawing.Size(150,40) + $ESTextfeld6.Text = "Dateiname" + $TabSeiteEigenschaften.Controls.Add($ESTextfeld6) + + $ESTextfeld7 = New-Object System.Windows.Forms.Label + $ESTextfeld7.Location = New-Object System.Drawing.Size($BasisBreite4,$BasisHoehe1) + $ESTextfeld7.Size = New-Object System.Drawing.Size(110,20) + $ESTextfeld7.Text = "Konvertierungsart" + $TabSeiteEigenschaften.Controls.Add($ESTextfeld7) + + $ESTextfeld8 = New-Object System.Windows.Forms.Label + $ESTextfeld8.Location = New-Object System.Drawing.Size($BasisBreite4,$BasisHoehe2) + $ESTextfeld8.Size = New-Object System.Drawing.Size(50,20) + $ESTextfeld8.Text = "Simpel" + $TabSeiteEigenschaften.Controls.Add($ESTextfeld8) + + $ESTextfeld9 = New-Object System.Windows.Forms.Label + $ESTextfeld9.Location = New-Object System.Drawing.Size($BasisBreite5,$BasisHoehe2) + $ESTextfeld9.Size = New-Object System.Drawing.Size(50,20) + $ESTextfeld9.Text = "TIA" + $TabSeiteEigenschaften.Controls.Add($ESTextfeld9) + +#--------------------------- Eintrag hinzufuegen Elemente + + $ESTextBoxPrefixENew = New-Object System.Windows.Forms.TextBox + $ESTextBoxPrefixENew.Location = New-Object System.Drawing.Size($BasisBreite1,$Basishoehe2x) + $ESTextBoxPrefixENew.Size = New-Object System.Drawing.Size(40,20) + $ESTextBoxPrefixENew.Name = "ESTextfeldENew" + $ESTextBoxPrefixENew.Add_Click({ + Write-Host "Ausgabe bei ESTextfeldENew" + }.GetNewClosure()) + $TabSeiteEigenschaften.Controls.Add($ESTextBoxPrefixENew) + + $ESTextBoxPrefixANew = New-Object System.Windows.Forms.TextBox + $ESTextBoxPrefixANew.Location = New-Object System.Drawing.Size($BasisBreite2,$Basishoehe2x) + $ESTextBoxPrefixANew.Size = New-Object System.Drawing.Size(40,20) + $ESTextBoxPrefixANew.Name = "ESTextfeldANew" + $ESTextBoxPrefixANew.Add_Click({ + Write-Host "Ausgabe bei Button ESTextfeldANew" + }.GetNewClosure()) + $TabSeiteEigenschaften.Controls.Add($ESTextBoxPrefixANew) + + $ESTextfeldDateiNameNew = New-Object System.Windows.Forms.TextBox + $ESTextfeldDateiNameNew.Location = New-Object System.Drawing.Size($BasisBreite3,$Basishoehe2x) + $ESTextfeldDateiNameNew.Size = New-Object System.Drawing.Size(200,20) + $ESTextfeldDateiNameNew.Name = "ESTextfeldDateiNameNew" + $ESTextfeldDateiNameNew.Add_Click({ + Write-Host "Ausgabe bei Button ESTextfeldDateiNameNew" + }.GetNewClosure()) + $TabSeiteEigenschaften.Controls.Add($ESTextfeldDateiNameNew) + + $ESRadioButtonSimpelNew = New-Object System.Windows.Forms.RadioButton + $ESRadioButtonSimpelNew.Location = New-Object System.Drawing.Size(15,10) + $ESRadioButtonSimpelNew.Size = New-Object System.Drawing.Size(17,17) + $ESRadioButtonSimpelNew.Name = "ESRadioButtonSimpelNew" + + $ESRadioButtonTIANew = New-Object System.Windows.Forms.RadioButton + $ESRadioButtonTIANew.Location = New-Object System.Drawing.Size(60,10) + $ESRadioButtonTIANew.Size = New-Object System.Drawing.Size(17,17) + $ESRadioButtonTIANew.Name = "ESRadioButtonTIANew" + + $ESGroupBoxRadioButtonsNew = New-Object System.Windows.Forms.GroupBox + $ESGroupBoxRadioButtonsNew.Location = New-Object System.Drawing.Size($BasisBreite4,($BasisHoehe2x-5)) + $ESGroupBoxRadioButtonsNew.Size = New-Object System.Drawing.Size(85,30) + $ESGroupBoxRadioButtonsNew.Controls.Add($ESRadioButtonSimpelNew) + $ESGroupBoxRadioButtonsNew.Controls.Add($ESRadioButtonTIANew) + $TabSeiteEigenschaften.Controls.Add($ESGroupBoxRadioButtonsNew) + + $ESHinzufuegenButton = New-Object System.Windows.Forms.Button + $ESHinzufuegenButton.Location = New-Object System.Drawing.Size(730,$BasisHoehe2x) + $ESHinzufuegenButton.Size = New-Object System.Drawing.Size(150,30) + $ESHinzufuegenButton.Text = "Eintrag hinzufuegen" + $ESHinzufuegenButton.Add_Click({ + Write-Host "Eintrag hinzufuegen" + + if ($ESRadioButtonTIANew.Checked) { + $WandlungsTyp = "TIA" + } + else { + $WandlungsTyp = "Simpel" + } + Write-Host "WandlungsTyp: " $WandlungsTyp + + $NeueZielDatei = @([PSCustomObject]@{ + PrefixEingang = $ESTextBoxPrefixENew.Text + PrefixAusgang = $ESTextBoxPrefixANew.Text + DateiName = $ESTextfeldDateiNameNew.Text + WandlungsTyp = $WandlungsTyp + }) + EinstellungsDateiAendern "New" $FaktorHoehe $ZielDateien $NeueZielDatei + }) + $TabSeiteEigenschaften.Controls.Add($ESHinzufuegenButton) + + # Wird benoetigt, um die Anzahl der Eintraege der dynamisch erstellten Variablen zu speichern + $ESAnzahlEintraegeTextfeld = New-Object System.Windows.Forms.Label + + AnzeigeEinstellungenAktualisieren + + $Fenster.Add_Shown({$Fenster.Activate()}) + [void]$Fenster.ShowDialog() + + return +} + +#------------------- Funktion nur für das txt-GUI -------------------------- + +Function TXTReaktionReturn ($Pfad) +{ + if (PfadExistiert $Pfad) + { + # Gültiger Pfad oder .txt-Datei + $PfadEnde = $(Split-Path $Pfad -Leaf) + if ($($PfadEnde -match ".txt")) + { + #$Fenster.Dispose() + ZuVERSpringen + # Ist zwar sachlich gesehen unsinn, aber sonst funktioniert Return in der GUI nicht richtig + $TXTPfadFeld.Text = $Pfad + return + } + else + { + AnzeigeAktualisieren "txt" $Pfad + } + } + else + { + # Laufwerke aktualisieren oder ungültiger Pfad + AnzeigeAktualisieren "txt" "" + } + return +} + +#------------------- Funktion nur für das VerzeichnisWaehlen-GUI -------------------------- + + +# Führt $Pfad und $Auswahl zusammen und überprüft ob der daraus resultierte neue Pfad vorhanden ist. Falls dies der Fall ist wird in den Bereich der Fortschrittsanzeige gewechselt +Function VERAuswahlBestaetigt($Pfad, $Auswahl) +{ +$Pfad = Join-Path -Path $Pfad -ChildPath $Auswahl -Resolve + +if (PfadExistiert $Pfad) +{ + ZuFASpringen + $VERPfadfeld.Text = $Pfad + return +} +} + + +#------------------- Funktionen zum wechseln der Tabs -------------------------- + +Function ZuVERSpringen +{ + AnzeigeAktualisieren "ver" $TXTPfadFeld.Text + AufgabenAktualisieren "Zielverzeichnis auswaehlen" + Write-Host "Gewaehlte txt-Datei: " $TXTPfadFeld.Text + $TabBasis.SelectedIndex = 1 +} + +Function ZuFASpringen +{ + # Falls Einstellungen eingefügt werden: in dieser Funktion viel Todo + + AufgabenAktualisieren "Zieldateinamen erstellen" + Write-Host "Gewaehltes Verzeichnis: " $VERPfadFeld.Text + $TabBasis.SelectedIndex = 2 + + $PfadUrsprungsdatei = $TXTPfadFeld.Text + $PfadZielDateien = $VERPfadFeld.Text + $PfadDateiEA = ExcelDateiNameErstellen "EA" $PfadUrsprungsdatei $PfadZielDateien + $PfadDateiDIDQ = ExcelDateiNameErstellen "DIDQ" $PfadUrsprungsdatei $PfadZielDateien + + AufgabenAktualisieren "Neue Excel-Dateien erstellen" + ExcelDateiErstellen $PfadDateiEA + ExcelDateiErstellen $PfadDateiDIDQ + + AufgabenAktualisieren "Excel-Dateien mit Inhalten befuellen und Duplikate finden" + $AlleGleichenEA = ExcelDateiBeschreibenStandard $PfadUrsprungsdatei "E" "A" $PfadDateiEA + $AlleGleichenDIDQ = ExcelDateiBeschreibenSpezial $PfadUrsprungsdatei "%I" "%Q" $PfadDateiDIDQ + #Write-Host "Gleiche EA nach Rückgabe: " $AlleGleichenEA + $GleicheEingaenge = $AlleGleichenEA[0] + $GleicheAusgaenge = $AlleGleichenEA[1] + $Fehler = $AlleGleichenEA[2] + + Write-Host "Gleiche Eingaenge: " $GleicheEingaenge + Write-Host "Gleiche Ausgaenge: " $GleicheAusgaenge + Write-Host "Fehler: " $Fehler + + AufgabenAktualisieren "Ausgabe Duplikate" + ZuDPSpringen $GleicheEingaenge $GleicheAusgaenge $Fehler +} + +Function ZuDPSpringen ($GleicheEingaenge, $GleicheAusgaenge, $Fehler) +{ + foreach ($GleichenEingang in $GleicheEingaenge) { + $DPListeEingaenge.Rows.Add($($GleichenEingang.Zeile),($GleichenEingang.Name)) + } + + foreach ($GleichenAusgang in $GleicheAusgaenge) { + $DPListeAusgaenge.Rows.Add($($GleichenAusgang.Zeile),($GleichenAusgang.Name)) + } + + foreach ($Fehlen in $Fehler) { + $DPListeFehler.Rows.Add($($Fehlen.Zeile),($Fehlen.Name)) + } + + $TabBasis.SelectedIndex = 3 +} + +#------------------- Funktionen für alle GUIs -------------------------- + + +# Bekommt Pfad, stellt fest ob Laufwerke oder Ordner angezeigt werden müssen und aktualisiert entsprechend alles +# Um die Laufwerke anzuzeigen, muss der $Pfad = "" sein +Function AnzeigeAktualisieren ($AuswahlTyp, $Pfad) +{ +# Write-Host "Übergebener Pfad: " $Pfad + +# Sicherstellen, dass es das Verzeichnis gibt +if (PfadExistiert $Pfad) +{ + Write-Host "Ordner anzeigen" + $Optionen = Optionen $AuswahlTyp $Pfad +} +elseif ($Pfad.Length -eq 0) { + Write-Host "Laufwerke anzeigen" + $Optionen = LaufwerkeFinden + $Pfad = "" +} +else +{ + AnzeigeAktualisieren "" + return +} + +if ($($AuswahlTyp -eq "txt")) { + $TXTPfadFeld.Text = $Pfad + $TXTListeOrdnernamen.Items.Clear() + foreach ($Option in $Optionen) + { + if ($Option.Length -gt 0) + { + $TXTListeOrdnernamen.Items.Add($Option) + } + } +} +elseif ($($AuswahlTyp -eq "ver")) { + $VERPfadFeld.Text = $Pfad + $VERListeOrdnernamen.Items.Clear() + foreach ($Option in $Optionen) + { + if ($Option.Length -gt 0) + { + $VERListeOrdnernamen.Items.Add($Option) + } + } +} + +return +} + +Function VerzeichnisAuswaehlen ($AuswahlTyp, $Pfad, $Auswahl) +{ +if (PfadExistiert $Pfad) +{ + $Pfad = Join-Path -Path $Pfad -ChildPath $Auswahl -Resolve +} +elseif ($Pfad.Length -eq 0) { + #Wenn der Pfad die Länge 0 hat, wurde ein Laufwerk gewählt + $Pfad = $Auswahl +} +else { + #Fehlerfall/ ungültiger Pfad: zurück zu Laufwerken navigieren + $Pfad = "" +} + +# Erkennen, ob *.txt-Datei gewählt wurde -> ggf. Auswahl abgeschlossen +if ($($($Auswahl -match ".txt") -and $($AuswahlTyp -eq "txt"))) +{ + # Für den Gesamtfortschritt Anzahl Dateien auslesen + $Datei = Get-Content $Pfad + $FATextfeldGesamtEintraege.Text = 2 * $($Datei.Length) + + # Write-Host ".txt-Datei ausgewählt, Pfad: " $Pfad + # Write-Host "Dateityp: " $Pfad.GetType() + ZuVERSpringen + # Ist zwar sachlich gesehen unsinn, aber sonst funktioniert Return in der GUI nicht + $TXTPfadFeld.Text = $Pfad + return +} + +AnzeigeAktualisieren $AuswahlTyp $Pfad + +return +} + +Function VerzeichnisZurueck ($AuswahlTyp, $Pfad) +{ +if ($Pfad.Length -gt 3) +{ + # Weiter mit Ordnern + # Write-Host "Ordner anzeigen" + $Pfad = Split-Path $Pfad +} +elseif ($Pfad.Length -le 3) +{ + # Weiter mit Laufwerken + # Write-Host "Laufwerke anzeigen" + $Pfad = "" +} +else +{ + Write-Host "Fehler bei Verzeichnis zurueck" + # Fehler/ Nichts tun? + # Ermitteln: wann tritt dieser Fall ein? + $Pfad = "" +} +AnzeigeAktualisieren $AuswahlTyp $Pfad +return +} + +Function TastenReaktionPfadFeld($AuswahlTyp, $Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +if ($AuswahlTyp -eq "txt") { + switch ($Taste){ + "Return" { + # Write-Host "Enter gedrückt" + $Pfad = $TXTPfadFeld.Text + # Write-Host "Pfad: " $Pfad + + TXTReaktionReturn $Pfad + } + Default { + # Write-Host "Gedrückte Taste: " $Taste + } + } +} +elseif ($AuswahlTyp -eq "ver") { + switch ($Taste) { + "Return" { + $Pfad = $VERPfadFeld.Text + + AnzeigeAktualisieren "ver" $Pfad + } + # Entfernt, da man sonst im PfadFeld nicht groß schreiben kann! + <#"ShiftKey" { + $Pfad = $VERPfadFeld.Text + $Auswahl = $VERListeOrdnernamen.SelectedItem + + ReaktionShiftKey $Pfad $Auswahl + }#> + Default { + # Write-Host "Gedrückte Taste: " $Taste + } + } +} +return +} + +Function TastenReaktionListeOrdnernamen($AuswahlTyp, $Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +if ($AuswahlTyp -eq "txt"){ + switch ($Taste){ + "Return" { + # Write-Host "Enter gedrückt" + $Auswahl = $TXTListeOrdnernamen.SelectedItem + $Pfad = $TXTPfadFeld.Text + # Write-Host "Auswahl: " $Auswahl + # Write-Host "Pfad: " $Pfad + + VerzeichnisAuswaehlen $AuswahlTyp $Pfad $Auswahl + } + "Back" { + # Write-Host "Back gedrückt" + $Pfad = $TXTPfadFeld.Text + # Write-Host "Pfad: " $Pfad + + # Pfad aktualisieren + VerzeichnisZurueck $AuswahlTyp $Pfad + } + Default { + # Write-Host "Gedrückte Taste: " $Taste + } + } +} +elseif ($AuswahlTyp -eq "ver") { + switch ($Taste) { + "Return" { + $Auswahl = $VERListeOrdnernamen.SelectedItem + $Pfad = $VERPfadFeld.Text + VerzeichnisAuswaehlen $AuswahlTyp $Pfad $Auswahl + } + "Back" { + $Pfad = $VERPfadFeld.Text + VerzeichnisZurueck $AuswahlTyp $Pfad + } + "ShiftKey" { + $Pfad = $VERPfadFeld.Text + $Auswahl = $VERListeOrdnernamen.SelectedItem + ReaktionShiftKey $Pfad $Auswahl + } + Default { + # Write-Hoste "Gedrückte Taste: " $Taste + } + } +} + +return +} + +Function TastenReaktionButtons($AuswahlTyp, $Taste) +{ +# Write-Host "Übergebene Taste: " $Taste +if ($AuswahlTyp -eq "txt") { + switch ($Taste){ + "Back" { + # Write-Host "Back gedrückt" + $Pfad = $TXTPfadFeld.Text + # Write-Host "Pfad: " $Pfad + + # Pfad aktualisieren + VerzeichnisZurueck $AuswahlTyp $Pfad + } + Default { + # Write-Host "Gedrückte Taste: " $Taste + } + } +} +elseif ($AuswahlTyp -eq "ver") { + switch ($Taste) { + "Back" { + $Pfad = $VERPfadFeld.Text + VerzeichnisZurueck $AuswahlTyp $Pfad + } + "ShiftKey" { + $Pfad = $VERPfadFeld.Text + $Auswahl = $VERListeOrdnernamen.SelectedItem + ReaktionShiftKey $Pfad $Auswahl + } + Default { + # Write-Host "Gedrückte Taste: " $Taste + } + } +} +return +} + +Function Optionen($AuswahlTyp, $Pfad) +{ +# Unterordner und .txt-Dateien finden +# Typzuweisung nötig, da aus unbekanntem Grund sonst Unterordner, die mit "_" beginnen, nicht gefunden werden können +[System.Object[]]$UnterOrdner = UnterOrdnerFinden $Pfad + +if ($AuswahlTyp -eq "txt") { + $TxtDateien = TxtDateienFinden $Pfad + #Gibt aktuell auch Index und Typ (System.IO.DirectoryInfo bzw. System.String) zurück + $Optionen = $UnterOrdner + $TxtDateien +} +elseif ($AuswahlTyp -eq "ver") { + #Gibt aktuell auch Index und Typ (System.IO.DirectoryInfo bzw. System.String) zurück + $Optionen = $UnterOrdner +} +return $Optionen +} + +Function PfadExistiert ($Pfad) +{ +# Um Abzufangen, dass Test-Path mit leerem Wert durchlaufen wird. Leere Verzeichnisse gelten als ungültig. +if ($Pfad.Length -eq 0) { + return $false +} +if ($(Test-Path $Pfad -PathType Container) -or $(Test-Path $Pfad -Include "*.txt")) +{ + # Write-Host "Bei dem Verzeichnis handelt es sich um eine *.txt-Datei oder ein gültiges Verzeichnis" + return $true +} +else +{ + # Write-Host "Das Verzeichnis existiert nicht oder es wurde keine *.txt-Datei gewählt" + return $false +} +} + +Function LaufwerkeFinden() +{ +$Laufwerke = $(Get-PSDrive | Where-Object {$_.Free}).Name +$i = 0 + +foreach($Laufwerk in $Laufwerke) +{ + $Laufwerke[$i] = $Laufwerk + ":\" + $i++ +} +return $Laufwerke +} + +Function UnterOrdnerFinden($Pfad) +{ +$UnterOrdner = $(Get-ChildItem $Pfad -Directory) + +if ($($UnterOrdner.Length -gt 0)) +{ + $Ordner = $(Split-Path $UnterOrdner -Leaf) +} +else { + $Ordner = "" +} + +return $Ordner +} + +Function TxtDateienFinden($Pfad) +{ +$TxtDateien = $(Get-Childitem $Pfad\*.txt) + +if ($TxtDateien.Length -gt 0) +{ + return $(Split-Path $TxtDateien -Leaf) +} +else +{ + return +} +} + +Function ReaktionShiftKey ($Pfad, $Auswahl) +{ + if (PfadExistiert $Pfad) + { + VERAuswahlBestaetigt $Pfad $Auswahl + } + else + { + AnzeigeAktualisieren "ver" "" + } + return +} + + +Function AufgabenAktualisieren ($Aufgabe) +{ + $FAListeErledigteAufgaben.Items.Add($FATextfeldAktuelleAufgabe.Text) + $FATextfeldAktuelleAufgabe.Text = $Aufgabe +} + +Function DateiBeschreibenAktualisieren +{ + $AnteilJeBeschriftung = 100 / $($FATextfeldGesamtEintraege.Text) + [System.double] $FATextfeldRealwertFortschrittsbar.Text += $AnteilJeBeschriftung + + #Da $FAFortschrittsbar.Value anscheinend ein int ist, ist der letzte Wert i. d. R. höher als 100 -> Fehler, der hiermit abgefangen wird + if ($([System.Double]$FATextfeldRealwertFortschrittsbar.Text) -ge 100) + { + $FAFortschrittsbar.Value = 100 + } + else + { + $FAFortschrittsbar.Value = $FATextfeldRealwertFortschrittsbar.Text + } + + + [System.Int64] $BearbeiteteEintraege = $FATextfeldBearbeiteteEintraege.Text + $BearbeiteteEintraege++ + $FATextfeldBearbeiteteEintraege.Text = $BearbeiteteEintraege +} + +#--------------------------------------- Start Funktionen für Einstellungen ------------------------------- + +Function PfadEinstellungsDateiHolen () { + # Könnte man eigentlich in einer Zeile machen, PS macht da aber Probleme + $AktuellesVerzeichnis = Get-Location + $PfadEinstellungsDatei = $("$AktuellesVerzeichnis\" + "EinstellungenSkriptKonvertierung.txt") + Write-Host "Pfad Einstellungsdatei: " $PfadEinstellungsDatei + return $PfadEinstellungsDatei +} + +Function StartPfadHolen () { + # Evtl. aendern um gegen Probleme abzusichern: "Pfad|" oder "StartPfad|" vor den Pfad schreiben und danach suchen. Falls es kein Ergebnis gibt, einfuegen. Ausserdem waere dann die Reihenfolge egal. + $PfadEinstellungsDatei = PfadEinstellungsDateiHolen + $EinstellungsInhalte = Get-Content $PfadEinstellungsDatei + $StartPfad = $EinstellungsInhalte[0] + return $StartPfad +} + +Function ZielDateienHolen () { + $PfadEinstellungsDatei = PfadEinstellungsDateiHolen + $EinstellungsInhalte = Get-Content $PfadEinstellungsDatei + foreach ($EinstellungsZeile in $EinstellungsInhalte) { + $EinstellungsInhalt = $EinstellungsZeile.Split("|") + if ($EinstellungsInhalt[0] -eq "Datei") { + $ZielDateien += @([PSCustomObject]@{ + PrefixEingang = $EinstellungsInhalt[1] + PrefixAusgang = $EinstellungsInhalt[2] + DateiName = $EinstellungsInhalt[3] + WandlungsTyp = $EinstellungsInhalt[4] + }) + } + } + + return $ZielDateien +} + +Function EinstellungsDateiVorhanden () { + $PfadEinstellungsDatei = PfadEinstellungsDateiHolen + + if (Test-Path $PfadEinstellungsDatei) { + #Es gibt eine Datei mit den Einstellungen -> auslesen + #Todo: Checken, ob Inhalte plausibel sind -> ggf. neue mit Standardwerten erstellen! + + $ZielDateien = ZielDateienHolen + } + else { + #Es gibt keine Datei mit den Einstellungen -> erstellen + #Todo: Umbauen: Eintraege via EinstellungsDateiAendern hinzufuegen!!! + + # Mögliches Problem mit der Funktion "StartVerzeichnisAendern". Überprüfen! + + New-Item $PfadEinstellungsDatei -ItemType File + + $StartPfad = Get-Location + + $ZielDateien = @([PSCustomObject]@{ + PrefixEingang = "E" + PrefixAusgang = "A" + DateiName = "EA_[Ursprungsdatei]" + WandlungsTyp = "Simpel" + }) + $ZielDateien += @([PSCustomObject]@{ + PrefixEingang = "%I" + PrefixAusgang = "%Q" + DateiName = "DIDQ_[Ursprungsdatei]" + WandlungsTyp = "TIA" + }) + + Add-Content $PfadEinstellungsDatei $($StartPfad) + Add-Content $PfadEinstellungsDatei $("Datei|" + $ZielDateien[0].PrefixEingang + "|" + $ZielDateien[0].PrefixAusgang + "|" + $ZielDateien[0].DateiName + "|" + $ZielDateien[0].WandlungsTyp) + Add-Content $PfadEinstellungsDatei $("Datei|" + $ZielDateien[1].PrefixEingang + "|" + $ZielDateien[1].PrefixAusgang + "|" + $ZielDateien[1].DateiName + "|" + $ZielDateien[1].WandlungsTyp) + } + return $ZielDateien +} + +Function AnzeigeEinstellungenAktualisieren () +{ + # Neue Werte sollen nicht übergeben werden, sondern aus der Einstellungsdatei ausgelesen werden, um Fehler zu vermeiden. + # Einzige Voraussetzung: es muss eine Einstellungsdatei geben! + + $PfadEinstellungsDatei = PfadEinstellungsDateiHolen + #Write-Host "Ansicht Einstellungen aktualisieren mit dem Verzeichnis: " $PfadEinstellungsDatei + + # Entfernen der vorher erstellten Einträge + + $AnzahlAlteEintraege = $ESAnzahlEintraegeTextfeld.Text + Write-Host "Anzahl ermittelter Eintraege -1: " $AnzahlAlteEintraege + + #Abfangen: falls es keine Eintrage gibt, wird dennoch in die Schleife gesprungen, da $AnzahlAlteEintraege dennoch 0 ist. In diesem Fall neue Eintraege erstellen? + for ($i = 0; $i -le $AnzahlAlteEintraege; $i++) { + $TextBoxEExistiert = Test-Path Variable:\ESTextBoxPrefixE + Write-Host "Text Box E existiert: " $TextBoxEExistiert + $TabSeiteEigenschaften.Controls.Remove($ESTextBoxPrefixE) + $TabSeiteEigenschaften.Controls.Remove($ESTextBoxPrefixA) + $TabSeiteEigenschaften.Controls.Remove($ESTextfeldDateiName) + $TabSeiteEigenschaften.Controls.Remove($ESRadioButtonSimpel) + $TabSeiteEigenschaften.Controls.Remove($ESRadioButtonTIA) + $TabSeiteEigenschaften.Controls.Remove($ESGroupBoxRadioButtons) + $TabSeiteEigenschaften.Controls.Remove($ESLoeschenButton) + $TabSeiteEigenschaften.Controls.Remove($ESSpeichernButton) + } + + # Erstellen der neuen Einträge + + $EinstellungsInhalte = Get-Content $PfadEinstellungsDatei + + $StartPfad = $EinstellungsInhalte[0] + foreach ($EinstellungsZeile in $EinstellungsInhalte) { + $EinstellungsBestandteile = $EinstellungsZeile.Split("|") + if ($EinstellungsBestandteile[0] -eq "Datei") { + $ZielDateien += @([PSCustomObject]@{ + PrefixEingang = $EinstellungsBestandteile[1] + PrefixAusgang = $EinstellungsBestandteile[2] + DateiName = $EinstellungsBestandteile[3] + WandlungsTyp = $EinstellungsBestandteile[4] + }) + } + } + + + $BasisHoehe1 = 80 #80 + $BasisHoehe2 = $BasisHoehe1 + 20 #100 + $BasisHoehe2x = $BasisHoehe2 + 30 #130 + $BasisHoehe3 = $BasisHoehe2 + 65 #165 + + $BasisBreite1 = 10 #10 + $BasisBreite2 = $BasisBreite1 + 70 #80 + $BasisBreite3 = $BasisBreite2 + 60 #140 + $BasisBreite4 = $BasisBreite3 + 210 #350 + $BasisBreite5 = $BasisBreite4 + 55 #405 + + + $ESTextfeldStartPfad.Text = $StartPfad + + $ESTextBoxPrefixENew.Text = "" + $ESTextBoxPrefixANew.Text = "" + $ESTextfeldDateiNameNew.Text = "" + $ESRadioButtonSimpelNew.Checked = $false + $ESRadioButtonTIANew.Checked = $false + + Write-Host "Alle ZielDateien: " $ZielDateien + $FaktorHoehe = 0 + foreach ($ZielDatei in $ZielDateien) { + + # Problem bei diesem Ansatz: $FaktorHoehe wird nicht durch den Zahlenwert ersetzt +<# ${ESSpezial$FaktorHoehe} = New-Object System.Windows.Forms.TextBox + ${ESSpezial$FaktorHoehe}.Location = New-Object System.Drawing.Size(20,400) + $TabSeiteEigenschaften.Controls.Add(${ESSpezial$FaktorHoehe}) #> + + # Anderer Ansatz: Alles in {}.getNewClosure() schreiben. Funktioniert nicht, weil dabei alles innerhalb der {} als Text ausgegeben wird. + + $ESTextBoxPrefixE = New-Object System.Windows.Forms.TextBox + $ESTextBoxPrefixE.Location = New-Object System.Drawing.Size($BasisBreite1,($BasisHoehe3+35*$FaktorHoehe)) + $ESTextBoxPrefixE.Size = New-Object System.Drawing.Size(40,20) + $ESTextBoxPrefixE.Text = $ZielDatei.PrefixEingang + $ESTextBoxPrefixE.Name = "ESTextBoxPrefixE" + $ESTextBoxPrefixE.Add_Click({ + Write-Host "Mein Name ist " $ESTextBoxPrefixE.Name + }.GetNewClosure()) + $TabSeiteEigenschaften.Controls.Add($ESTextBoxPrefixE) + + $ESTextBoxPrefixA = New-Object System.Windows.Forms.TextBox + $ESTextBoxPrefixA.Location = New-Object System.Drawing.Size($BasisBreite2,($BasisHoehe3+35*$FaktorHoehe)) + $ESTextBoxPrefixA.Size = New-Object System.Drawing.Size(40,20) + $ESTextBoxPrefixA.Text = $ZielDatei.PrefixAusgang + $ESTextBoxPrefixA.Name = "ESTextfeldA$FaktorHoehe" + $ESTextBoxPrefixA.Add_Click({ + + }.GetNewClosure()) + $TabSeiteEigenschaften.Controls.Add($ESTextBoxPrefixA) + + $ESTextfeldDateiName = New-Object System.Windows.Forms.TextBox + $ESTextfeldDateiName.Location = New-Object System.Drawing.Size($BasisBreite3,($BasisHoehe3+35*$FaktorHoehe)) + $ESTextfeldDateiName.Size = New-Object System.Drawing.Size(200,20) + $ESTextfeldDateiName.Text = $ZielDatei.DateiName + $ESTextfeldDateiName.Name = "ESTextfeldDateiName$FaktorHoehe" + $ESTextfeldDateiName.Add_Click({ + + }.GetNewClosure()) + $TabSeiteEigenschaften.Controls.Add($ESTextfeldDateiName) + + $ESRadioButtonSimpel = New-Object System.Windows.Forms.RadioButton + $ESRadioButtonSimpel.Location = New-Object System.Drawing.Size(15,10) + $ESRadioButtonSimpel.Size = New-Object System.Drawing.Size(17,17) + $ESRadioButtonSimpel.Name = "ESRadioButtonSimpel$FaktorHoehe" + + $ESRadioButtonTIA = New-Object System.Windows.Forms.RadioButton + $ESRadioButtonTIA.Location = New-Object System.Drawing.Size(60,10) + $ESRadioButtonTIA.Size = New-Object System.Drawing.Size(17,17) + $ESRadioButtonTIA.Name = "ESRadioButtonTIA$FaktorHoehe" + + $ESGroupBoxRadioButtons = New-Object System.Windows.Forms.GroupBox + $ESGroupBoxRadioButtons.Location = New-Object System.Drawing.Size($BasisBreite4,($BasisHoehe3-5+35*$FaktorHoehe)) + $ESGroupBoxRadioButtons.Size = New-Object System.Drawing.Size(85,30) + $ESGroupBoxRadioButtons.Controls.Add($ESRadioButtonSimpel) + $ESGroupBoxRadioButtons.Controls.Add($ESRadioButtonTIA) + $TabSeiteEigenschaften.Controls.Add($ESGroupBoxRadioButtons) + + if ($ZielDatei.WandlungsTyp -eq "TIA") { + $ESRadioButtonTIA.Checked = $true + } + else { + $ESRadioButtonSimpel.Checked = $true + } + + $ESLoeschenButton = New-Object System.Windows.Forms.Button + $ESLoeschenButton.Location = New-Object System.Drawing.Size(730,($BasisHoehe3+35*$FaktorHoehe)) + $ESLoeschenButton.Size = New-Object System.Drawing.Size(150,30) + $ESLoeschenButton.Text = "Loeschen" + $ESLoeschenButton.Add_Click({ + Write-Host "Loeschen von " $ZielDatei.DateiName " mit i-Wert " $FaktorHoehe + Write-Host "ZielDateien vor Übergabe: " $ZielDateien + # Todo: Falls es dadurch keine zu erstellenden Eintraege mehr gibt, entweder loeschen verhindern oder neue Eintraege erstellen + EinstellungsDateiAendern "Del" $FaktorHoehe $ZielDateien "" + }.GetNewClosure()) + $TabSeiteEigenschaften.Controls.Add($ESLoeschenButton) + + $ESSpeichernButton = New-Object System.Windows.Forms.Button + $ESSpeichernButton.Location = New-Object System.Drawing.Size(570,($BasisHoehe3+35*$FaktorHoehe)) + $ESSpeichernButton.Size = New-Object System.Drawing.Size(150,30) + $ESSpeichernButton.Text = "Aenderungen Speichern" + $ESSpeichernButton.Add_Click({ + Write-Host "Speichern von " $ZielDatei.DateiName " mit i-Wert " $FaktorHoehe + + if ($ESRadioButtonTIA.Checked) { + $WandlungsTyp = "TIA" + } + else { + $WandlungsTyp = "Simpel" + } + Write-Host "Wandlungstyp: " $WandlungsTyp + + $ZielDateiNeu = @([PSCustomObject]@{ + PrefixEingang = $ESTextBoxPrefixE.Text + PrefixAusgang = $ESTextBoxPrefixA.Text + DateiName = $ESTextfeldDateiName.Text + WandlungsTyp = $WandlungsTyp + }) + Write-Host "Neue ZielDatei vor Übergabe: " $ZielDateiNeu + EinstellungsDateiAendern "Upd" $FaktorHoehe $ZielDateien $ZielDateiNeu + }.GetNewClosure()) + $TabSeiteEigenschaften.Controls.Add($ESSpeichernButton) + + Write-Host "Counter i: " $FaktorHoehe + Write-Host "Wert Zieldatei: " $ZielDatei + + $ESAnzahlEintraegeTextfeld.Text = $FaktorHoehe + + $FaktorHoehe++ + } +} + +Function StartVerzeichnisAendern () +{ + $Explorer = New-Object System.Windows.Forms.FolderBrowserDialog + $Explorer.ShowDialog() + $Pfad = $Explorer.SelectedPath + Write-Host "Einstellungsdatei: " $PfadEinstellungsDatei + Write-Host "Pfad: " $Pfad + #$PfadEinstellungsDatei | Out-File -FilePath $PfadEinstellungsDatei + $DateiInhalt = Get-Content $PfadEinstellungsDatei + $DateiInhalt[0] = $Pfad + Clear-Content $PfadEinstellungsDatei + Add-Content $PfadEinstellungsDatei $DateiInhalt + + AnzeigeAktualisieren "txt" $Pfad + AnzeigeAktualisieren "ver" $Pfad + AnzeigeEinstellungenAktualisieren +} + +Function EinstellungsDateiAendern($Art, $Eintrag, $ZielDateien, $ZielDatei) +{ + # Aendern: Nicht mehr $ZielDateien uebergeben, sondern Verzeichnis der Einstellungsdatei holen und %ZielDateien selber erstellen + + # Anpassen von $ZielDateien + switch ($Art) { + New { + Write-Host "[New] Alte ZielDateien: " $ZielDateien + $ZielDateien += $ZielDatei + + Write-Host "[New] Neue ZielDateien: " $ZielDateien + + # Felder leeren + # Todo: auslagern in AnzeigenEinstellungenAktualisieren. Soll auch gemacht werden, nachdem Einträge geloescht oder veraendert wurden! + $ESTextBoxPrefixENew.Text = "" + $ESTextBoxPrefixANew.Text = "" + $ESTextfeldDateiNameNew.Text = "" + $ESRadioButtonSimpelNew.Checked = $false + $ESRadioButtonTIANew.Checked = $false + } + Upd { + Write-Host "[Upd] Alte ZielDateien: " $ZielDateien + Write-Host "Einzufuegende Zieldatei: " $ZielDatei + + $ZielDateien[$Eintrag] = $ZielDatei + + Write-Host "[Upd] Neue ZielDateien: " $ZielDateien + } + Del { + Write-Host "[Del] Alte ZielDateien: " $ZielDateien ", Eintrag: " $Eintrag + + $i = 0 + foreach ($ZielDatei in $ZielDateien) { + if ($Eintrag -ne $i) { + # Todo: Fehler, wenn man erst Eintrag hinzufuegt und anschließend wieder entfernt ("Method invocation failed because [System.Management.Automation.PSObject] does not contain a method named 'op_Addition") + $NeueZielDateien += $ZielDatei + } + $i++ + } + + Clear-Variable ZielDateien + $ZielDateien = $NeueZielDateien + Write-Host "[Del] Neue ZielDateien: " $ZielDateien + } + Default {} + } + + # Schreiben in Einstellungsdatei + $StartPfad = StartPfadHolen + $PfadEinstellungsDatei = PfadEinstellungsDateiHolen + + # Loeschen der Inhalte der Einstellungsdatei + Clear-Content $PfadEinstellungsDatei + Write-Host "StartPfad: " $StartPfad " Pfad Einstellungsdatei: " $PfadEinstellungsDatei + Add-Content $PfadEinstellungsDatei $StartPfad + foreach ($ZielDatei in $ZielDateien) { + Add-Content $PfadEinstellungsDatei $("Datei|" + $ZielDatei.PrefixEingang + "|" + $ZielDatei.PrefixAusgang + "|" + $ZielDatei.DateiName + "|" + $ZielDatei.WandlungsTyp) + } + + # Anzeige in Einstellungen aktualisieren + AnzeigeEinstellungenAktualisieren +} + + +#--------------------------------------- Ende Funktionen für GUI ------------------------------- + +Function ExcelDateiNameErstellen ($Prefix, $PfadUrsprungsdatei, $PfadZielDatei) +{ + $BasisNameZielDatei = Split-Path $PfadUrsprungsdatei -Leaf + $BasisNameZielDateiLaenge = $BasisNameZielDatei.Length + $BasisNameZielDateiKurz = $BasisNameZielDatei.Substring(0, $($BasisNameZielDateiLaenge - 4)) + $GesamtPfadZielDatei = $PfadZielDatei + "\" + $Prefix + "_" + $BasisNameZielDateiKurz + ".xlsx" + + return $GesamtPfadZielDatei +} + +Function ExcelDateiErstellen ($DateiPfad) +{ + $Datei = New-Object -ComObject Excel.Application + $Mappe = $Datei.Workbooks.Add() + $Mappe.SaveAs($DateiPfad) + $Datei.Quit() + + return +} + +Function ExcelDateiBeschreibenStandard ($PfadUrsprungsdatei, $PrefixEingang, $PrefixAusgang, $ZielDatei) +{ + $Datei = New-Object -ComObject Excel.Application + $Mappe = $Datei.Workbooks.Open($ZielDatei) + $Blatt = $Mappe.WorkSheets.item(1) + $Datei.Visible = $false + + $i = 1 + $Eingaenge = @() + $ZuEingang = @("B", "S", "E", "I", "DI", "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BJ", "BK", "BL", "BM", "BN", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", "FA", "FB", "FC", "FD", "FE", "FF", "FG", "FH", "FJ", "FK", "FL", "FM", "FN", "FP", "FQ", "FR", "FS", "FT", "FU", "FV", "FW", "FX", "FY", "FZ", "SA", "SB", "SC", "SD", "SE", "SF", "SG", "SH", "SJ", "SK", "SL", "SM", "SN", "SP", "SQ", "SR", "SS", "ST", "SU", "SV", "SW", "SX", "SY", "SZ") + $Ausgaenge = @() + $ZuAusgang = @("K", "O", "Q,", "M", "A", "P", "DQ", "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CJ", "CK", "CL", "CM", "CN", "CP", "CQ", "CR", "CS", "CT", "CU", "CV", "CW", "CX", "CY", "CZ", "EA", "EB", "EC", "ED", "EE", "EF", "EG", "EH", "EJ", "EK", "EL", "EM", "EN", "EP", "EQ", "ER", "ES", "ET", "EU", "EV", "EW", "EX", "EY", "EZ", "GA", "GB", "GC", "GD", "GE", "GF", "GG", "GH", "GJ", "GK", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GV", "GW", "GX", "GY", "GZ", "HA", "HB", "HC", "HD", "HE", "HF", "HG", "HH", "HJ", "HK", "HL", "HM", "HN", "HP", "HQ", "HR", "HS", "HT", "HU", "HV", "HW", "HX", "HY", "HZ", "KA", "KB", "KC", "KD", "KE", "KF", "KG", "KH", "KJ", "KK", "KL", "KM", "KN", "KP", "KQ", "KR", "KS", "KT", "KU", "KV", "KW", "KX", "KY", "KZ", "MA", "MB", "MC", "MD", "ME", "MF", "MG", "MH", "MJ", "MK", "ML", "MM", "MN", "MP", "MQ", "MR", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "PA", "PB", "PC", "PD", "PE", "PF", "PG", "PH", "PJ", "PK", "PL", "PM", "PN", "PP", "PQ", "PR", "PS", "PT", "PU", "PV", "PW", "PX", "PY", "PZ", "QA", "QB", "QC", "QD", "QE", "QF", "QG", "QH", "QJ", "QK", "QL", "QM", "QN", "QP", "QQ", "QR", "QS", "QT", "QU", "QV", "QW", "QX", "QY", "QZ", "RA", "RB", "RC", "RD", "RE", "RF", "RG", "RH", "RJ", "RK", "RL", "RM", "RN", "RP", "RQ", "RR", "RS", "RT", "RU", "RV", "RW", "RX", "RY", "RZ", "TA", "TB", "TC", "TD", "TE", "TF", "TG", "TH", "TJ", "TK", "TL", "TM", "TN", "TP", "TQ", "TR", "TS", "TT", "TU", "TV", "TW", "TX", "TY", "TZ") + $Fehler = @() + + $Ursprungdatei = Get-Content $PfadUrsprungsdatei + + foreach ($Eintrag in $Ursprungdatei) + { + $Eintragszeile = $Eintrag.Split("'") + $BMKZahl = $Eintragszeile[1] + $BMKZahl = $BMKZahl.TrimStart("'") + $Kommentar = $Eintragszeile[3] + $Kommentar = $Kommentar.TrimEnd("'") + + if ($($($BMKZahl -replace "[\d]") -in $ZuEingang)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $PrefixEingang + $BMKZahl + $Eingaenge += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + elseif ($($($BMKZahl -replace "[\d]") -in $ZuAusgang)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $PrefixAusgang + $BMKZahl + $Ausgaenge += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + else + { + Write-Host "Achtung, Fehler bei " $BMKZahl $Kommentar + $Fehler += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + + # Write-Host "In Excel schreiben: BMKZahl: " $BMKZahl " Kommentar: " $Kommentar + $Blatt.Cells.Item($i,1) = $BMKZahl + $Blatt.Cells.Item($i,2) = $Kommentar + + $i++ + + DateiBeschreibenAktualisieren + } + + $Mappe.Save() + $Datei.Quit() + + $GleicheEingaenge = GleicheFinden $Eingaenge + $GleicheAusgaenge = GleicheFinden $Ausgaenge + Write-Host "Gleiche fuer " $PrefixEingang ": " $GleicheEingaenge + Write-Host "Gleiche fuer " $PrefixAusgang ": " $GleicheAusgaenge + Write-Host "Fehler bei: " $Fehler + + if ( $($Fehler.Length -eq 0)) + { + $Fehler += @([PSCustomObject]@{ + Name = "Keine" + Zeile = "Alle" + }) + } + + return $GleicheEingaenge, $GleicheAusgaenge, $Fehler +} + +Function ExcelDateiBeschreibenSpezial ($PfadUrsprungsdatei, $PrefixEingang, $PrefixAusgang, $ZielDatei) +{ + $Datei = New-Object -ComObject Excel.Application + $Mappe = $Datei.Workbooks.Open($ZielDatei) + $Blatt = $Mappe.WorkSheets.item(1) + $Datei.Visible = $false + + $i = 2 + $Eingaenge = @() + $ZuEingang = @("B", "S", "E", "I", "DI", "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BJ", "BK", "BL", "BM", "BN", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", "FA", "FB", "FC", "FD", "FE", "FF", "FG", "FH", "FJ", "FK", "FL", "FM", "FN", "FP", "FQ", "FR", "FS", "FT", "FU", "FV", "FW", "FX", "FY", "FZ", "SA", "SB", "SC", "SD", "SE", "SF", "SG", "SH", "SJ", "SK", "SL", "SM", "SN", "SP", "SQ", "SR", "SS", "ST", "SU", "SV", "SW", "SX", "SY", "SZ") + $Ausgaenge = @() + $ZuAusgang = @("K", "O", "Q,", "M", "A", "P", "DQ", "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CJ", "CK", "CL", "CM", "CN", "CP", "CQ", "CR", "CS", "CT", "CU", "CV", "CW", "CX", "CY", "CZ", "EA", "EB", "EC", "ED", "EE", "EF", "EG", "EH", "EJ", "EK", "EL", "EM", "EN", "EP", "EQ", "ER", "ES", "ET", "EU", "EV", "EW", "EX", "EY", "EZ", "GA", "GB", "GC", "GD", "GE", "GF", "GG", "GH", "GJ", "GK", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GV", "GW", "GX", "GY", "GZ", "HA", "HB", "HC", "HD", "HE", "HF", "HG", "HH", "HJ", "HK", "HL", "HM", "HN", "HP", "HQ", "HR", "HS", "HT", "HU", "HV", "HW", "HX", "HY", "HZ", "KA", "KB", "KC", "KD", "KE", "KF", "KG", "KH", "KJ", "KK", "KL", "KM", "KN", "KP", "KQ", "KR", "KS", "KT", "KU", "KV", "KW", "KX", "KY", "KZ", "MA", "MB", "MC", "MD", "ME", "MF", "MG", "MH", "MJ", "MK", "ML", "MM", "MN", "MP", "MQ", "MR", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "PA", "PB", "PC", "PD", "PE", "PF", "PG", "PH", "PJ", "PK", "PL", "PM", "PN", "PP", "PQ", "PR", "PS", "PT", "PU", "PV", "PW", "PX", "PY", "PZ", "QA", "QB", "QC", "QD", "QE", "QF", "QG", "QH", "QJ", "QK", "QL", "QM", "QN", "QP", "QQ", "QR", "QS", "QT", "QU", "QV", "QW", "QX", "QY", "QZ", "RA", "RB", "RC", "RD", "RE", "RF", "RG", "RH", "RJ", "RK", "RL", "RM", "RN", "RP", "RQ", "RR", "RS", "RT", "RU", "RV", "RW", "RX", "RY", "RZ", "TA", "TB", "TC", "TD", "TE", "TF", "TG", "TH", "TJ", "TK", "TL", "TM", "TN", "TP", "TQ", "TR", "TS", "TT", "TU", "TV", "TW", "TX", "TY", "TZ") + $Fehler = @() + + $Blatt.Cells.Item(1,1) = "Name" + $Blatt.Cells.Item(1,2) = "Path" + $Blatt.Cells.Item(1,3) = "Data Type" + $Blatt.Cells.Item(1,4) = "Logical Address" + $Blatt.Cells.Item(1,5) = "Comment" + $Blatt.Cells.Item(1,6) = "Hmi Visible" + $Blatt.Cells.Item(1,7) = "Hmi Accessible" + $Blatt.Cells.Item(1,8) = "Hmi Writeable" + $Blatt.Cells.Item(1,9) = "Typeobject ID" + $Blatt.Cells.Item(1,10) = "Version ID" + + $Ursprungdatei = Get-Content $PfadUrsprungsdatei + + foreach ($Eintrag in $Ursprungdatei) + { + $Eintragszeile = $Eintrag.Split("'") + $BMKZahl = $Eintragszeile[1] + $BMKZahl = $BMKZahl.TrimStart("'") + $Kommentar = $Eintragszeile[3] + $Kommentar = $Kommentar.TrimEnd("'") + + if ($($($BMKZahl -replace "[\d]") -in $ZuEingang)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $PrefixEingang + $BMKZahl + $Eingaenge += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + elseif ($($($BMKZahl -replace "[\d]") -in $ZuAusgang)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $PrefixAusgang + $BMKZahl + $Ausgaenge += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + else + { + Write-Host "Achtung, Fehler bei " $BMKZahl $Kommentar + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $Fehler += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + + #Write-Host "In Excel schreiben: BMKZahl: " $BMKZahl " Kommentar: " $Kommentar + $Blatt.Cells.Item($i,1) = $Kommentar #Name + $Blatt.Cells.Item($i,2) = "Standard-Variablentabelle" #Path + $Blatt.Cells.Item($i,3) = "Bool" #Data Type + $Blatt.Cells.Item($i,4) = $BMKZahl #Logical Address + #$Blatt.Cells.Item($i,5) = "" #Comment + $Blatt.Cells.Item($i,6) = "'True" #Hmi Visible + $Blatt.Cells.Item($i,7) = "'True" #Hmi Accessible + $Blatt.Cells.Item($i,8) = "'True" #Hmi Writeable + #$Blatt.Cells.Item($i,9) = "" #Typeobject ID + #$Blatt.Cells.Item($i,10) = "" #Version ID + + + $i++ + + DateiBeschreibenAktualisieren + } + + $Mappe.Save() + $Datei.Quit() + + $GleicheEingaenge = GleicheFinden $Eingaenge + $GleicheAusgaenge = GleicheFinden $Ausgaenge + Write-Host "Gleiche fuer " $PrefixEingang ": " $GleicheEingaenge + Write-Host "Gleiche fuer " $PrefixAusgang ": " $GleicheAusgaenge + Write-Host "Fehler bei: " $Fehler + + if ( $($Fehler.Length -eq 0)) + { + $Fehler += @([PSCustomObject]@{ + Name = "Keine" + Zeile = "Alle" + }) + } + + return $GleicheEingaenge, $GleicheAusgaenge, $Fehler +} + +Function GleicheFinden ($ZuUeberpruefen) +{ + $ZuUeberpruefen = $ZuUeberpruefen | Sort-Object "Name" + $Gleiche = @() + for ($i = 0; $i -lt $($ZuUeberpruefen.Count - 1); $i++) + { + $IstGleich = $($ZuUeberpruefen[$i].Name -eq $ZuUeberpruefen[$($i+1)].Name) + if ($IstGleich) + { + # Eintrag hinzufügen + if (-not $($Gleiche[-1].Zeile -eq $ZuUeberpruefen[$i].Zeile)) + { + $Gleiche += $ZuUeberpruefen[$i] + } + $Gleiche += $ZuUeberpruefen[$($i+1)] + #Write-Host "Gleiche: " $Gleiche + } + } + + if ( $($Gleiche.Length -eq 0)) + { + $Gleiche += @([PSCustomObject]@{ + Name = "Keine" + Zeile = "Alle" + }) + } + + return $Gleiche +} + + +Main \ No newline at end of file diff --git a/Test-Skripte/GUI-Angepasst6 - Kommentare.ps1 b/Test-Skripte/GUI-Angepasst6 - Kommentare.ps1 new file mode 100644 index 0000000..64938a5 --- /dev/null +++ b/Test-Skripte/GUI-Angepasst6 - Kommentare.ps1 @@ -0,0 +1,1658 @@ +Function Main +{ + Write-Host "Programmstart" + + # Todo: Wird $ZielDateien wirklich noch im GUI benoetigt? + #$ZielDateien = ZielDateienHolen + #Write-Host "Zieldateien in Main: " $ZielDateien + + $StartPfad = StartPfadHolen + + GUI $StartPfad #$ZielDateien + +} + + + +Function GUI ($StartPfad) +{ + [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") + [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") + + # Eigenschaften Fenster + $Fenster = New-Object System.Windows.Forms.Form + $Fenster.Size = New-Object System.Drawing.Size(940,660) #Breite, Hoehe + $Fenster.StartPosition = "CenterScreen" + $Fenster.KeyPreview = $true # was macht das? + $Fenster.MaximumSize = $Fenster.Size # legt fest, dass Groeße des Fensters nicht veraendert werden kann + $Fenster.MinimumSize = $Fenster.Size + $Fenster.Text = "Dateikonvertierer txt zu xlsx" + + # Eigenschaften Tabs + $TabBasis = New-Object System.Windows.Forms.TabControl + $TabBasis.Location = New-Object System.Drawing.Size(10,10) + $TabBasis.Size = New-Object System.Drawing.Size(900,600) + $TabBasis.DataBindings.DefaultDataSourceUpdateMode = 0 # Was macht das? + $Fenster.Controls.Add($TabBasis) + + # Tab: TXT-Pfad auswaehlen + $TabSeiteTXTAuswaehlen = New-Object System.Windows.Forms.TabPage + $TabSeiteTXTAuswaehlen.TabIndex = 0 + $TabSeiteTXTAuswaehlen.UseVisualStyleBackColor = $true + $TabSeiteTXTAuswaehlen.Text = "txt-Datei Auswaehlen" + #Paddings + $TabSeiteTXTAuswaehlen.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteTXTAuswaehlen) + + # TXTPfadFeld + $TXTPfadFeld = New-Object System.Windows.Forms.TextBox + $TXTPfadFeld.Location = New-Object System.Drawing.Size(10,10) + $TXTPfadFeld.Size = New-Object System.Drawing.Size(860,20) + $TXTPfadFeld.Add_KeyDown({ + # Reaktion bei gedrueckter Taste + $Taste = $_.KeyCode + TastenReaktionPfadFeld "txt" $Taste + }) + $TabSeiteTXTAuswaehlen.Controls.Add($TXTPfadFeld) + + # TXTListeOrdnernamen + $TXTListeOrdnernamen = New-Object System.Windows.Forms.ListBox + $TXTListeOrdnernamen.Location = New-Object System.Drawing.Size(10,40) + $TXTListeOrdnernamen.Size = New-Object System.Drawing.Size(860,20) + $TXTListeOrdnernamen.Height = 450 + $TXTListeOrdnernamen.Font = New-Object System.Drawing.Font("Arial",12,[System.Drawing.FontStyle]::Regular) + $TXTListeOrdnernamen.Add_DoubleClick({ + # Variablen bestimmen zur uebergabe + $Auswahl = $TXTListeOrdnernamen.SelectedItem + $Pfad = $TXTPfadFeld.Text + + # Pfad aktualisieren + VerzeichnisAuswaehlen "txt" $Pfad $Auswahl + }) + $TXTListeOrdnernamen.Add_KeyDown({ + # Reaktion bei gedrueckter Taste + $Taste = $_.KeyCode + TastenReaktionListeOrdnernamen "txt" $Taste + }) + $TabSeiteTXTAuswaehlen.Controls.Add($TXTListeOrdnernamen) + + # ZurueckButton + $TXTZurueckButton = New-Object System.Windows.Forms.Button + $TXTZurueckButton.Location = New-Object System.Drawing.Size(10,500) + $TXTZurueckButton.Size = New-Object System.Drawing.Size(100,30) + $TXTZurueckButton.Text = "Zurueck" + $TXTZurueckButton.Add_Click({ + # Write-Host "Pfad ausgabe: " $TXTPfadFeld.Text + $Pfad = $TXTPfadFeld.Text + + #Pfad aktualisieren + VerzeichnisZurueck "txt" $Pfad + }) + $TXTZurueckButton.Add_KeyDown({ + # Reaktion bei gedrueckter Taste + $Taste = $_.KeyCode + TastenReaktionButtons "txt" $Taste + }) + $TabSeiteTXTAuswaehlen.Controls.Add($TXTZurueckButton) + + # AuswaehlenButton + $TXTAuswaehlenButton = New-Object System.Windows.Forms.Button + $TXTAuswaehlenButton.Location = New-Object System.Drawing.Size(750,500) + $TXTAuswaehlenButton.Size = New-Object System.Drawing.Size(100,30) + $TXTAuswaehlenButton.Text = "Auswaehlen" + $TXTAuswaehlenButton.Add_Click({ + # Variablen bestimmen zur uebergabe + $Auswahl = $TXTListeOrdnernamen.SelectedItem + $Pfad= $TXTPfadFeld.Text + + # Pfad aktualisieren + VerzeichnisAuswaehlen "txt" $Pfad $Auswahl + }) + $TXTAuswaehlenButton.Add_KeyDown({ + # Reaktion bei gedrueckter Taste + $Taste = $_.KeyCode + TastenReaktionButtons "txt" $Taste + }) + $TabSeiteTXTAuswaehlen.Controls.Add($TXTAuswaehlenButton) + + $A = AnzeigeAktualisieren "txt" $StartPfad # Ohne dem Aufruf kann kein Startverzeichnis uebergeben werden. Wird der Aufruf keiner Variable zugewiesen verursacht dies Fehler bei der Rueckgabe. + + # Tab: Zielverzeichnis auswaehlen + $TabSeiteZielVerzeichnisAuswaehlen = New-Object System.Windows.Forms.TabPage + $TabSeiteZielVerzeichnisAuswaehlen.TabIndex = 1 + $TabSeiteZielVerzeichnisAuswaehlen.UseVisualStyleBackColor = $true + $TabSeiteZielVerzeichnisAuswaehlen.Text = "Zielverzeichnis Auswaehlen" + #Paddings + $TabSeiteZielVerzeichnisAuswaehlen.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteZielVerzeichnisAuswaehlen) + + # PfadFeld + $VERPfadFeld = New-Object System.Windows.Forms.TextBox + $VERPfadFeld.Location = New-Object System.Drawing.Size(10,10) + $VERPfadFeld.Size = New-Object System.Drawing.Size(860,20) + $VERPfadFeld.Add_KeyDown({ + # Reaktion bei gedrueckter Taste + $Taste = $_.KeyCode + TastenReaktionPfadFeld "ver" $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERPfadFeld) + + # ListeOrdnernamen + $VERListeOrdnernamen = New-Object System.Windows.Forms.ListBox + $VERListeOrdnernamen.Location = New-Object System.Drawing.Size(10,40) + $VERListeOrdnernamen.Size = New-Object System.Drawing.Size(860,20) + $VERListeOrdnernamen.Height = 450 + $VERListeOrdnernamen.Font = New-Object System.Drawing.Font("Arial",12,[System.Drawing.FontStyle]::Regular) + $VERListeOrdnernamen.Add_DoubleClick({ + # Variablen bestimmen zur uebergabe + $Auswahl = $VERListeOrdnernamen.SelectedItem + $Pfad = $VERPfadFeld.Text + + # Pfad aktualisieren + VerzeichnisAuswaehlen "ver" $Pfad $Auswahl + }) + $VERListeOrdnernamen.Add_KeyDown({ + # Reaktion bei gedrueckter Taste + $Taste = $_.KeyCode + TastenReaktionListeOrdnernamen "ver" $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERListeOrdnernamen) + + # ZurueckButton + $VERZurueckButton = New-Object System.Windows.Forms.Button + $VERZurueckButton.Location = New-Object System.Drawing.Size(10,500) + $VERZurueckButton.Size = New-Object System.Drawing.Size(100,30) + $VERZurueckButton.Text = "Zurueck" + $VERZurueckButton.Add_Click({ + # Write-Host "Pfad ausgabe: " $VERPfadFeld.Text + $Pfad = $VERPfadFeld.Text + + #Pfad aktualisieren + VerzeichnisZurueck "ver" $Pfad + }) + $VERZurueckButton.Add_KeyDown({ + # Reaktion bei gedrueckter Taste + $Taste = $_.KeyCode + TastenReaktionButtons "ver" $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERZurueckButton) + + # AuswaehlenButton + $VERAuswaehlenButton = New-Object System.Windows.Forms.Button + $VERAuswaehlenButton.Location = New-Object System.Drawing.Size(630,500) + $VERAuswaehlenButton.Size = New-Object System.Drawing.Size(100,30) + $VERAuswaehlenButton.Text = "Auswaehlen" + $VERAuswaehlenButton.Add_Click({ + # Variablen bestimmen zur uebergabe + $Auswahl = $VERListeOrdnernamen.SelectedItem + $Pfad = $VERPfadFeld.Text + + if ($($VERListeOrdnernamen.Items[0] -eq "")) + { + VERAuswahlBestaetigt $Pfad $Auswahl + } + else + { + # Pfad aktualisieren + VerzeichnisAuswaehlen "ver" $Pfad $Auswahl + } + }) + $VERAuswaehlenButton.Add_KeyDown({ + # Reaktion bei gedrueckter Taste + $Taste = $_.KeyCode + TastenReaktionButtons "ver" $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERAuswaehlenButton) + + # BestaetigenButton + $VERBestaetigenButton = New-Object System.Windows.Forms.Button + $VERBestaetigenButton.Location = New-Object System.Drawing.Size(750,500) + $VERBestaetigenButton.Size = New-Object System.Drawing.Size(100,30) + $VERBestaetigenButton.Text = "Bestaetigen" + $VERBestaetigenButton.Add_Click({ + $Auswahl = $VERListeOrdnernamen.SelectedItem + $Pfad = $VERPfadFeld.Text + + VERAuswahlBestaetigt $Pfad $Auswahl + }) + $VERBestaetigenButton.Add_KeyDown({ + # Reaktion bei gedrueckter Taste + $Taste = $_.KeyCode + TastenReaktionButtons "ver" $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERBestaetigenButton) + + # Tab: Ausgabe Fortschritt + $TabSeiteFortschrittsanzeige = New-Object System.Windows.Forms.TabPage + $TabSeiteFortschrittsanzeige.TabIndex = 2 + $TabSeiteFortschrittsanzeige.UseVisualStyleBackColor = $true + $TabSeiteFortschrittsanzeige.Text = "Bearbeitungsfortschritt" + #Paddings + $TabSeiteFortschrittsanzeige.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteFortschrittsanzeige) + + #Todo: Ansicht ueberarbeiten! + + $FATextfeld1 = New-Object System.Windows.Forms.Label + $FATextfeld1.Location = New-Object System.Drawing.Size(10,10) + $FATextfeld1.Size = New-Object System.Drawing.Size(200,20) + $FATextfeld1.Text = "Aktuelle Aufgabe" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld1) + + $FATextfeld2 = New-Object System.Windows.Forms.Label + $FATextfeld2.Location = New-Object System.Drawing.Size(300,10) + $FATextfeld2.Size = New-Object System.Drawing.Size(430,20) + $FATextfeld2.Text = "Erledigte Aufgaben" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld2) + + $FATextfeldAktuelleAufgabe = New-Object System.Windows.Forms.Label + $FATextfeldAktuelleAufgabe.Location = New-Object System.Drawing.Size(10,40) + $FATextfeldAktuelleAufgabe.Size = New-Object System.Drawing.Size(280,60) + $FATextfeldAktuelleAufgabe.Text = "txt-Datei auswaehlen" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeldAktuelleAufgabe) + + $FAListeErledigteAufgaben = New-Object System.Windows.Forms.ListBox + $FAListeErledigteAufgaben.Location = New-Object System.Drawing.Size(300,40) + $FAListeErledigteAufgaben.Size = New-Object System.Drawing.Size(430,20) + $FAListeErledigteAufgaben.Height = 150 + $FAListeErledigteAufgaben.Font = New-Object System.Drawing.Font("Arial",12,[System.Drawing.FontStyle]::Regular) + $TabSeiteFortschrittsanzeige.Controls.Add($FAListeErledigteAufgaben) + + $FATextfeld3 = New-Object System.Windows.Forms.Label + $FATextfeld3.Location = New-Object System.Drawing.Size(10,100) + $FATextfeld3.Size = New-Object System.Drawing.Size(430,20) + $FATextfeld3.Text = "Fortschritt Excel-Dateien beschreiben" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld3) + + $FAFortschrittsbar = New-Object System.Windows.Forms.ProgressBar + $FAFortschrittsbar.Location = New-Object System.Drawing.Size(10,120) + $FAFortschrittsbar.Size = New-Object System.Drawing.Size(260,30) + #$FAFortschrittsbar.Name = "Fortschrittsanzeige" + $FAFortschrittsbar.Value = 0 + $TabSeiteFortschrittsanzeige.Controls.Add($FAFortschrittsbar) + + $FATextfeldRealwertFortschrittsbar = New-Object System.Windows.Forms.Label # Wird verwendet, aber VSC erkennt das nicht + + $FATextfeld4 = New-Object System.Windows.Forms.Label + $FATextfeld4.Location = New-Object System.Drawing.Size(10,170) + $FATextfeld4.Size = New-Object System.Drawing.Size(140,20) + $FATextfeld4.Text = "Bearbeitete Eintraege:" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld4) + + $FATextfeld5 = New-Object System.Windows.Forms.Label + $FATextfeld5.Location = New-Object System.Drawing.Size(10,200) + $FATextfeld5.Size = New-Object System.Drawing.Size(100,20) + $FATextfeld5.Text = "Gesamteintraege:" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld5) + + $FATextfeldBearbeiteteEintraege = New-Object System.Windows.Forms.Label + $FATextfeldBearbeiteteEintraege.Location = New-Object System.Drawing.Size(170,170) + $FATextfeldBearbeiteteEintraege.Size = New-Object System.Drawing.Size(430,20) + $FATextfeldBearbeiteteEintraege.Text = "0" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeldBearbeiteteEintraege) + + $FATextfeldGesamtEintraege = New-Object System.Windows.Forms.Label + $FATextfeldGesamtEintraege.Location = New-Object System.Drawing.Size(170,200) + $FATextfeldGesamtEintraege.Size = New-Object System.Drawing.Size(430,20) + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeldGesamtEintraege) + + # Tab: Ausgabe doppelte Ein- und Ausgaenge sowie nicht zurordnebare Betriebsmittel + $TabSeiteDuplikate = New-Object System.Windows.Forms.TabPage + $TabSeiteDuplikate.TabIndex = 3 + $TabSeiteDuplikate.UseVisualStyleBackColor = $true + $TabSeiteDuplikate.Text = "Doppelte Ein- und Ausgaenge" + #Paddings + $TabSeiteDuplikate.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteDuplikate) + + $DPTextfeld1 = New-Object System.Windows.Forms.Label + $DPTextfeld1.Location = New-Object System.Drawing.Size(10,10) + $DPTextfeld1.Size = New-Object System.Drawing.Size(275,40) + $DPTextfeld1.Text = "Bei den Eingaengen gibt es folgende Duplikate: " + $TabSeiteDuplikate.Controls.Add($DPTextfeld1) + + $DPListeEingaenge = New-Object System.Windows.Forms.DataGridView + $DPListeEingaenge.Location = New-Object System.Drawing.Size(10,60) + $DPListeEingaenge.Size = New-Object System.Drawing.Size(275,20) + $DPListeEingaenge.Height = 430 + $DPListeEingaenge.ColumnCount = 2 + $DPListeEingaenge.ColumnHeadersVisible = $true + $DPListeEingaenge.Columns[0].Name = "Zeile" + $DPListeEingaenge.Columns[1].Name = "Kennzeichnung" + $TabSeiteDuplikate.Controls.Add($DPListeEingaenge) + + $DPTextfeld2 = New-Object System.Windows.Forms.Label + $DPTextfeld2.Location = New-Object System.Drawing.Size(295,10) + $DPTextfeld2.Size = New-Object System.Drawing.Size(275,40) + $DPTextfeld2.Text = "Bei den Ausgaengen gibt es folgende Duplikate: " + $TabSeiteDuplikate.Controls.Add($DPTextfeld2) + + $DPListeAusgaenge = New-Object System.Windows.Forms.DataGridView + $DPListeAusgaenge.Location = New-Object System.Drawing.Size(295,60) + $DPListeAusgaenge.Size = New-Object System.Drawing.Size(275,20) + $DPListeAusgaenge.Height = 430 + $DPListeAusgaenge.ColumnCount = 2 + $DPListeAusgaenge.ColumnHeadersVisible = $true + $DPListeAusgaenge.Columns[0].Name = "Zeile" + $DPListeAusgaenge.Columns[1].Name = "Kennzeichnung" + $TabSeiteDuplikate.Controls.Add($DPListeAusgaenge) + + $DPTextfeld3 = New-Object System.Windows.Forms.Label + $DPTextfeld3.Location = New-Object System.Drawing.Size(580,10) + $DPTextfeld3.Size = New-Object System.Drawing.Size(275,40) + $DPTextfeld3.Text = "Folgende Eintraege konnten keinem Betriebsmittel zugewiesen werden:" + $TabSeiteDuplikate.Controls.Add($DPTextfeld3) + + $DPListeFehler = New-Object System.Windows.Forms.DataGridView + $DPListeFehler.Location = New-Object System.Drawing.Size(580,60) + $DPListeFehler.Size = New-Object System.Drawing.Size(275,20) + $DPListeFehler.Height = 430 + $DPListeFehler.ColumnCount = 2 + $DPListeFehler.ColumnHeadersVisible = $true + $DPListeFehler.Columns[0].Name = "Zeile" + $DPListeFehler.Columns[1].Name = "Kennzeichnung" + $TabSeiteDuplikate.Controls.Add($DPListeFehler) + + $DPBestaetigenButton = New-Object System.Windows.Forms.Button + $DPBestaetigenButton.Location = New-Object System.Drawing.Size(10,500) + $DPBestaetigenButton.Size = New-Object System.Drawing.Size(860,30) + $DPBestaetigenButton.Text = "Programm beenden" + $DPBestaetigenButton.Add_Click({ + $Fenster.Dispose() + return + }) + $TabSeiteDuplikate.Controls.Add($DPBestaetigenButton) + + # Tab: Einstellungen + $TabSeiteEigenschaften = New-Object System.Windows.Forms.TabPage + $TabSeiteEigenschaften.TabIndex = 0 + $TabSeiteEigenschaften.UseVisualStyleBackColor = $true + $TabSeiteEigenschaften.Text = "Einstellungen" + #Paddings + $TabSeiteEigenschaften.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteEigenschaften) + + $BasisHoehe1 = 170 #80 + #$BasisHoehe2 = $BasisHoehe1 + 20 #100 + #$BasisHoehe2x = $BasisHoehe2 + 30 #130 + #$BasisHoehe3 = $BasisHoehe2 + 65 #165 + + $BasisBreite1 = 10 #10 + #$BasisBreite2 = $BasisBreite1 + 70 #80 + #$BasisBreite3 = $BasisBreite2 + 60 #140 + #$BasisBreite4 = $BasisBreite3 + 210 #350 + #$BasisBreite5 = $BasisBreite4 + 55 #405 + + $ESTextfeld1 = New-Object System.Windows.Forms.Label + $ESTextfeld1.Location = New-Object System.Drawing.Size($BasisBreite1,10) + $ESTextfeld1.Size = New-Object System.Drawing.Size(200,20) + $ESTextfeld1.Text = "Startverzeichnis Auswahl .txt-Datei:" + $TabSeiteEigenschaften.Controls.Add($ESTextfeld1) + + $ESTextfeldStartPfad = New-Object System.Windows.Forms.Label + $ESTextfeldStartPfad.Location = New-Object System.Drawing.Size(($BasisBreite1+200),10) + $ESTextfeldStartPfad.Size = New-Object System.Drawing.Size(510,20) + $TabSeiteEigenschaften.Controls.Add($ESTextfeldStartPfad) + + $ESStartPfadAendernButton = New-Object System.Windows.Forms.Button + $ESStartPfadAendernButton.Location = New-Object System.Drawing.Size(730,10) + $ESStartPfadAendernButton.Size = New-Object System.Drawing.Size(150,30) + $ESStartPfadAendernButton.Text = "Aendern" + $ESStartPfadAendernButton.Add_Click({ + VerzeichnisAendern "StartPfad" + }) + $TabSeiteEigenschaften.Controls.Add($ESStartPfadAendernButton) + + + $ESTextfeld2 = New-Object System.Windows.Forms.Label + $ESTextfeld2.Location = New-Object System.Drawing.Size($BasisBreite1,45) + $ESTextfeld2.Size = New-Object System.Drawing.Size(450,20) + $ESTextfeld2.Text = "Startverzeichnis bei Auswahl des Zielverzeichnisses der Datei(en):" + $TabSeiteEigenschaften.Controls.Add($ESTextfeld2) + + $ESRadioButtonWieTXT = New-Object System.Windows.Forms.RadioButton + $ESRadioButtonWieTXT.Location = New-Object System.Drawing.Size(10,10) + $ESRadioButtonWieTXT.Size = New-Object System.Drawing.Size(163,18) + $ESRadioButtonWieTXT.Name = "ESRadioButtonWieTXT" + $ESRadioButtonWieTXT.Text = "Gleich Startpfad .txt-Datei" + + $ESRadioButtonWieZieldatei = New-Object System.Windows.Forms.RadioButton + $ESRadioButtonWieZieldatei.Location = New-Object System.Drawing.Size(173,10) + $ESRadioButtonWieZieldatei.Size = New-Object System.Drawing.Size(179,18) + $ESRadioButtonWieZieldatei.Name = "ESRadioButtonWieZieldatei" + $ESRadioButtonWieZieldatei.Text = "Gleich gewaehlter .txt-Datei" + + $ESRadioButtonEigenerPfad = New-Object System.Windows.Forms.RadioButton + $ESRadioButtonEigenerPfad.Location = New-Object System.Drawing.Size(352,10) + $ESRadioButtonEigenerPfad.Size = New-Object System.Drawing.Size(94,18) + $ESRadioButtonEigenerPfad.Name = "ESRadioButtonEigenerPfad" + $ESRadioButtonEigenerPfad.Text = "Anderer Pfad" + + $ESGroupBoxRadioButtons = New-Object System.Windows.Forms.GroupBox + $ESGroupBoxRadioButtons.Location = New-Object System.Drawing.Size(($BasisBreite1),60) + $ESGroupBoxRadioButtons.Size = New-Object System.Drawing.Size(449,30) + $ESGroupBoxRadioButtons.Controls.Add($ESRadioButtonWieTXT) + $ESGroupBoxRadioButtons.Controls.Add($ESRadioButtonWieZieldatei) + $ESGroupBoxRadioButtons.Controls.Add($ESRadioButtonEigenerPfad) + $TabSeiteEigenschaften.Controls.Add($ESGroupBoxRadioButtons) + + $ESSpeichernButton = New-Object System.Windows.Forms.Button + $ESSpeichernButton.Location = New-Object System.Drawing.Size(730,60) + $ESSpeichernButton.Size = New-Object System.Drawing.Size(150,30) + $ESSpeichernButton.Text = "Speichern" + $ESSpeichernButton.Add_Click({ + # Todo: Speichern + #VerzeichnisAendern (ZielPfad) + }) + $TabSeiteEigenschaften.Controls.Add($ESSpeichernButton) + + $ESTextfeld3 = New-Object System.Windows.Forms.Label + $ESTextfeld3.Location = New-Object System.Drawing.Size($BasisBreite1,95) + $ESTextfeld3.Size = New-Object System.Drawing.Size(250,20) + $ESTextfeld3.Text = "Startverzeichnis Auswahl Zielverzeichnis:" + + $ESTextfeldZielPfad = New-Object System.Windows.Forms.Label + $ESTextfeldZielPfad.Location = New-Object System.Drawing.Size(($BasisBreite1+250),95) + $ESTextfeldZielPfad.Size = New-Object System.Drawing.Size(460,20) + + $ESZielPfadAendernButton = New-Object System.Windows.Forms.Button + $ESZielPfadAendernButton.Location = New-Object System.Drawing.Size(730,95) + $ESZielPfadAendernButton.Size = New-Object System.Drawing.Size(150,30) + $ESZielPfadAendernButton.Text = "Aendern" + $ESZielPfadAendernButton.Add_Click({ + VerzeichnisAendern "ZielPfad" + }) + + +#------------------- Tabelle mit ZielDateien + + $ESTextfeld4 = New-Object System.Windows.Forms.Label + $ESTextfeld4.Location = New-Object System.Drawing.Size($BasisBreite1,140) + $ESTextfeld4.Size = New-Object System.Drawing.Size(200,20) + $ESTextfeld4.Text = "Zieldateien:" + $TabSeiteEigenschaften.Controls.Add($ESTextfeld4) + + $ESAenderungenSpeichernButton = New-Object System.Windows.Forms.Button + $ESAenderungenSpeichernButton.Location = New-Object System.Drawing.Size(730,$BasisHoehe1) + $ESAenderungenSpeichernButton.Size = New-Object System.Drawing.Size(150,30) + $ESAenderungenSpeichernButton.Text = "Aenderungen Speichern" + $ESAenderungenSpeichernButton.Add_Click({ + #Todo: Scheint nicht zu funktionieren + Write-Host "Aenderungen speichern" + EinstellungsDateiAktualisieren + }) + $TabSeiteEigenschaften.Controls.Add($ESAenderungenSpeichernButton) + + $ESListeEinstellungen = New-Object System.Windows.Forms.DataGridView + $ESListeEinstellungen.Location = New-Object System.Drawing.Size(10,$BasisHoehe1) + $ESListeEinstellungen.Size = New-Object System.Drawing.Size(650,380) + $ESListeEinstellungen.ColumnCount = 4 + $ESListeEinstellungen.ColumnHeadersVisible = $true + $ESListeEinstellungen.AllowUserToAddRows = $true + $ESListeEinstellungen.AllowUserToDeleteRows = $true + $ESListeEinstellungen.AutoGenerateColumns = $false + $ESListeEinstellungen.AutoSizeColumnsMode = "Fill" + $ESListeEinstellungen.Columns[0].Name = "Prefix Eingang" + $ESListeEinstellungen.Columns[1].Name = "Prefix Ausgang" + $ESListeEinstellungen.Columns[2].Name = "Dateiname" + $ESListeEinstellungen.Columns[3].Name = "Konvertierungsart" + $TabSeiteEigenschaften.Controls.Add($ESListeEinstellungen) + + AnzeigeEinstellungenInitialisieren + + $Fenster.Add_Shown({$Fenster.Activate()}) + [void]$Fenster.ShowDialog() + + return +} + +#------------------- Funktion nur fuer das txt-GUI -------------------------- + +Function TXTReaktionReturn ($Pfad) +{ + if (PfadExistiert $Pfad) + { + # Gueltiger Pfad oder .txt-Datei + $PfadEnde = $(Split-Path $Pfad -Leaf) + if ($($PfadEnde -match ".txt")) + { + ZuVERSpringen + # Ist zwar sachlich gesehen unsinn, aber sonst funktioniert Return in der GUI nicht richtig + $TXTPfadFeld.Text = $Pfad + return + } + else + { + AnzeigeAktualisieren "txt" $Pfad + } + } + else + { + # Laufwerke aktualisieren oder ungueltiger Pfad + AnzeigeAktualisieren "txt" "" + } + return +} + +#------------------- Funktion nur fuer das VerzeichnisWaehlen-GUI -------------------------- + + +# Fuehrt $Pfad und $Auswahl zusammen und ueberprueft ob der daraus resultierte neue Pfad vorhanden ist. Falls dies der Fall ist, wird in den Bereich der Fortschrittsanzeige gewechselt +Function VERAuswahlBestaetigt($Pfad, $Auswahl) +{ +$Pfad = Join-Path -Path $Pfad -ChildPath $Auswahl -Resolve + +if (PfadExistiert $Pfad) +{ + ZuFASpringen + $VERPfadfeld.Text = $Pfad + return +} +} + +Function VERVorauswahlAnzeigeAktualisieren () { + # Todo: Soll evtl. in AnzeigeAktualisieren migriert werden. Problem: Innerhalb der Verzeichniswahl koennte man dann evtl. nicht mehr navigieren. + $RadioButton = RadioButtonHolen + switch ($RadioButton) { + EigenerPfad { + $ZielPfad = ZielPfadHolen + AnzeigeAktualisieren "ver" $ZielPfad + } + WieTXT { + $StartPfad = StartPfadHolen + AnzeigeAktualisieren "ver" $StartPfad + } + WieZielDatei { + AnzeigeAktualisieren "ver" $TXTPfadFeld.Text + } + Default { + AnzeigeAktualisieren "ver" $TXTPfadFeld.Text + } + } +} + + +#------------------- Funktionen zum wechseln der Tabs -------------------------- + +Function ZuVERSpringen +{ + VERVorauswahlAnzeigeAktualisieren + AufgabenAktualisieren "Zielverzeichnis auswaehlen" + Write-Host "Gewaehlte txt-Datei: " $TXTPfadFeld.Text + $TabBasis.SelectedIndex = 1 +} + +Function ZuFASpringen +{ + Write-Host "Gewaehltes Zielverzeichnis: " $VERPfadFeld.Text + $TabBasis.SelectedIndex = 2 + + $ZielDateien = ZielDateienHolen + + $PfadUrsprungsdatei = $TXTPfadFeld.Text + $PfadZielDateien = $VERPfadFeld.Text + + $AnzahlZielDateien = $ZielDateien.count + Write-Host "Anzahl ZielDateien: " $AnzahlZielDateien + + foreach ($ZielDatei in $ZielDateien) { + AufgabenAktualisieren $("Zieldatei " + $ZielDatei.DateiName + " bearbeiten") + + + $ZielPfad = ExcelDateiNameErstellen $($ZielDatei.DateiName) $PfadUrsprungsdatei $PfadZielDateien + + AufgabenAktualisieren $("Excel Datei erstellen im Verzeichnis " + $ZielPfad) + ExcelDateiErstellen $ZielPfad + + if ($($ZielDatei.WandlungsTyp) -eq "TIA") { + $Gleiche = ExcelDateiBeschreibenTIA $PfadUrsprungsdatei $($ZielDatei.PrefixEingang) $($ZielDatei.PrefixAusgang) $ZielPfad + } + elseif ($($ZielDatei.WandlungsTyp) -eq "Simpel") { + $Gleiche = ExcelDateiBeschreibenSimpel $PfadUrsprungsdatei $($ZielDatei.PrefixEingang) $($ZielDatei.PrefixAusgang) $ZielPfad + } + elseif ($($ZielDatei.WandlungsTyp) -eq "WSCAD") { + $Gleiche = ExcelDateiBeschreibenWSCAD $PfadUrsprungsdatei $($ZielDatei.PrefixEingang) $($ZielDatei.PrefixAusgang) $ZielPfad + } + else { + Write-Host "Fehler bei Wandlungsart! Fuehre Simpel-Wandlung durch" + $Gleiche = ExcelDateiBeschreibenSimpel $PfadUrsprungsdatei $($ZielDatei.PrefixEingang) $($ZielDatei.PrefixAusgang) $ZielPfad + } + } + + $GleicheEingaenge = $Gleiche[0] + $GleicheAusgaenge = $Gleiche[1] + $Fehler = $Gleiche[2] + + Write-Host "Gleiche Eingaenge: " $GleicheEingaenge + Write-Host "Gleiche Ausgaenge: " $GleicheAusgaenge + Write-Host "Fehler: " $Fehler + + AufgabenAktualisieren "Ausgabe Duplikate" + ZuDPSpringen $GleicheEingaenge $GleicheAusgaenge $Fehler +} + +Function ZuDPSpringen ($GleicheEingaenge, $GleicheAusgaenge, $Fehler) +{ + foreach ($GleichenEingang in $GleicheEingaenge) { + $DPListeEingaenge.Rows.Add($($GleichenEingang.Zeile),($GleichenEingang.Name)) + } + + foreach ($GleichenAusgang in $GleicheAusgaenge) { + $DPListeAusgaenge.Rows.Add($($GleichenAusgang.Zeile),($GleichenAusgang.Name)) + } + + foreach ($Fehlen in $Fehler) { + $DPListeFehler.Rows.Add($($Fehlen.Zeile),($Fehlen.Name)) + } + + $TabBasis.SelectedIndex = 3 + + # Werte zuruecksetzen, um weitere durchlauefe zu ermoeglichen + # Todo: Fehler und Duplikate zuruecksetzen!!! + VERVorauswahlAnzeigeAktualisieren + AnzeigeAktualisieren "txt" $($ESTextfeldStartPfad.Text) + $FAFortschrittsbar.Value = 0 + $FATextfeldBearbeiteteEintraege.Text = "0" +} + +#------------------- Funktionen fuer alle GUIs -------------------------- + + +# Bekommt Pfad, stellt fest ob Laufwerke oder Ordner angezeigt werden muessen und aktualisiert entsprechend alles +# Um die Laufwerke anzuzeigen, muss der $Pfad = "" sein +Function AnzeigeAktualisieren ($AuswahlTyp, $Pfad) +{ +# Ueberpruefen, ob es das Verzeichnis gibt +if (PfadExistiert $Pfad) +{ + Write-Host "Ordner anzeigen" + $Optionen = Optionen $AuswahlTyp $Pfad +} +elseif ($Pfad.Length -eq 0) { + Write-Host "Laufwerke anzeigen" + $Optionen = LaufwerkeFinden + $Pfad = "" +} +else +{ + AnzeigeAktualisieren $AuswahlTyp "" + return +} + +if ($($AuswahlTyp -eq "txt")) { + $TXTPfadFeld.Text = $Pfad + $TXTListeOrdnernamen.Items.Clear() + foreach ($Option in $Optionen) + { + if ($Option.Length -gt 0) + { + $TXTListeOrdnernamen.Items.Add($Option) + } + } +} +elseif ($($AuswahlTyp -eq "ver")) { + $VERPfadFeld.Text = $Pfad + $VERListeOrdnernamen.Items.Clear() + foreach ($Option in $Optionen) + { + if ($Option.Length -gt 0) + { + $VERListeOrdnernamen.Items.Add($Option) + } + } +} + +return +} + +Function VerzeichnisAuswaehlen ($AuswahlTyp, $Pfad, $Auswahl) +{ +if (PfadExistiert $Pfad) +{ + $Pfad = Join-Path -Path $Pfad -ChildPath $Auswahl -Resolve +} +elseif ($Pfad.Length -eq 0) { + #Wenn der Pfad die Laenge 0 hat, wurde ein Laufwerk gewaehlt + $Pfad = $Auswahl +} +else { + #Fehlerfall/ ungueltiger Pfad: zurueck zu Laufwerken navigieren + $Pfad = "" +} + +# Erkennen, ob *.txt-Datei gewaehlt wurde -> ggf. Auswahl abgeschlossen +if ($($($Auswahl -match ".txt") -and $($AuswahlTyp -eq "txt"))) +{ + # Fuer den Gesamtfortschritt Anzahl Dateien auslesen und mit der Anzahl der zu erstellenden Dateien multiplizieren + $Datei = Get-Content $Pfad + $ZielDateien = ZielDateienHolen + $FATextfeldGesamtEintraege.Text = $($ZielDateien.count) * $($Datei.Length) + + # Write-Host ".txt-Datei ausgewaehlt, Pfad: " $Pfad + # Write-Host "Dateityp: " $Pfad.GetType() + ZuVERSpringen + # Ist zwar sachlich gesehen unsinn, aber sonst funktioniert Return in der GUI nicht + $TXTPfadFeld.Text = $Pfad + return +} + +AnzeigeAktualisieren $AuswahlTyp $Pfad +return +} + +Function VerzeichnisZurueck ($AuswahlTyp, $Pfad) +{ +if ($Pfad.Length -gt 3) +{ + # Weiter mit Ordnern + $Pfad = Split-Path $Pfad +} +elseif ($Pfad.Length -le 3) +{ + # Weiter mit Laufwerken + # Write-Host "Laufwerke anzeigen" + $Pfad = "" +} +else +{ + Write-Host "Fehler bei Verzeichnis zurueck" + # Fehler/ Nichts tun? + # Ermitteln: wann tritt dieser Fall ein? + $Pfad = "" +} +AnzeigeAktualisieren $AuswahlTyp $Pfad +return +} + +Function TastenReaktionPfadFeld($AuswahlTyp, $Taste) +{ +# Write-Host "Uebergebene Taste: " $Taste +if ($AuswahlTyp -eq "txt") { + switch ($Taste){ + "Return" { + # Write-Host "Enter gedrueckt" + $Pfad = $TXTPfadFeld.Text + # Write-Host "Pfad: " $Pfad + + TXTReaktionReturn $Pfad + } + Default { + # Write-Host "Gedrueckte Taste: " $Taste + } + } +} +elseif ($AuswahlTyp -eq "ver") { + switch ($Taste) { + "Return" { + $Pfad = $VERPfadFeld.Text + + AnzeigeAktualisieren "ver" $Pfad + } + Default { + # Write-Host "Gedrueckte Taste: " $Taste + } + } +} +return +} + +Function TastenReaktionListeOrdnernamen($AuswahlTyp, $Taste) +{ +# Write-Host "Uebergebene Taste: " $Taste +if ($AuswahlTyp -eq "txt"){ + switch ($Taste){ + "Return" { + # Write-Host "Enter gedrueckt" + $Auswahl = $TXTListeOrdnernamen.SelectedItem + $Pfad = $TXTPfadFeld.Text + VerzeichnisAuswaehlen $AuswahlTyp $Pfad $Auswahl + } + "Back" { + $Pfad = $TXTPfadFeld.Text + # Pfad aktualisieren + VerzeichnisZurueck $AuswahlTyp $Pfad + } + Default { + # Write-Host "Gedrueckte Taste: " $Taste + } + } +} +elseif ($AuswahlTyp -eq "ver") { + switch ($Taste) { + "Return" { + $Auswahl = $VERListeOrdnernamen.SelectedItem + $Pfad = $VERPfadFeld.Text + VerzeichnisAuswaehlen $AuswahlTyp $Pfad $Auswahl + } + "Back" { + $Pfad = $VERPfadFeld.Text + VerzeichnisZurueck $AuswahlTyp $Pfad + } + "ShiftKey" { + $Pfad = $VERPfadFeld.Text + $Auswahl = $VERListeOrdnernamen.SelectedItem + ReaktionShiftKey $Pfad $Auswahl + } + Default { + # Write-Hoste "Gedrueckte Taste: " $Taste + } + } +} + +return +} + +Function TastenReaktionButtons($AuswahlTyp, $Taste) +{ +if ($AuswahlTyp -eq "txt") { + switch ($Taste){ + "Back" { + $Pfad = $TXTPfadFeld.Text + # Pfad aktualisieren + VerzeichnisZurueck $AuswahlTyp $Pfad + } + Default { + # Write-Host "Gedrueckte Taste: " $Taste + } + } +} +elseif ($AuswahlTyp -eq "ver") { + switch ($Taste) { + "Back" { + $Pfad = $VERPfadFeld.Text + VerzeichnisZurueck $AuswahlTyp $Pfad + } + "ShiftKey" { + $Pfad = $VERPfadFeld.Text + $Auswahl = $VERListeOrdnernamen.SelectedItem + ReaktionShiftKey $Pfad $Auswahl + } + Default { + # Write-Host "Gedrueckte Taste: " $Taste + } + } +} +return +} + +Function Optionen($AuswahlTyp, $Pfad) +{ +# Unterordner und .txt-Dateien finden +# Typzuweisung noetig, da aus unbekanntem Grund sonst Unterordner, die mit "_" beginnen, nicht gefunden werden koennen +[System.Object[]]$UnterOrdner = UnterOrdnerFinden $Pfad + +if ($AuswahlTyp -eq "txt") { + $TxtDateien = TxtDateienFinden $Pfad + #Gibt aktuell auch Index und Typ (System.IO.DirectoryInfo bzw. System.String) zurueck + $Optionen = $UnterOrdner + $TxtDateien +} +elseif ($AuswahlTyp -eq "ver") { + #Gibt aktuell auch Index und Typ (System.IO.DirectoryInfo bzw. System.String) zurueck + $Optionen = $UnterOrdner +} +return $Optionen +} + +Function PfadExistiert ($Pfad) +{ +# Um Abzufangen, dass Test-Path mit leerem Wert durchlaufen wird. Leere Verzeichnisse gelten als ungueltig. +if ($Pfad.Length -eq 0) { + return $false +} +if ($(Test-Path $Pfad -PathType Container) -or $(Test-Path $Pfad -Include "*.txt")) +{ + return $true +} +else +{ + return $false +} +} + +Function LaufwerkeFinden() +{ +$Laufwerke = $(Get-PSDrive | Where-Object {$_.Free}).Name +$i = 0 + +foreach($Laufwerk in $Laufwerke) +{ + $Laufwerke[$i] = $Laufwerk + ":\" + $i++ +} +return $Laufwerke +} + +Function UnterOrdnerFinden($Pfad) +{ +$UnterOrdner = $(Get-ChildItem $Pfad -Directory) + +if ($($UnterOrdner.Length -gt 0)) +{ + $Ordner = $(Split-Path $UnterOrdner -Leaf) +} +else { + $Ordner = "" +} + +return $Ordner +} + +Function TxtDateienFinden($Pfad) +{ +$TxtDateien = $(Get-Childitem $Pfad\*.txt) + +if ($TxtDateien.Length -gt 0) +{ + return $(Split-Path $TxtDateien -Leaf) +} +else +{ + return +} +} + +Function ReaktionShiftKey ($Pfad, $Auswahl) +{ + if (PfadExistiert $Pfad) + { + VERAuswahlBestaetigt $Pfad $Auswahl + } + else + { + AnzeigeAktualisieren "ver" "" + } + return +} + + +Function AufgabenAktualisieren ($Aufgabe) +{ + $FAListeErledigteAufgaben.Items.Add($FATextfeldAktuelleAufgabe.Text) + $FATextfeldAktuelleAufgabe.Text = $Aufgabe +} + +Function DateiBeschreibenAktualisieren +{ + $AnteilJeBeschriftung = 100 / $($FATextfeldGesamtEintraege.Text) + [System.double] $FATextfeldRealwertFortschrittsbar.Text += $AnteilJeBeschriftung + + #Da $FAFortschrittsbar.Value anscheinend ein int ist, ist der letzte Wert i. d. R. hoeher als 100 -> Fehler, der hiermit abgefangen wird + if ($([System.Double]$FATextfeldRealwertFortschrittsbar.Text) -ge 100) + { + $FAFortschrittsbar.Value = 100 + } + else + { + $FAFortschrittsbar.Value = $FATextfeldRealwertFortschrittsbar.Text + } + + + [System.Int64] $BearbeiteteEintraege = $FATextfeldBearbeiteteEintraege.Text + $BearbeiteteEintraege++ + $FATextfeldBearbeiteteEintraege.Text = $BearbeiteteEintraege +} + +#--------------------------------------- Start Funktionen fuer Einstellungen ------------------------------- + +Function PfadEinstellungsDateiHolen () { + # Koennte man eigentlich in einer Zeile machen, PS macht da aber Probleme + $AktuellesVerzeichnis = Get-Location + $PfadEinstellungsDatei = $("$AktuellesVerzeichnis\" + "EinstellungenSkriptKonvertierung.txt") + Write-Host "Pfad Einstellungsdatei in Funktion: " $PfadEinstellungsDatei + return $PfadEinstellungsDatei + + # if (Test-Path $PfadEinstellungsDatei) { + # return $PfadEinstellungsDatei + # } + # else { + # return EinstellungsDateiErstellen + # } +} + +Function InhalteEinstellungsDateiHolen () { + # Koennte man eigentlich in einer Zeile machen, PS macht da aber Probleme + $PfadEinstellungsDatei = PfadEinstellungsDateiHolen + Write-Host "Pfad Einstellungsdatei: " $PfadEinstellungsDatei + + if (Test-Path $PfadEinstellungsDatei) { + } + else { + $A = EinstellungsDateiErstellen + Write-Host "A-Holder: $A" + } + + $EinstellungsInhalte = Get-Content $PfadEinstellungsDatei + Write-Host "Dateipfad Einstellungsdatei: $PfadEinstellungsDatei" + Write-Host "Zurueckgegebene Einstellungsdatei: $EinstellungsInhalte" + return $EinstellungsInhalte +} + +Function StartPfadHolen () { + $EinstellungsZeilen = InhalteEinstellungsDateiHolen + $PfadEinstellungsDatei = PfadEinstellungsDateiHolen + + foreach ($EinstellungsZeile in $EinstellungsZeilen) { + $EinstellungsBestandteile = $EinstellungsZeile.Split("|") + if ($EinstellungsBestandteile[0] -eq "StartPfad") { + $StartPfad = $EinstellungsBestandteile[1] + return $StartPfad + } + } + + # Falls kein StartPfad gefunden wurde, soll der Pfad der Einstellungsdatei als Pfad angegeben werden + $StartPfad = Split-Path $PfadEinstellungsDatei + Add-Content $PfadEinstellungsDatei $("StartPfad|" + $StartPfad) + #Write-Host "Zurueckgegebener StartPfad: " $StartPfad + return $StartPfad +} + +Function ZielPfadHolen () { + $EinstellungsZeilen = InhalteEinstellungsDateiHolen + $PfadEinstellungsDatei = PfadEinstellungsDateiHolen + + foreach ($EinstellungsZeile in $EinstellungsZeilen) { + $EinstellungsBestandteile = $EinstellungsZeile.Split("|") + if ($EinstellungsBestandteile[0] -eq "ZielPfad") { + $ZielPfad = $EinstellungsBestandteile[1] + return $ZielPfad + } + } + + # Falls kein ZielPfad gefunden wurde, soll der Pfad des StartVerzeichnisses als Pfad angegeben werden + $ZielPfad = StartPfadHolen + Add-Content $PfadEinstellungsDatei $("ZielPfad|" + $ZielPfad) + #Write-Host "Zurueckgegebener StartPfad: " $StartPfad + return $ZielPfad +} + +Function RadioButtonHolen () { + $EinstellungsZeilen = InhalteEinstellungsDateiHolen + $PfadEinstellungsDatei = PfadEinstellungsDateiHolen + + foreach ($EinstellungsZeile in $EinstellungsZeilen) { + $EinstellungsBestandteile = $EinstellungsZeile.Split("|") + if ($EinstellungsBestandteile[0] -eq "VerzeichnisWahl") { + $RadioButton = $EinstellungsBestandteile[1] + return $RadioButton + } + } + + # Falls kein VerzeichnisWahl gefunden wurde, soll die Einstellung auf gleich gesetzt werden + Add-Content $PfadEinstellungsDatei $("VerzeichnisWahl|WieZielDatei") + return "Gleich" +} + +Function ZielDateienHolen () { + $PfadEinstellungsDatei = PfadEinstellungsDateiHolen + + # Ueberpruefen, ob Einstellungsdatei vorhanden ist, ggf. erstellen + if (Test-Path $PfadEinstellungsDatei) { + # Einstellungsdatei vorhanden -> auslesen + $EinstellungsInhalte = InhalteEinstellungsDateiHolen + foreach ($EinstellungsZeile in $EinstellungsInhalte) { + $EinstellungsInhalt = $EinstellungsZeile.Split("|") + if ($EinstellungsInhalt[0] -eq "Datei") { + $ZielDateien += @([PSCustomObject]@{ + PrefixEingang = $EinstellungsInhalt[1] + PrefixAusgang = $EinstellungsInhalt[2] + DateiName = $EinstellungsInhalt[3] + WandlungsTyp = $EinstellungsInhalt[4] + }) + } + } + $ZielDateienSicher = ZielDateienCheck $ZielDateien + return $ZielDateienSicher + } + else { + return EinstellungsDateiErstellen + } +} + +Function ZielDateienCheck ($ZielDateien) { + # Macht aktuell nur begrenzt Sinn. Haupt-Funktion: Intern die Werte korrigiern und beim speichern von neuen Werten nur richtige Werte abspeichern. Ausgegeben werden weiterhin falsche Werte! Todo + foreach ($ZielDatei in $ZielDateien) { + if ($ZielDatei.PrefixEingang.Length -gt 3) { + Write-Host "Ungewoehnlich langen Prefix bei Eingang gefunden: " $ZielDatei.PrefixEingang + $ZielDatei.PrefixEingang = $ZielDatei.PrefixEingang.Substring(0,3) + } + if ($ZielDatei.PrefixAusgang.Length -gt 3) { + Write-Host "Ungewoehnlich langen Prefix bei Ausgang gefunden: " $ZielDatei.PrefixAusgang + $ZielDatei.PrefixAusgang = $ZielDatei.PrefixAusgang.Substring(0,3) + } + if ($ZielDatei.DateiName.Length -gt 150) { + Write-Host "Gefaehrlich langer Dateiname gefunden: " $ZielDatei.DateiName + $ZielDatei.DateiName = $ZielDatei.DateiName.Substring(0,150) + } + if (($ZielDatei.WandlungsTyp -ne "TIA") -and ($ZielDatei.WandlungsTyp -ne "WSCAD") -and ($ZielDatei.WandlungsTyp -ne "Simpel")) { + Write-Host "Falschen Wandlungstyp gefunden: " $ZielDatei.WandlungsTyp + $ZielDatei.WandlungsTyp = "Simpel" + } + $GepruefteZielDateien += @([PSCustomObject]@{ + PrefixEingang = $ZielDatei.PrefixEingang + PrefixAusgang = $ZielDatei.PrefixAusgang + DateiName = $ZielDatei.DateiName + WandlungsTyp = $ZielDatei.WandlungsTyp + }) + } + return $GepruefteZielDateien +} + +Function EinstellungsDateiErstellen () { + $PfadEinstellungsDatei = PfadEinstellungsDateiHolen + + Write-Host "Funktion EinstellungsDateiErstellen ist gestartet..." + + # Todo: Umbauen: Eintraege via EinstellungsDateiAktualisieren hinzufuegen(?) + # Todo: Moegliches Problem mit der Funktion "StartVerzeichnisAktualisieren". Ueberpruefen! + + New-Item $PfadEinstellungsDatei -ItemType File + + $StartPfad = Get-Location + + $ZielDateien = @([PSCustomObject]@{ + PrefixEingang = "E" + PrefixAusgang = "A" + DateiName = "WSCAD_[Ursprungsdatei]" + WandlungsTyp = "WSCAD" + }) + $ZielDateien += @([PSCustomObject]@{ + PrefixEingang = "%I" + PrefixAusgang = "%Q" + DateiName = "TIA_[Ursprungsdatei]" + WandlungsTyp = "TIA" + }) + $ZielDateien += @([PSCustomObject]@{ + PrefixEingang = "E" + PrefixAusgang = "A" + DateiName = "EA_[Ursprungsdatei]" + WandlungsTyp = "Simpel" + }) + + Add-Content $PfadEinstellungsDatei "Hinweise zur Einstellungsdatei: " + Add-Content $PfadEinstellungsDatei "1) Jeder Eintrag wird durch senkrechte Striche (|) geteilt. Der erste Bereich gibt die Art des Eintrags an." + Add-Content $PfadEinstellungsDatei " Moegliche Werte sind 'StartPfad' und 'Datei'. Es sollte nur ein StartPfad angegeben sein. Sind mehrere Angegeben," + Add-Content $PfadEinstellungsDatei " wird der erste verwendet. Es koennen beliebig viele Dateien angegeben werden." + Add-Content $PfadEinstellungsDatei "2) Die rechte Spalte bei Dateien gibt das Konvertierungsformat fuer diese Datei an. Moeglich sind 'TIA', 'WSCAD'" + Add-Content $PfadEinstellungsDatei " und 'Simpel'. Ist ein falscher oder kein Wert angegeben, wird automatisch in 'Simpel' konvertiert." + Add-Content $PfadEinstellungsDatei "3) Die zweite Spalte von rechts bei Dateien gibt den Zieldateinamen an. Ist darin [Ursprungsdatei] enthalten," + Add-Content $PfadEinstellungsDatei " wird dieser Teil durch den Namen der txt-Datei ersetzt, von der die Daten konvertiert werden." + Add-Content $PfadEinstellungsDatei "Nutzung des Konvertierers auf eigene Gefahr und ohne Haftungsuebernahme bei Schaeden!" + + Add-Content $PfadEinstellungsDatei $("StartPfad|" + $StartPfad) + Add-Content $PfadEinstellungsDatei $("VerzeichnisWahl|WieZielDatei") + Add-Content $PfadEinstellungsDatei $("ZielPfad|" + $StartPfad) + foreach ($ZielDatei in $ZielDateien) { + Add-Content $PfadEinstellungsDatei $("Datei|" + $ZielDatei.PrefixEingang + "|" + $ZielDatei.PrefixAusgang + "|" + $ZielDatei.DateiName + "|" + $ZielDatei.WandlungsTyp) + } + + Write-Host "Funktion EinstellungsDateiErstellen ist abgeschlossen." + return $ZielDateien +} + +Function AnzeigeEinstellungenInitialisieren () +{ + # Neue Werte sollen nicht uebergeben werden, sondern aus der Einstellungsdatei ausgelesen werden, um Fehler zu vermeiden. + # Einzige Voraussetzung: es muss eine Einstellungsdatei geben! + + # Erstellen der neuen Eintraege + $EinstellungsInhalte = InhalteEinstellungsDateiHolen + + foreach ($EinstellungsZeile in $EinstellungsInhalte) { + $EinstellungsBestandteile = $EinstellungsZeile.Split("|") + if ($EinstellungsBestandteile[0] -eq "Datei") { + $ESListeEinstellungen.Rows.Add($($EinstellungsBestandteile[1]),$($EinstellungsBestandteile[2]),$($EinstellungsBestandteile[3]),$($EinstellungsBestandteile[4])) + } + } + + $StartPfad = StartPfadHolen + $ESTextfeldStartPfad.Text = $StartPfad + + # Radio-Button Einstellung und daraus folgend Anzeige der Zielverzeichnis-Schaltfläche + $RadioButton = RadioButtonHolen + switch ($RadioButton) { + EigenerPfad { + $ESRadioButtonEigenerPfad.Checked = $true + $TabSeiteEigenschaften.Controls.Add($ESTextfeld3) + $TabSeiteEigenschaften.Controls.Add($ESTextfeldZielPfad) + $TabSeiteEigenschaften.Controls.Add($ESZielPfadAendernButton) + $ZielPfad = ZielPfadHolen + $ESTextfeldZielPfad.Text = $ZielPfad + } + WieTXT { + $ESRadioButtonWieTXT.Checked = $true + } + WieZielDatei { + $ESRadioButtonWieZieldatei.Checked = $true + } + Default { + $ESRadioButtonWieZieldatei.Checked = $true + } + } +} + +Function VerzeichnisAendern ($Bereich) +{ + $Explorer = New-Object System.Windows.Forms.FolderBrowserDialog + $Explorer.ShowDialog() + $Pfad = $Explorer.SelectedPath + $DateiInhalt = InhalteEinstellungsDateiHolen + $PfadEinstellungsDatei = PfadEinstellungsDateiHolen + Clear-Content $PfadEinstellungsDatei + + foreach ($DateiZeile in $DateiInhalt) { + $DateiBestandTeile = $DateiZeile.Split("|") + if ($DateiBestandTeile[0] -eq $Bereich) { + $DateiBestandTeile[1] = $Pfad + $DateiZeile = $($DateiBestandTeile[0] + "|" + $DateiBestandTeile[1]) + } + Write-Host "DateiZeile: " $DateiZeile + Add-Content $PfadEinstellungsDatei $DateiZeile + } + + # Ansichten aktualisieren zum neuen Startverzeichnis + AnzeigeAktualisieren "txt" $Pfad + VERVorauswahlAnzeigeAktualisieren + $ESTextfeldStartPfad.Text = $Pfad +} + +Function RadioButtonSpeichern () { + # Todo + # In Einstellungsdatei speichern + # Todo: Inhalte erzeugen (if, elseif, else) + + $DateiInhalt = InhalteEinstellungsDateiHolen + $PfadEinstellungsDatei = PfadEinstellungsDateiHolen + Clear-Content $PfadEinstellungsDatei + + foreach ($DateiZeile in $DateiInhalt) { + $DateiBestandTeile = $DateiZeile.Split("|") + if ($DateiBestandTeile[0] -eq "VerzeichnisWahl") { + $DateiBestandTeile[1] = $Pfad + $DateiZeile = $($DateiBestandTeile[0] + "|" + $DateiBestandTeile[1]) + } + Write-Host "DateiZeile: " $DateiZeile + Add-Content $PfadEinstellungsDatei $DateiZeile + } + # Ansicht Einstellungen ggf. ausblenden + # Ansicht ver aktualisieren +} + +Function EinstellungsDateiAktualisieren () +{ + # Erstellen von $ZielDateien + for ($i = 0; $i -lt ($ESListeEinstellungen.RowCount-1); $i++) { + $ZielDateien += @([PSCustomObject]@{ + PrefixEingang = $ESListeEinstellungen.Rows[$i].Cells[0].Value + PrefixAusgang = $ESListeEinstellungen.Rows[$i].Cells[1].Value + DateiName = $ESListeEinstellungen.Rows[$i].Cells[2].Value + WandlungsTyp = $ESListeEinstellungen.Rows[$i].Cells[3].Value + }) + } + $ZielDateien = ZielDateienCheck $ZielDateien + Write-Host "ZielDateien: " $ZielDateien + + # Schreiben in Einstellungsdatei + $StartPfad = StartPfadHolen + $PfadEinstellungsDatei = PfadEinstellungsDateiHolen + + # Loeschen der Inhalte der Einstellungsdatei + Clear-Content $PfadEinstellungsDatei + Write-Host "StartPfad: " $StartPfad " Pfad Einstellungsdatei: " $PfadEinstellungsDatei + Add-Content $PfadEinstellungsDatei $("StartPfad|" + $StartPfad) + foreach ($ZielDatei in $ZielDateien) { + Add-Content $PfadEinstellungsDatei $("Datei|" + $ZielDatei.PrefixEingang + "|" + $ZielDatei.PrefixAusgang + "|" + $ZielDatei.DateiName + "|" + $ZielDatei.WandlungsTyp) + } + + # Anzeige in Einstellungen aktualisieren + # UngespeichterteAenderungen reseten! +} + + +#--------------------------------------- Ende Funktionen fuer GUI ------------------------------- + +Function ExcelDateiNameErstellen ($EingestellterName, $PfadUrsprungsdatei, $PfadZielDatei) +{ + $NameUrsprungsdatei = Split-Path $PfadUrsprungsdatei -Leaf + $NameUrsprungsdateiLaenge = $NameUrsprungsdatei.Length + $NameUrsprungsdateiKurz = $NameUrsprungsdatei.Substring(0, $($NameUrsprungsdateiLaenge - 4)) + + $GesamtPfadZielDatei = $PfadZielDatei + "\" + $EingestellterName.Replace("[Ursprungsdatei]",$NameUrsprungsdateiKurz) + ".xlsx" + + return $GesamtPfadZielDatei +} + +Function ExcelDateiErstellen ($DateiPfad) +{ + $Datei = New-Object -ComObject Excel.Application + $Mappe = $Datei.Workbooks.Add() + $Mappe.SaveAs($DateiPfad) + $Datei.Quit() + + return +} + +Function ExcelDateiBeschreibenSimpel ($PfadUrsprungsdatei, $PrefixEingang, $PrefixAusgang, $ZielDatei) +{ + $Datei = New-Object -ComObject Excel.Application + $Mappe = $Datei.Workbooks.Open($ZielDatei) + $Blatt = $Mappe.WorkSheets.item(1) + $Datei.Visible = $false + + $i = 1 + $Eingaenge = @() + $ZuEingang = @("FDI", "B", "S", "E", "I", "DI", "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BJ", "BK", "BL", "BM", "BN", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", "FA", "FB", "FC", "FD", "FE", "FF", "FG", "FH", "FJ", "FK", "FL", "FM", "FN", "FP", "FQ", "FR", "FS", "FT", "FU", "FV", "FW", "FX", "FY", "FZ", "SA", "SB", "SC", "SD", "SE", "SF", "SG", "SH", "SJ", "SK", "SL", "SM", "SN", "SP", "SQ", "SR", "SS", "ST", "SU", "SV", "SW", "SX", "SY", "SZ") + $Ausgaenge = @() + $ZuAusgang = @("K", "O", "Q", "M", "A", "P", "DQ", "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CJ", "CK", "CL", "CM", "CN", "CP", "CQ", "CR", "CS", "CT", "CU", "CV", "CW", "CX", "CY", "CZ", "EA", "EB", "EC", "ED", "EE", "EF", "EG", "EH", "EJ", "EK", "EL", "EM", "EN", "EP", "EQ", "ER", "ES", "ET", "EU", "EV", "EW", "EX", "EY", "EZ", "GA", "GB", "GC", "GD", "GE", "GF", "GG", "GH", "GJ", "GK", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GV", "GW", "GX", "GY", "GZ", "HA", "HB", "HC", "HD", "HE", "HF", "HG", "HH", "HJ", "HK", "HL", "HM", "HN", "HP", "HQ", "HR", "HS", "HT", "HU", "HV", "HW", "HX", "HY", "HZ", "KA", "KB", "KC", "KD", "KE", "KF", "KG", "KH", "KJ", "KK", "KL", "KM", "KN", "KP", "KQ", "KR", "KS", "KT", "KU", "KV", "KW", "KX", "KY", "KZ", "MA", "MB", "MC", "MD", "ME", "MF", "MG", "MH", "MJ", "MK", "ML", "MM", "MN", "MP", "MQ", "MR", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "PA", "PB", "PC", "PD", "PE", "PF", "PG", "PH", "PJ", "PK", "PL", "PM", "PN", "PP", "PQ", "PR", "PS", "PT", "PU", "PV", "PW", "PX", "PY", "PZ", "QA", "QB", "QC", "QD", "QE", "QF", "QG", "QH", "QJ", "QK", "QL", "QM", "QN", "QP", "QQ", "QR", "QS", "QT", "QU", "QV", "QW", "QX", "QY", "QZ", "RA", "RB", "RC", "RD", "RE", "RF", "RG", "RH", "RJ", "RK", "RL", "RM", "RN", "RP", "RQ", "RR", "RS", "RT", "RU", "RV", "RW", "RX", "RY", "RZ", "TA", "TB", "TC", "TD", "TE", "TF", "TG", "TH", "TJ", "TK", "TL", "TM", "TN", "TP", "TQ", "TR", "TS", "TT", "TU", "TV", "TW", "TX", "TY", "TZ") + $Fehler = @() + + $Ursprungdatei = Get-Content $PfadUrsprungsdatei + + foreach ($Eintrag in $Ursprungdatei) + { + $Eintragszeile = $Eintrag.Split("'") + $BMKZahl = $Eintragszeile[1] + $BMKZahl = $BMKZahl.TrimStart("'") + $Kommentar = $Eintragszeile[3] + $Kommentar = $Kommentar.TrimEnd("'") + + if ($($($BMKZahl -replace "[\d]") -in $ZuEingang)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $PrefixEingang + $BMKZahl + $Eingaenge += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + elseif ($($($BMKZahl -replace "[\d]") -in $ZuAusgang)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $PrefixAusgang + $BMKZahl + $Ausgaenge += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + else + { + Write-Host "Achtung, Fehler bei " $BMKZahl $Kommentar + $Fehler += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + + # Write-Host "In Excel schreiben: BMKZahl: " $BMKZahl " Kommentar: " $Kommentar + $Blatt.Cells.Item($i,1) = $BMKZahl + $Blatt.Cells.Item($i,2) = $Kommentar + + $i++ + + DateiBeschreibenAktualisieren + } + + $Mappe.Save() + $Datei.Quit() + + $GleicheEingaenge = GleicheFinden $Eingaenge + $GleicheAusgaenge = GleicheFinden $Ausgaenge + Write-Host "Gleiche fuer " $PrefixEingang ": " $GleicheEingaenge + Write-Host "Gleiche fuer " $PrefixAusgang ": " $GleicheAusgaenge + Write-Host "Fehler bei: " $Fehler + + if ( $($Fehler.Length -eq 0)) + { + $Fehler += @([PSCustomObject]@{ + Name = "Keine" + Zeile = "Alle" + }) + } + + return $GleicheEingaenge, $GleicheAusgaenge, $Fehler +} + +Function ExcelDateiBeschreibenTIA ($PfadUrsprungsdatei, $PrefixEingang, $PrefixAusgang, $ZielDatei) +{ + $Datei = New-Object -ComObject Excel.Application + $Mappe = $Datei.Workbooks.Open($ZielDatei) + $Blatt = $Mappe.WorkSheets.item(1) + $Datei.Visible = $false + + $i = 2 + $Eingaenge = @() + $ZuEingang = @("FDI", "B", "S", "E", "I", "DI", "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BJ", "BK", "BL", "BM", "BN", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", "FA", "FB", "FC", "FD", "FE", "FF", "FG", "FH", "FJ", "FK", "FL", "FM", "FN", "FP", "FQ", "FR", "FS", "FT", "FU", "FV", "FW", "FX", "FY", "FZ", "SA", "SB", "SC", "SD", "SE", "SF", "SG", "SH", "SJ", "SK", "SL", "SM", "SN", "SP", "SQ", "SR", "SS", "ST", "SU", "SV", "SW", "SX", "SY", "SZ") + $Ausgaenge = @() + $ZuAusgang = @("K", "O", "Q,", "M", "A", "P", "DQ", "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CJ", "CK", "CL", "CM", "CN", "CP", "CQ", "CR", "CS", "CT", "CU", "CV", "CW", "CX", "CY", "CZ", "EA", "EB", "EC", "ED", "EE", "EF", "EG", "EH", "EJ", "EK", "EL", "EM", "EN", "EP", "EQ", "ER", "ES", "ET", "EU", "EV", "EW", "EX", "EY", "EZ", "GA", "GB", "GC", "GD", "GE", "GF", "GG", "GH", "GJ", "GK", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GV", "GW", "GX", "GY", "GZ", "HA", "HB", "HC", "HD", "HE", "HF", "HG", "HH", "HJ", "HK", "HL", "HM", "HN", "HP", "HQ", "HR", "HS", "HT", "HU", "HV", "HW", "HX", "HY", "HZ", "KA", "KB", "KC", "KD", "KE", "KF", "KG", "KH", "KJ", "KK", "KL", "KM", "KN", "KP", "KQ", "KR", "KS", "KT", "KU", "KV", "KW", "KX", "KY", "KZ", "MA", "MB", "MC", "MD", "ME", "MF", "MG", "MH", "MJ", "MK", "ML", "MM", "MN", "MP", "MQ", "MR", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "PA", "PB", "PC", "PD", "PE", "PF", "PG", "PH", "PJ", "PK", "PL", "PM", "PN", "PP", "PQ", "PR", "PS", "PT", "PU", "PV", "PW", "PX", "PY", "PZ", "QA", "QB", "QC", "QD", "QE", "QF", "QG", "QH", "QJ", "QK", "QL", "QM", "QN", "QP", "QQ", "QR", "QS", "QT", "QU", "QV", "QW", "QX", "QY", "QZ", "RA", "RB", "RC", "RD", "RE", "RF", "RG", "RH", "RJ", "RK", "RL", "RM", "RN", "RP", "RQ", "RR", "RS", "RT", "RU", "RV", "RW", "RX", "RY", "RZ", "TA", "TB", "TC", "TD", "TE", "TF", "TG", "TH", "TJ", "TK", "TL", "TM", "TN", "TP", "TQ", "TR", "TS", "TT", "TU", "TV", "TW", "TX", "TY", "TZ") + $Fehler = @() + + $Blatt.Cells.Item(1,1) = "Name" + $Blatt.Cells.Item(1,2) = "Path" + $Blatt.Cells.Item(1,3) = "Data Type" + $Blatt.Cells.Item(1,4) = "Logical Address" + $Blatt.Cells.Item(1,5) = "Comment" + $Blatt.Cells.Item(1,6) = "Hmi Visible" + $Blatt.Cells.Item(1,7) = "Hmi Accessible" + $Blatt.Cells.Item(1,8) = "Hmi Writeable" + $Blatt.Cells.Item(1,9) = "Typeobject ID" + $Blatt.Cells.Item(1,10) = "Version ID" + #Todo: Zweites Tabellenblatt (s. Beispiel-Export von Christian) benoetigt? + #Todo: Muss/Soll Tabellblatt 1 "PLC Tags" heißen? (s. Beispiel-Export von Christian) + + $Ursprungdatei = Get-Content $PfadUrsprungsdatei + + foreach ($Eintrag in $Ursprungdatei) + { + $Eintragszeile = $Eintrag.Split("'") + $BMKZahl = $Eintragszeile[1] + $BMKZahl = $BMKZahl.TrimStart("'") + $BMKZahlOriginal = $BMKZahl + $Kommentar = $Eintragszeile[3] + $Kommentar = $Kommentar.TrimEnd("'") + + if ($($($BMKZahl -replace "[\d]") -in $ZuEingang)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $PrefixEingang + $BMKZahl + $Eingaenge += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + elseif ($($($BMKZahl -replace "[\d]") -in $ZuAusgang)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $PrefixAusgang + $BMKZahl + $Ausgaenge += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + else + { + Write-Host "Achtung, Fehler bei " $BMKZahl $Kommentar + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $Fehler += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + + #Write-Host "In Excel schreiben: BMKZahl: " $BMKZahl " Kommentar: " $Kommentar " BMKZahlOriginal: " $BMKZahlOriginal + $Blatt.Cells.Item($i,1) = $BMKZahlOriginal #Name + $Blatt.Cells.Item($i,2) = "WSCAD-Export" #Path + $Blatt.Cells.Item($i,3) = "Bool" #Data Type + $Blatt.Cells.Item($i,4) = $BMKZahl #Logical Address + $Blatt.Cells.Item($i,5) = $Kommentar #Comment + $Blatt.Cells.Item($i,6) = "'True" #Hmi Visible + $Blatt.Cells.Item($i,7) = "'True" #Hmi Accessible + $Blatt.Cells.Item($i,8) = "'True" #Hmi Writeable + #$Blatt.Cells.Item($i,9) = "" #Typeobject ID + #$Blatt.Cells.Item($i,10) = "" #Version ID + + $i++ + + DateiBeschreibenAktualisieren + } + + $Mappe.Save() + $Datei.Quit() + + $GleicheEingaenge = GleicheFinden $Eingaenge + $GleicheAusgaenge = GleicheFinden $Ausgaenge + Write-Host "Gleiche fuer " $PrefixEingang ": " $GleicheEingaenge + Write-Host "Gleiche fuer " $PrefixAusgang ": " $GleicheAusgaenge + Write-Host "Fehler bei: " $Fehler + + if ( $($Fehler.Length -eq 0)) + { + $Fehler += @([PSCustomObject]@{ + Name = "Keine" + Zeile = "Alle" + }) + } + + return $GleicheEingaenge, $GleicheAusgaenge, $Fehler +} + +Function ExcelDateiBeschreibenWSCAD ($PfadUrsprungsdatei, $PrefixEingang, $PrefixAusgang, $ZielDatei) +{ + $Datei = New-Object -ComObject Excel.Application + $Mappe = $Datei.Workbooks.Open($ZielDatei) + $Blatt = $Mappe.WorkSheets.item(1) + $Datei.Visible = $false + + $i = 2 + $Eingaenge = @() + $ZuEingang = @("FDI", "B", "S", "E", "I", "DI", "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BJ", "BK", "BL", "BM", "BN", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", "FA", "FB", "FC", "FD", "FE", "FF", "FG", "FH", "FJ", "FK", "FL", "FM", "FN", "FP", "FQ", "FR", "FS", "FT", "FU", "FV", "FW", "FX", "FY", "FZ", "SA", "SB", "SC", "SD", "SE", "SF", "SG", "SH", "SJ", "SK", "SL", "SM", "SN", "SP", "SQ", "SR", "SS", "ST", "SU", "SV", "SW", "SX", "SY", "SZ") + $Ausgaenge = @() + $ZuAusgang = @("K", "O", "Q,", "M", "A", "P", "DQ", "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CJ", "CK", "CL", "CM", "CN", "CP", "CQ", "CR", "CS", "CT", "CU", "CV", "CW", "CX", "CY", "CZ", "EA", "EB", "EC", "ED", "EE", "EF", "EG", "EH", "EJ", "EK", "EL", "EM", "EN", "EP", "EQ", "ER", "ES", "ET", "EU", "EV", "EW", "EX", "EY", "EZ", "GA", "GB", "GC", "GD", "GE", "GF", "GG", "GH", "GJ", "GK", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GV", "GW", "GX", "GY", "GZ", "HA", "HB", "HC", "HD", "HE", "HF", "HG", "HH", "HJ", "HK", "HL", "HM", "HN", "HP", "HQ", "HR", "HS", "HT", "HU", "HV", "HW", "HX", "HY", "HZ", "KA", "KB", "KC", "KD", "KE", "KF", "KG", "KH", "KJ", "KK", "KL", "KM", "KN", "KP", "KQ", "KR", "KS", "KT", "KU", "KV", "KW", "KX", "KY", "KZ", "MA", "MB", "MC", "MD", "ME", "MF", "MG", "MH", "MJ", "MK", "ML", "MM", "MN", "MP", "MQ", "MR", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "PA", "PB", "PC", "PD", "PE", "PF", "PG", "PH", "PJ", "PK", "PL", "PM", "PN", "PP", "PQ", "PR", "PS", "PT", "PU", "PV", "PW", "PX", "PY", "PZ", "QA", "QB", "QC", "QD", "QE", "QF", "QG", "QH", "QJ", "QK", "QL", "QM", "QN", "QP", "QQ", "QR", "QS", "QT", "QU", "QV", "QW", "QX", "QY", "QZ", "RA", "RB", "RC", "RD", "RE", "RF", "RG", "RH", "RJ", "RK", "RL", "RM", "RN", "RP", "RQ", "RR", "RS", "RT", "RU", "RV", "RW", "RX", "RY", "RZ", "TA", "TB", "TC", "TD", "TE", "TF", "TG", "TH", "TJ", "TK", "TL", "TM", "TN", "TP", "TQ", "TR", "TS", "TT", "TU", "TV", "TW", "TX", "TY", "TZ") + $Fehler = @() + + $Blatt.Cells.Item(1,1) = "Anschluss" + $Blatt.Cells.Item(1,2) = "Kommentar" + $Blatt.Cells.Item(1,3) = "Symboltext" + $Blatt.Cells.Item(1,4) = "Bezug" + $Blatt.Cells.Item(1,5) = "Sondertext 1" + $Blatt.Cells.Item(1,6) = "Sondertext 2" + $Blatt.Cells.Item(1,7) = "Sondertext 3" + $Blatt.Cells.Item(1,8) = "Sondertext 4" + $Blatt.Cells.Item(1,9) = "Sondertext 5" + $Blatt.Cells.Item(1,10) = "Sondertext 6" + $Blatt.Cells.Item(1,11) = "Sondertext 7" + $Blatt.Cells.Item(1,12) = "Sondertext 8" + + $Ursprungdatei = Get-Content $PfadUrsprungsdatei + + foreach ($Eintrag in $Ursprungdatei) + { + $Eintragszeile = $Eintrag.Split("'") + $BMKZahl = $Eintragszeile[1] + $BMKZahl = $BMKZahl.TrimStart("'") + $Kommentar = $Eintragszeile[3] + $Kommentar = $Kommentar.TrimEnd("'") + + if ($($($BMKZahl -replace "[\d]") -in $ZuEingang)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $PrefixEingang + $BMKZahl + $Eingaenge += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + elseif ($($($BMKZahl -replace "[\d]") -in $ZuAusgang)) + { + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $PrefixAusgang + $BMKZahl + $Ausgaenge += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + else + { + Write-Host "Achtung, Fehler bei " $BMKZahl $Kommentar + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $Fehler += @([PSCustomObject]@{ + Name = $BMKZahl + Zeile = $i + }) + } + + #Write-Host "In Excel schreiben: BMKZahl: " $BMKZahl " Kommentar: " $Kommentar + $Blatt.Cells.Item($i,1) = $BMKZahl #Anschluss Todo: Passt das so? In Muster ist die Zahl der BMKZahl teilweise nur zweistellig; es kommen außerdem auch "X", "P" und "C" vor + $Blatt.Cells.Item($i,2) = $Kommentar #Kommentar Todo: Passt das so? In Muster teilweise leer(?) + #$Blatt.Cells.Item($i,3) = "" #Symboltext + #$Blatt.Cells.Item($i,4) = "" #Bezug + + $i++ + + DateiBeschreibenAktualisieren + } + + $Mappe.Save() + $Datei.Quit() + + $GleicheEingaenge = GleicheFinden $Eingaenge + $GleicheAusgaenge = GleicheFinden $Ausgaenge + Write-Host "Gleiche fuer " $PrefixEingang ": " $GleicheEingaenge + Write-Host "Gleiche fuer " $PrefixAusgang ": " $GleicheAusgaenge + Write-Host "Fehler bei: " $Fehler + + if ( $($Fehler.Length -eq 0)) + { + $Fehler += @([PSCustomObject]@{ + Name = "Keine" + Zeile = "Alle" + }) + } + + return $GleicheEingaenge, $GleicheAusgaenge, $Fehler +} + +Function GleicheFinden ($ZuUeberpruefen) +{ + $ZuUeberpruefen = $ZuUeberpruefen | Sort-Object "Name" + $Gleiche = @() + for ($i = 0; $i -lt $($ZuUeberpruefen.Count - 1); $i++) + { + $IstGleich = $($ZuUeberpruefen[$i].Name -eq $ZuUeberpruefen[$($i+1)].Name) + if ($IstGleich) + { + # Eintrag hinzufuegen + if (-not $($Gleiche[-1].Zeile -eq $ZuUeberpruefen[$i].Zeile)) + { + $Gleiche += $ZuUeberpruefen[$i] + } + $Gleiche += $ZuUeberpruefen[$($i+1)] + #Write-Host "Gleiche: " $Gleiche + } + } + + if ( $($Gleiche.Length -eq 0)) + { + $Gleiche += @([PSCustomObject]@{ + Name = "Keine" + Zeile = "Alle" + }) + } + + return $Gleiche +} + + +Main \ No newline at end of file diff --git a/Test-Skripte/GUI-Angepasst6.ps1 b/Test-Skripte/GUI-Angepasst6.ps1 new file mode 100644 index 0000000..320eb53 --- /dev/null +++ b/Test-Skripte/GUI-Angepasst6.ps1 @@ -0,0 +1,2142 @@ +Function Main +{ + #Generieren des StartPfades, damit dieser im GUI direkt angezeigt wird + $StartPfad = StartPfadHolen + GUI $StartPfad +} + +Function GUI ($StartPfad) +{ + [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") + [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") + + #Eigenschaften Fenster + $Fenster = New-Object System.Windows.Forms.Form + $Fenster.Size = New-Object System.Drawing.Size(940,660) #Breite, Hoehe + $Fenster.StartPosition = "CenterScreen" + $Fenster.KeyPreview = $true # was macht das? + $Fenster.MaximumSize = $Fenster.Size # legt fest, dass Groesse des Fensters nicht veraendert werden kann + $Fenster.MinimumSize = $Fenster.Size + $Fenster.Text = "Dateikonvertierer I/O" + + #Eigenschaften Tabs + $TabBasis = New-Object System.Windows.Forms.TabControl + $TabBasis.Location = New-Object System.Drawing.Size(10,10) + $TabBasis.Size = New-Object System.Drawing.Size(900,600) + $TabBasis.DataBindings.DefaultDataSourceUpdateMode = 0 # Was macht das? + $Fenster.Controls.Add($TabBasis) + + # Tab: TXT-Pfad auswaehlen + $TabSeiteTXTAuswaehlen = New-Object System.Windows.Forms.TabPage + $TabSeiteTXTAuswaehlen.TabIndex = 0 + $TabSeiteTXTAuswaehlen.UseVisualStyleBackColor = $true + $TabSeiteTXTAuswaehlen.Text = "txt-Datei Auswaehlen" + $TabSeiteTXTAuswaehlen.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteTXTAuswaehlen) + + # TXTPfadFeld + $TXTPfadFeld = New-Object System.Windows.Forms.TextBox + $TXTPfadFeld.Location = New-Object System.Drawing.Size(10,10) + $TXTPfadFeld.Size = New-Object System.Drawing.Size(860,20) + $TXTPfadFeld.Add_KeyDown({ + # Reaktion bei gedrueckter Taste + $Taste = $_.KeyCode + TastenReaktionPfadFeld "txt" $Taste + }) + $TabSeiteTXTAuswaehlen.Controls.Add($TXTPfadFeld) + + # TXTListeOrdnernamen + $TXTListeOrdnernamen = New-Object System.Windows.Forms.ListBox + $TXTListeOrdnernamen.Location = New-Object System.Drawing.Size(10,40) + $TXTListeOrdnernamen.Size = New-Object System.Drawing.Size(860,20) + $TXTListeOrdnernamen.Height = 450 + $TXTListeOrdnernamen.Font = New-Object System.Drawing.Font("Arial",12,[System.Drawing.FontStyle]::Regular) + $TXTListeOrdnernamen.Add_DoubleClick({ + # Variablen bestimmen zur uebergabe + $Auswahl = $TXTListeOrdnernamen.SelectedItem + $Pfad = $TXTPfadFeld.Text + # Pfad aktualisieren + VerzeichnisAuswaehlen "txt" $Pfad $Auswahl + }) + $TXTListeOrdnernamen.Add_KeyDown({ + # Reaktion bei gedrueckter Taste + $Taste = $_.KeyCode + TastenReaktionListeOrdnernamen "txt" $Taste + }) + $TabSeiteTXTAuswaehlen.Controls.Add($TXTListeOrdnernamen) + + # ZurueckButton + $TXTZurueckButton = New-Object System.Windows.Forms.Button + $TXTZurueckButton.Location = New-Object System.Drawing.Size(10,500) + $TXTZurueckButton.Size = New-Object System.Drawing.Size(100,30) + $TXTZurueckButton.Text = "Zurueck" + $TXTZurueckButton.Add_Click({ + $Pfad = $TXTPfadFeld.Text + #Pfad aktualisieren + VerzeichnisZurueck "txt" $Pfad + }) + $TXTZurueckButton.Add_KeyDown({ + # Reaktion bei gedrueckter Taste + $Taste = $_.KeyCode + TastenReaktionButtons "txt" $Taste + }) + $TabSeiteTXTAuswaehlen.Controls.Add($TXTZurueckButton) + + # AuswaehlenButton + $TXTAuswaehlenButton = New-Object System.Windows.Forms.Button + $TXTAuswaehlenButton.Location = New-Object System.Drawing.Size(750,500) + $TXTAuswaehlenButton.Size = New-Object System.Drawing.Size(100,30) + $TXTAuswaehlenButton.Text = "Auswaehlen" + $TXTAuswaehlenButton.Add_Click({ + # Variablen bestimmen zur uebergabe + $Auswahl = $TXTListeOrdnernamen.SelectedItem + $Pfad= $TXTPfadFeld.Text + # Pfad aktualisieren + VerzeichnisAuswaehlen "txt" $Pfad $Auswahl + }) + $TXTAuswaehlenButton.Add_KeyDown({ + # Reaktion bei gedrueckter Taste + $Taste = $_.KeyCode + TastenReaktionButtons "txt" $Taste + }) + $TabSeiteTXTAuswaehlen.Controls.Add($TXTAuswaehlenButton) + + #Mit dieser Variable sollen ungewollt zurueckgegebene Werte der Funktion abgefangen werden, um Probleme im spaeteren Programmverlauf zu verhindern + $A = AnzeigeAktualisieren "txt" $StartPfad # Ohne dem Aufruf kann kein Startverzeichnis uebergeben werden. Wird der Aufruf keiner Variable zugewiesen verursacht dies Fehler bei der Rueckgabe. + + # Tab: Zielverzeichnis auswaehlen + $TabSeiteZielVerzeichnisAuswaehlen = New-Object System.Windows.Forms.TabPage + $TabSeiteZielVerzeichnisAuswaehlen.TabIndex = 1 + $TabSeiteZielVerzeichnisAuswaehlen.UseVisualStyleBackColor = $true + $TabSeiteZielVerzeichnisAuswaehlen.Text = "Zielverzeichnis Auswaehlen" + $TabSeiteZielVerzeichnisAuswaehlen.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteZielVerzeichnisAuswaehlen) + + # PfadFeld + $VERPfadFeld = New-Object System.Windows.Forms.TextBox + $VERPfadFeld.Location = New-Object System.Drawing.Size(10,10) + $VERPfadFeld.Size = New-Object System.Drawing.Size(860,20) + $VERPfadFeld.Add_KeyDown({ + # Reaktion bei gedrueckter Taste + $Taste = $_.KeyCode + TastenReaktionPfadFeld "ver" $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERPfadFeld) + + # ListeOrdnernamen + $VERListeOrdnernamen = New-Object System.Windows.Forms.ListBox + $VERListeOrdnernamen.Location = New-Object System.Drawing.Size(10,40) + $VERListeOrdnernamen.Size = New-Object System.Drawing.Size(860,20) + $VERListeOrdnernamen.Height = 450 + $VERListeOrdnernamen.Font = New-Object System.Drawing.Font("Arial",12,[System.Drawing.FontStyle]::Regular) + $VERListeOrdnernamen.Add_DoubleClick({ + # Variablen bestimmen zur uebergabe + $Auswahl = $VERListeOrdnernamen.SelectedItem + $Pfad = $VERPfadFeld.Text + # Pfad aktualisieren + VerzeichnisAuswaehlen "ver" $Pfad $Auswahl + }) + $VERListeOrdnernamen.Add_KeyDown({ + # Reaktion bei gedrueckter Taste + $Taste = $_.KeyCode + TastenReaktionListeOrdnernamen "ver" $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERListeOrdnernamen) + + # ZurueckButton + $VERZurueckButton = New-Object System.Windows.Forms.Button + $VERZurueckButton.Location = New-Object System.Drawing.Size(10,500) + $VERZurueckButton.Size = New-Object System.Drawing.Size(100,30) + $VERZurueckButton.Text = "Zurueck" + $VERZurueckButton.Add_Click({ + $Pfad = $VERPfadFeld.Text + #Pfad aktualisieren + VerzeichnisZurueck "ver" $Pfad + }) + $VERZurueckButton.Add_KeyDown({ + # Reaktion bei gedrueckter Taste + $Taste = $_.KeyCode + TastenReaktionButtons "ver" $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERZurueckButton) + + # AuswaehlenButton + $VERAuswaehlenButton = New-Object System.Windows.Forms.Button + $VERAuswaehlenButton.Location = New-Object System.Drawing.Size(630,500) + $VERAuswaehlenButton.Size = New-Object System.Drawing.Size(100,30) + $VERAuswaehlenButton.Text = "Auswaehlen" + $VERAuswaehlenButton.Add_Click({ + # Variablen bestimmen zur uebergabe + $Auswahl = $VERListeOrdnernamen.SelectedItem + $Pfad = $VERPfadFeld.Text + if ($($VERListeOrdnernamen.Items[0] -eq "")) + { + VERAuswahlBestaetigt $Pfad $Auswahl + } + else + { + # Pfad aktualisieren + VerzeichnisAuswaehlen "ver" $Pfad $Auswahl + } + }) + $VERAuswaehlenButton.Add_KeyDown({ + # Reaktion bei gedrueckter Taste + $Taste = $_.KeyCode + TastenReaktionButtons "ver" $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERAuswaehlenButton) + + # BestaetigenButton + $VERBestaetigenButton = New-Object System.Windows.Forms.Button + $VERBestaetigenButton.Location = New-Object System.Drawing.Size(750,500) + $VERBestaetigenButton.Size = New-Object System.Drawing.Size(100,30) + $VERBestaetigenButton.Text = "Bestaetigen" + $VERBestaetigenButton.Add_Click({ + $Auswahl = $VERListeOrdnernamen.SelectedItem + $Pfad = $VERPfadFeld.Text + VERAuswahlBestaetigt $Pfad $Auswahl + }) + $VERBestaetigenButton.Add_KeyDown({ + # Reaktion bei gedrueckter Taste + $Taste = $_.KeyCode + TastenReaktionButtons "ver" $Taste + }) + $TabSeiteZielVerzeichnisAuswaehlen.Controls.Add($VERBestaetigenButton) + + # Tab: Ausgabe Fortschritt + $TabSeiteFortschrittsanzeige = New-Object System.Windows.Forms.TabPage + $TabSeiteFortschrittsanzeige.TabIndex = 2 + $TabSeiteFortschrittsanzeige.UseVisualStyleBackColor = $true + $TabSeiteFortschrittsanzeige.Text = "Bearbeitungsfortschritt" + $TabSeiteFortschrittsanzeige.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteFortschrittsanzeige) + + #Textfeld fuer Konstante "Aktuelle Aufgabe" + $FATextfeld1 = New-Object System.Windows.Forms.Label + $FATextfeld1.Location = New-Object System.Drawing.Size(10,10) + $FATextfeld1.Size = New-Object System.Drawing.Size(130,20) + $FATextfeld1.Text = "Aktuelle Aufgabe" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld1) + + #Textfeld fuer Konstante "Erledigte Aufgaben" + $FATextfeld2 = New-Object System.Windows.Forms.Label + $FATextfeld2.Location = New-Object System.Drawing.Size(10,55) + $FATextfeld2.Size = New-Object System.Drawing.Size(430,20) + $FATextfeld2.Text = "Erledigte Aufgaben" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld2) + + #TextfeldAktuelleAufgabe + $FATextfeldAktuelleAufgabe = New-Object System.Windows.Forms.Label + $FATextfeldAktuelleAufgabe.Location = New-Object System.Drawing.Size(150,10) + $FATextfeldAktuelleAufgabe.Size = New-Object System.Drawing.Size(710,60) + $FATextfeldAktuelleAufgabe.Font = New-Object System.Drawing.Font("Arial",13,[System.Drawing.FontStyle]::Regular) + $FATextfeldAktuelleAufgabe.Text = "txt-Datei auswaehlen" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeldAktuelleAufgabe) + + #ListeErledigteAufgaben + $FAListeErledigteAufgaben = New-Object System.Windows.Forms.ListBox + $FAListeErledigteAufgaben.Location = New-Object System.Drawing.Size(10,85) + $FAListeErledigteAufgaben.Size = New-Object System.Drawing.Size(860,20) + $FAListeErledigteAufgaben.Height = 200 + $FAListeErledigteAufgaben.Font = New-Object System.Drawing.Font("Arial",12,[System.Drawing.FontStyle]::Regular) + $TabSeiteFortschrittsanzeige.Controls.Add($FAListeErledigteAufgaben) + + #Textfeld fuer Konstante "Fortschritt Excel-Dateien beschreiben" + $FATextfeld3 = New-Object System.Windows.Forms.Label + $FATextfeld3.Location = New-Object System.Drawing.Size(10,300) + $FATextfeld3.Size = New-Object System.Drawing.Size(430,20) + $FATextfeld3.Text = "Fortschritt Excel-Dateien beschreiben" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld3) + + #Fortschrittsbar fuer das Schreiben von Werten in die Excel-Tabelle + $FAFortschrittsbar = New-Object System.Windows.Forms.ProgressBar + $FAFortschrittsbar.Location = New-Object System.Drawing.Size(10,320) + $FAFortschrittsbar.Size = New-Object System.Drawing.Size(860,30) + $FAFortschrittsbar.Value = 0 + $TabSeiteFortschrittsanzeige.Controls.Add($FAFortschrittsbar) + + #Textfeld zum globalen zwischenspeichern des aktuellen Werts fuer obige Fortschrittsbar, um exaktere Werte nutzen zu koennen + $FATextfeldRealwertFortschrittsbar = New-Object System.Windows.Forms.Label + + #Textfeld fuer Konstante "Bearbeitete Eintraege:" + $FATextfeld4 = New-Object System.Windows.Forms.Label + $FATextfeld4.Location = New-Object System.Drawing.Size(10,370) + $FATextfeld4.Size = New-Object System.Drawing.Size(140,20) + $FATextfeld4.Text = "Bearbeitete Eintraege:" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld4) + + #Textfeld fuer Konstante "Gesamteintraege:" + $FATextfeld5 = New-Object System.Windows.Forms.Label + $FATextfeld5.Location = New-Object System.Drawing.Size(10,400) + $FATextfeld5.Size = New-Object System.Drawing.Size(100,20) + $FATextfeld5.Text = "Gesamteintraege:" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeld5) + + #TextfeldBearbeitetEintraege fuer die Ausgabe eines Zahlenwerts beim schreiben von Werten in die Excel-Tabelle + $FATextfeldBearbeiteteEintraege = New-Object System.Windows.Forms.Label + $FATextfeldBearbeiteteEintraege.Location = New-Object System.Drawing.Size(170,370) + $FATextfeldBearbeiteteEintraege.Size = New-Object System.Drawing.Size(430,20) + $FATextfeldBearbeiteteEintraege.Text = "0" + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeldBearbeiteteEintraege) + + #TextfeldGesamtEintraege fuer die Ausgabe der insgesamt zu schreibenden Eintraege in die Excel-Tabelle + $FATextfeldGesamtEintraege = New-Object System.Windows.Forms.Label + $FATextfeldGesamtEintraege.Location = New-Object System.Drawing.Size(170,400) + $FATextfeldGesamtEintraege.Size = New-Object System.Drawing.Size(430,20) + $TabSeiteFortschrittsanzeige.Controls.Add($FATextfeldGesamtEintraege) + + # Tab: Ausgabe doppelte Ein- und Ausgaenge sowie nicht zurordnebare Betriebsmittel + $TabSeiteDuplikate = New-Object System.Windows.Forms.TabPage + $TabSeiteDuplikate.TabIndex = 3 + $TabSeiteDuplikate.UseVisualStyleBackColor = $true + $TabSeiteDuplikate.Text = "Doppelte Ein- und Ausgaenge" + $TabSeiteDuplikate.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteDuplikate) + + #Textfeld fuer Konstante "Bei den Eingaengen gibt es folgende Duplikate: " + $DPTextfeld1 = New-Object System.Windows.Forms.Label + $DPTextfeld1.Location = New-Object System.Drawing.Size(10,10) + $DPTextfeld1.Size = New-Object System.Drawing.Size(275,40) + $DPTextfeld1.Text = "Bei den Eingaengen gibt es folgende Duplikate: " + $TabSeiteDuplikate.Controls.Add($DPTextfeld1) + + #ListeEingaenge zur Ausgabe der doppelt genutzten Eingaenge + $DPListeEingaenge = New-Object System.Windows.Forms.DataGridView + $DPListeEingaenge.Location = New-Object System.Drawing.Size(10,60) + $DPListeEingaenge.Size = New-Object System.Drawing.Size(275,20) + $DPListeEingaenge.Height = 430 + $DPListeEingaenge.ColumnCount = 2 + $DPListeEingaenge.ColumnHeadersVisible = $true + $DPListeEingaenge.Columns[0].Name = "Zeile" + $DPListeEingaenge.Columns[1].Name = "Kennzeichnung" + $TabSeiteDuplikate.Controls.Add($DPListeEingaenge) + + #Textfeld fuer Konstante "Bei den Ausgaengen gibt es folgende Duplikate: " + $DPTextfeld2 = New-Object System.Windows.Forms.Label + $DPTextfeld2.Location = New-Object System.Drawing.Size(295,10) + $DPTextfeld2.Size = New-Object System.Drawing.Size(275,40) + $DPTextfeld2.Text = "Bei den Ausgaengen gibt es folgende Duplikate: " + $TabSeiteDuplikate.Controls.Add($DPTextfeld2) + + #ListeAusgaenge zur Ausgabe der doppelt genutzten Ausgaenge + $DPListeAusgaenge = New-Object System.Windows.Forms.DataGridView + $DPListeAusgaenge.Location = New-Object System.Drawing.Size(295,60) + $DPListeAusgaenge.Size = New-Object System.Drawing.Size(275,20) + $DPListeAusgaenge.Height = 430 + $DPListeAusgaenge.ColumnCount = 2 + $DPListeAusgaenge.ColumnHeadersVisible = $true + $DPListeAusgaenge.Columns[0].Name = "Zeile" + $DPListeAusgaenge.Columns[1].Name = "Kennzeichnung" + $TabSeiteDuplikate.Controls.Add($DPListeAusgaenge) + + #Textfeld fuer Konstante "Folgende Eintraege konnten keinem Betriebsmittel zugewiesen werden: " + $DPTextfeld3 = New-Object System.Windows.Forms.Label + $DPTextfeld3.Location = New-Object System.Drawing.Size(580,10) + $DPTextfeld3.Size = New-Object System.Drawing.Size(275,40) + $DPTextfeld3.Text = "Folgende Eintraege konnten keinem Betriebsmittel zugewiesen werden:" + $TabSeiteDuplikate.Controls.Add($DPTextfeld3) + + #ListeFehler zur Ausgabe von Eintraegen, die weder einem Ein-, noch einem Ausgang zugeordnet werden konnten + $DPListeFehler = New-Object System.Windows.Forms.DataGridView + $DPListeFehler.Location = New-Object System.Drawing.Size(580,60) + $DPListeFehler.Size = New-Object System.Drawing.Size(275,20) + $DPListeFehler.Height = 430 + $DPListeFehler.ColumnCount = 2 + $DPListeFehler.ColumnHeadersVisible = $true + $DPListeFehler.Columns[0].Name = "Zeile" + $DPListeFehler.Columns[1].Name = "Kennzeichnung" + $TabSeiteDuplikate.Controls.Add($DPListeFehler) + + #BestaetigenButton zum beenden des Programms + $DPBestaetigenButton = New-Object System.Windows.Forms.Button + $DPBestaetigenButton.Location = New-Object System.Drawing.Size(10,500) + $DPBestaetigenButton.Size = New-Object System.Drawing.Size(860,30) + $DPBestaetigenButton.Text = "Programm beenden" + $DPBestaetigenButton.Add_Click({ + $Fenster.Dispose() + return + }) + $TabSeiteDuplikate.Controls.Add($DPBestaetigenButton) + + # Tab: Einstellungen + $TabSeiteEigenschaften = New-Object System.Windows.Forms.TabPage + $TabSeiteEigenschaften.TabIndex = 0 + $TabSeiteEigenschaften.UseVisualStyleBackColor = $true + $TabSeiteEigenschaften.Text = "Einstellungen" + $TabSeiteEigenschaften.DataBindings.DefaultDataSourceUpdateMode = 0 + $TabBasis.Controls.Add($TabSeiteEigenschaften) + + #Zum festlegen eines gleichen Abstands zum linken Rand + $BasisBreite = 10 + + #Textfeld fuer Konstante "Startverzeichnis Auswahl .txt-Datei: " + $ESTextfeld1 = New-Object System.Windows.Forms.Label + $ESTextfeld1.Location = New-Object System.Drawing.Size($BasisBreite,10) + $ESTextfeld1.Size = New-Object System.Drawing.Size(200,20) + $ESTextfeld1.Text = "Startverzeichnis Auswahl .txt-Datei:" + $TabSeiteEigenschaften.Controls.Add($ESTextfeld1) + + #Textfeld zur Ausgabe des aktuell gespeicherten StartPfades + $ESTextfeldStartPfad = New-Object System.Windows.Forms.Label + $ESTextfeldStartPfad.Location = New-Object System.Drawing.Size(($BasisBreite+200),10) + $ESTextfeldStartPfad.Size = New-Object System.Drawing.Size(510,20) + $TabSeiteEigenschaften.Controls.Add($ESTextfeldStartPfad) + + #StartPfadAenderButton + $ESStartPfadAendernButton = New-Object System.Windows.Forms.Button + $ESStartPfadAendernButton.Location = New-Object System.Drawing.Size(730,10) + $ESStartPfadAendernButton.Size = New-Object System.Drawing.Size(150,30) + $ESStartPfadAendernButton.Text = "Aendern" + $ESStartPfadAendernButton.Add_Click({ + VerzeichnisAendern "StartPfad" + }) + $TabSeiteEigenschaften.Controls.Add($ESStartPfadAendernButton) + + #Textfeld fuer Konstante "Startverzeichnis bei Auswahl des Zielverzeichnisses der Datei(en): " + $ESTextfeld2 = New-Object System.Windows.Forms.Label + $ESTextfeld2.Location = New-Object System.Drawing.Size($BasisBreite,45) + $ESTextfeld2.Size = New-Object System.Drawing.Size(450,20) + $ESTextfeld2.Text = "Startverzeichnis bei Auswahl des Zielverzeichnisses der Datei(en):" + $TabSeiteEigenschaften.Controls.Add($ESTextfeld2) + + #RadioButtonWieTXT + $ESRadioButtonWieTXT = New-Object System.Windows.Forms.RadioButton + $ESRadioButtonWieTXT.Location = New-Object System.Drawing.Size(10,10) + $ESRadioButtonWieTXT.Size = New-Object System.Drawing.Size(163,18) + $ESRadioButtonWieTXT.Name = "ESRadioButtonWieTXT" + $ESRadioButtonWieTXT.Text = "Gleich Startpfad .txt-Datei" + + #RadioButtonWieZieldatei + $ESRadioButtonWieZieldatei = New-Object System.Windows.Forms.RadioButton + $ESRadioButtonWieZieldatei.Location = New-Object System.Drawing.Size(173,10) + $ESRadioButtonWieZieldatei.Size = New-Object System.Drawing.Size(179,18) + $ESRadioButtonWieZieldatei.Name = "ESRadioButtonWieZieldatei" + $ESRadioButtonWieZieldatei.Text = "Gleich gewaehlter .txt-Datei" + + #RadioButtonEigenerPfad + $ESRadioButtonEigenerPfad = New-Object System.Windows.Forms.RadioButton + $ESRadioButtonEigenerPfad.Location = New-Object System.Drawing.Size(352,10) + $ESRadioButtonEigenerPfad.Size = New-Object System.Drawing.Size(94,18) + $ESRadioButtonEigenerPfad.Name = "ESRadioButtonEigenerPfad" + $ESRadioButtonEigenerPfad.Text = "Anderer Pfad" + + #GroupBoxRadioButtons zum gruppieren der obigen RadioButtons + $ESGroupBoxRadioButtons = New-Object System.Windows.Forms.GroupBox + $ESGroupBoxRadioButtons.Location = New-Object System.Drawing.Size(($BasisBreite),60) + $ESGroupBoxRadioButtons.Size = New-Object System.Drawing.Size(449,30) + $ESGroupBoxRadioButtons.Controls.Add($ESRadioButtonWieTXT) + $ESGroupBoxRadioButtons.Controls.Add($ESRadioButtonWieZieldatei) + $ESGroupBoxRadioButtons.Controls.Add($ESRadioButtonEigenerPfad) + $TabSeiteEigenschaften.Controls.Add($ESGroupBoxRadioButtons) + + #SpeichernButton + $ESSpeichernButton = New-Object System.Windows.Forms.Button + $ESSpeichernButton.Location = New-Object System.Drawing.Size(730,60) + $ESSpeichernButton.Size = New-Object System.Drawing.Size(150,30) + $ESSpeichernButton.Text = "Speichern" + $ESSpeichernButton.Add_Click({ + EinstellungenRadioButtonSpeichern + }) + $TabSeiteEigenschaften.Controls.Add($ESSpeichernButton) + + #Textfeld fuer Konstante "Startverzeichnis Auswahl Zielverzeichnis: " + $ESTextfeld3 = New-Object System.Windows.Forms.Label + $ESTextfeld3.Location = New-Object System.Drawing.Size($BasisBreite,95) + $ESTextfeld3.Size = New-Object System.Drawing.Size(250,20) + $ESTextfeld3.Text = "Startverzeichnis Auswahl Zielverzeichnis:" + + #TextfeldZielPfad + $ESTextfeldZielPfad = New-Object System.Windows.Forms.Label + $ESTextfeldZielPfad.Location = New-Object System.Drawing.Size(($BasisBreite+250),95) + $ESTextfeldZielPfad.Size = New-Object System.Drawing.Size(460,20) + + #ZielPfadAendernButton + $ESZielPfadAendernButton = New-Object System.Windows.Forms.Button + $ESZielPfadAendernButton.Location = New-Object System.Drawing.Size(730,95) + $ESZielPfadAendernButton.Size = New-Object System.Drawing.Size(150,30) + $ESZielPfadAendernButton.Text = "Aendern" + $ESZielPfadAendernButton.Add_Click({ + VerzeichnisAendern "ZielPfad" + }) + + +#------------------- Tabelle mit ZielDateien + + #Textfeld fuer Konstante "Zieldateien:" + $ESTextfeld4 = New-Object System.Windows.Forms.Label + $ESTextfeld4.Location = New-Object System.Drawing.Size($BasisBreite,140) + $ESTextfeld4.Size = New-Object System.Drawing.Size(200,20) + $ESTextfeld4.Text = "Zieldateien:" + $TabSeiteEigenschaften.Controls.Add($ESTextfeld4) + + #AenderungeSpeichernButton zum speichern der Werte aus der Tabelle mit den ZielDateien + $ESAenderungenSpeichernButton = New-Object System.Windows.Forms.Button + $ESAenderungenSpeichernButton.Location = New-Object System.Drawing.Size(730,$170) + $ESAenderungenSpeichernButton.Size = New-Object System.Drawing.Size(150,30) + $ESAenderungenSpeichernButton.Text = "Aenderungen Speichern" + $ESAenderungenSpeichernButton.Add_Click({ + EinstellungenZielDateienSpeichern + }) + $TabSeiteEigenschaften.Controls.Add($ESAenderungenSpeichernButton) + + #ListeEinstellungen mit den ZielDateien und zugehoerigen Einstellungen + $ESListeEinstellungen = New-Object System.Windows.Forms.DataGridView + $ESListeEinstellungen.Location = New-Object System.Drawing.Size(10,$170) + $ESListeEinstellungen.Size = New-Object System.Drawing.Size(650,380) + $ESListeEinstellungen.ColumnCount = 4 + $ESListeEinstellungen.ColumnHeadersVisible = $true + $ESListeEinstellungen.AllowUserToAddRows = $true + $ESListeEinstellungen.AllowUserToDeleteRows = $true + $ESListeEinstellungen.AutoGenerateColumns = $false + $ESListeEinstellungen.AutoSizeColumnsMode = "Fill" + $ESListeEinstellungen.Columns[0].Name = "Prefix Eingang" + $ESListeEinstellungen.Columns[1].Name = "Prefix Ausgang" + $ESListeEinstellungen.Columns[2].Name = "Dateiname" + $ESListeEinstellungen.Columns[3].Name = "Konvertierungsart" + $TabSeiteEigenschaften.Controls.Add($ESListeEinstellungen) + + #Tab "Einstellungen" mit Werten beim Start befuellen + AnzeigeEinstellungenInitialisieren + + $Fenster.Add_Shown({$Fenster.Activate()}) + [void]$Fenster.ShowDialog() + + return +} + +#------------------- Funktion nur fuer das txt-GUI -------------------------- + +#Funktion, die beim druecken der Enter-Taste ausgeloest wird, wenn man im Dateiauswahl-Bereich ist +Function TXTReaktionReturn ($Pfad) +{ + #Ueberpruefen, ob der uebergebene Pfad vorhanden ist + if (PfadExistiert $Pfad) + { + #Ende des Pfads trennen + $PfadEnde = $(Split-Path $Pfad -Leaf) + #Bei Auswahl einer Datei mit der Endung ".txt" + if ($($PfadEnde -match ".txt")) + { + #In den Tab zur Auswahl des Zielverzeichnisses wechseln + ZuVERSpringen + #Loest unbekannte Probleme in der GUI + $TXTPfadFeld.Text = $Pfad + return + } + #Bei Auswahl eines Ordners + else + { + AnzeigeAktualisieren "txt" $Pfad + } + } + #Der Pfad ist ungueltig/ existiert nicht + else + { + #Springe in die Verzeichnisauswahl + AnzeigeAktualisieren "txt" "" + } + return +} + +#------------------- Funktion nur fuer das VerzeichnisWaehlen-GUI -------------------------- + +#Funktion, die beim bestaetigen des aktuellen Verzeichnisses genutzt wird. Sie ueberprueft zunaechst, ob das Verzeichnis vorhanden ist und wechselt dann ggf. in den Tab Fortschrittsanzeige +Function VERAuswahlBestaetigt($Pfad, $Auswahl) +{ + #Zusammenfuegen von $Pfad und $Auswahl + $Pfad = Join-Path -Path $Pfad -ChildPath $Auswahl -Resolve + + #Ueberpruefen, ob der Pfad vorhanden ist + if (PfadExistiert $Pfad) + { + #Wechseln in den Tab der Fortschrittsanzeige + ZuFASpringen + #Loest unbekannte Probleme in der GUI + $VERPfadfeld.Text = $Pfad + return + } +} + +#Funktion, die vorauswahl fuer die Funktion AnzeigeAktualisieren trifft, weil je nach gewaehlter Nutzer-Einstellung anders reagiert werden muss +Function VERVorauswahlAnzeigeAktualisieren () { + # Todo: Soll evtl. in AnzeigeAktualisieren migriert werden. Problem: Innerhalb der Verzeichniswahl koennte man dann evtl. nicht mehr navigieren. + #Generieren des Werts des RadioButtons + $RadioButton = RadioButtonHolen + switch ($RadioButton) { + EigenerPfad { + $ZielPfad = ZielPfadHolen + AnzeigeAktualisieren "ver" $ZielPfad + } + WieTXT { + $StartPfad = StartPfadHolen + AnzeigeAktualisieren "ver" $StartPfad + } + WieZielDatei { + AnzeigeAktualisieren "ver" $TXTPfadFeld.Text + } + #Falls der Wert ungueltig ist, wird in das gleiche Verzeichnis gesprungen, dass auch bei der .txt-Datei ausgewaehlt wurde + Default { + AnzeigeAktualisieren "ver" $TXTPfadFeld.Text + } + } +} + + +#------------------- Funktionen zum wechseln der Tabs -------------------------- + +#Funktion, die in den Tab zur Verzeichnisauswahl des Zielverzeichnisses wechselt und dabei benoetigte Schritte durchfuehrt +Function ZuVERSpringen +{ + VERVorauswahlAnzeigeAktualisieren + AufgabenAktualisieren "Zielverzeichnis auswaehlen" + $TabBasis.SelectedIndex = 1 +} + +#Funktion, die in den Tab zur Fortschrittsanzeige wechselt und dabei benoetigte Schritte durchfuehrt +Function ZuFASpringen +{ + $TabBasis.SelectedIndex = 2 + + #Ermitteln von Variablen + $ZielDateien = ZielDateienHolen + $PfadUrsprungsdatei = $TXTPfadFeld.Text + $PfadZielDateien = $VERPfadFeld.Text + + #Fuer jede in der Einstellungsdatei hinterlegte Zieldatei die Konvertierung durchfuehren + foreach ($ZielDatei in $ZielDateien) { + #Erstellen des Zielpfads + $ZielPfad = ExcelDateiNameErstellen $($ZielDatei.DateiName) $PfadUrsprungsdatei $PfadZielDateien + + AufgabenAktualisieren $("Excel-Datei $($ZielDatei.DateiName) erstellen") + + #Unterscheiden des Wandlungstyps und aufruf der entsprechenden Funktion; kein oder falscher Wandlungstyp gilt als "Simpel" + if ($($ZielDatei.WandlungsTyp) -eq "TIA") { + $Gleiche = ExcelDateiBeschreibenTIA $PfadUrsprungsdatei $($ZielDatei.PrefixEingang) $($ZielDatei.PrefixAusgang) $ZielPfad + } + elseif ($($ZielDatei.WandlungsTyp) -eq "Simpel") { + $Gleiche = ExcelDateiBeschreibenSimpel $PfadUrsprungsdatei $($ZielDatei.PrefixEingang) $($ZielDatei.PrefixAusgang) $ZielPfad + } + elseif ($($ZielDatei.WandlungsTyp) -eq "WSCAD") { + $Gleiche = ExcelDateiBeschreibenWSCAD $PfadUrsprungsdatei $($ZielDatei.PrefixEingang) $($ZielDatei.PrefixAusgang) $ZielPfad + } + else { + $Gleiche = ExcelDateiBeschreibenSimpel $PfadUrsprungsdatei $($ZielDatei.PrefixEingang) $($ZielDatei.PrefixAusgang) $ZielPfad + } + } + + #Aufteilen der Rueckgabe in gleiche Eingaenge, gleiche Ausgaenge und Betriebsmittel, die weder Ein- noch Ausgaengen zugeordnet werden koennen, also Fehler sind + $GleicheEingaenge = $Gleiche[0] + $GleicheAusgaenge = $Gleiche[1] + $Fehler = $Gleiche[2] + + AufgabenAktualisieren "Ausgabe Duplikate und Fehler" + #Wechseln in die Ansicht zur Ausgabe von Duplikaten und Fehlern + ZuDPSpringen $GleicheEingaenge $GleicheAusgaenge $Fehler +} + +#Funktion, die in den Tab zur Ansicht der Ausgabe von Duplikaten und Fehlern wechselt und dabei benoetigte Schritte durchfuehrt +Function ZuDPSpringen ($GleicheEingaenge, $GleicheAusgaenge, $Fehler) +{ + #Liste der gleichen Eingaenge befuellen + foreach ($GleichenEingang in $GleicheEingaenge) { + $DPListeEingaenge.Rows.Add($($GleichenEingang.Zeile),($GleichenEingang.Name)) + } + + #Liste der gleichen Ausgaenge befuellen + foreach ($GleichenAusgang in $GleicheAusgaenge) { + $DPListeAusgaenge.Rows.Add($($GleichenAusgang.Zeile),($GleichenAusgang.Name)) + } + + #Liste der nicht zuweisbaren Zeilen befuellen + foreach ($Fehlen in $Fehler) { + $DPListeFehler.Rows.Add($($Fehlen.Zeile),($Fehlen.Name)) + } + + #Tab oeffnen + $TabBasis.SelectedIndex = 3 + + # Werte zuruecksetzen, um weitere durchlauefe zu ermoeglichen + # Todo: Fehler und Duplikate zuruecksetzen!!! Ueberpruefen, ob weitere Werte zurueckgesetzt werden muessen + VERVorauswahlAnzeigeAktualisieren + AnzeigeAktualisieren "txt" $($ESTextfeldStartPfad.Text) + $FAFortschrittsbar.Value = 0 + $FATextfeldBearbeiteteEintraege.Text = "0" +} + +#------------------- Funktionen fuer alle GUIs -------------------------- + + +#Funktion, um die Ansicht der Datei- und Ordnerauswahl zu aktualisieren +#Bei falschem/ nicht existierendem/ leeren Pfad wird in die Ansicht zur Laufwerkswahl gewechselt +Function AnzeigeAktualisieren ($AuswahlTyp, $Pfad) +{ +# Ueberpruefen, ob es das Verzeichnis gibt +if (PfadExistiert $Pfad) +{ + #Ermitteln der Auswahloptionen (Ordner und ggf. .txt-Dateien) + $Optionen = Optionen $AuswahlTyp $Pfad +} +else { + #Ermitteln der Auswahloptionen (Laufwerke) + $Optionen = LaufwerkeFinden + $Pfad = "" +} + +#Nur fuer die Ansicht bei Auswahl einer .txt-Datei: Aktualisieren der GUI +if ($($AuswahlTyp -eq "txt")) { + $TXTPfadFeld.Text = $Pfad + $TXTListeOrdnernamen.Items.Clear() + foreach ($Option in $Optionen) + { + if ($Option.Length -gt 0) + { + $TXTListeOrdnernamen.Items.Add($Option) + } + } +} +#Nur fuer die Ansicht bei Auswahl eines Verzeichnisses: Aktualisieren der GUI +elseif ($($AuswahlTyp -eq "ver")) { + $VERPfadFeld.Text = $Pfad + $VERListeOrdnernamen.Items.Clear() + foreach ($Option in $Optionen) + { + if ($Option.Length -gt 0) + { + $VERListeOrdnernamen.Items.Add($Option) + } + } +} +return +} + +#Funktion, die bei Auswahl eines Verzeichnisses oder einer .txt-Datei aufgerufen wird, um Fehler zu erkennen +Function VerzeichnisAuswaehlen ($AuswahlTyp, $Pfad, $Auswahl) +{ +#Falls das bisherige Verzeichnis existiert, fuege es mit der getroffenen Auswahl zusammen +if (PfadExistiert $Pfad) +{ + $Pfad = Join-Path -Path $Pfad -ChildPath $Auswahl -Resolve +} +#Falls der Pfad die Laenge 0 hat, wurde ein Laufwerk gewaehlt +elseif ($Pfad.Length -eq 0) { + $Pfad = $Auswahl +} +#Fehlerfall/ ungueltiger Pfad: zurueck zu Laufwerken navigieren +else { +$Pfad = "" +} + +#Erkennen, ob .txt-Datei gewaehlt wurde -> ggf. Auswahl abgeschlossen +#Falls es der Aufruf vom Reiter der Auswahl der txt-Dateiauswahl war und der gewaehlte Eintrag die Endung ".txt" hat, ist die Auswahl abgeschlossen +if ($($($Auswahl -match ".txt") -and $($AuswahlTyp -eq "txt"))) +{ + #Fuer den Gesamtfortschritt Anzahl Dateien auslesen und mit der Anzahl der zu erstellenden Dateien (=Zeilen in der urspruenglichen Datei) multiplizieren + #Dies ist nur die Mindestanzahl der Eintraege, die sich erhoet, falls nicht alle Anschluesse der SPS genutzt werden (i.d.R. der Fall). Dies erfolgt in der Funktion "AnschluesseErgaenzen" + $Datei = Get-Content $Pfad + $ZielDateien = ZielDateienHolen + $FATextfeldGesamtEintraege.Text = $($ZielDateien.count) * $($Datei.Length) + + #In die Ansicht der Verzeichniswahl wechseln + ZuVERSpringen + #Loest unbekannte Probleme in der GUI + $TXTPfadFeld.Text = $Pfad + return +} +#Aktualisieren der entsprechenden Ansicht mit dem neuen Pfad +AnzeigeAktualisieren $AuswahlTyp $Pfad +return +} + +#Funktion, die den Tastendruck der Loeschen-Taste managt +Function VerzeichnisZurueck ($AuswahlTyp, $Pfad) +{ +#Falls die Laenge des bisherigen Pfades min. 3 Zeichen lang ist, muessen anschließend Ordner angezeigt werden, ansonsten Laufwerke +if ($Pfad.Length -gt 3) +{ + $Pfad = Split-Path $Pfad +} +else +{ + $Pfad = "" +} +#Aktualisieren der entsprechenden Ansicht mit dem neuen Pfad +AnzeigeAktualisieren $AuswahlTyp $Pfad +return +} + +#Funktion, die auf Tastendruck im PfadFeld reagiert +Function TastenReaktionPfadFeld($AuswahlTyp, $Taste) +{ +#Unterscheiden, ob der Tastendruck in der Ansicht der Verzeichnisauswahl oder der .txt-Dateiauswahl erfolgt ist +if ($AuswahlTyp -eq "txt") { + #Unterscheiden, welche Taste gedrueckt wurde + switch ($Taste){ + "Return" { + $Pfad = $TXTPfadFeld.Text + TXTReaktionReturn $Pfad + } + Default { + } + } +} +elseif ($AuswahlTyp -eq "ver") { + #Unterscheiden, welche Taste gedrueckt wurde + switch ($Taste) { + "Return" { + $Pfad = $VERPfadFeld.Text + AnzeigeAktualisieren "ver" $Pfad + } + Default { + } + } +} +return +} + +#Funktion, die auf Tastendruck in der Liste der Ordnernamen reagiert +Function TastenReaktionListeOrdnernamen($AuswahlTyp, $Taste) +{ +#Unterscheiden, ob der Tastendruck in der Ansicht der Verzeichnisauswahl oder der .txt-Dateiauswahl erfolgt ist +if ($AuswahlTyp -eq "txt"){ + #Unterscheiden, welche Taste gedrueckt wurde + switch ($Taste){ + "Return" { + $Auswahl = $TXTListeOrdnernamen.SelectedItem + $Pfad = $TXTPfadFeld.Text + VerzeichnisAuswaehlen $AuswahlTyp $Pfad $Auswahl + } + "Back" { + $Pfad = $TXTPfadFeld.Text + # Pfad aktualisieren + VerzeichnisZurueck $AuswahlTyp $Pfad + } + Default { + } + } +} +elseif ($AuswahlTyp -eq "ver") { + #Unterscheiden, welche Taste gedrueckt wurde + switch ($Taste) { + "Return" { + $Auswahl = $VERListeOrdnernamen.SelectedItem + $Pfad = $VERPfadFeld.Text + VerzeichnisAuswaehlen $AuswahlTyp $Pfad $Auswahl + } + "Back" { + $Pfad = $VERPfadFeld.Text + VerzeichnisZurueck $AuswahlTyp $Pfad + } + #ShiftKey bedeutet, dass das aktuelle verzeichnis bestaetigt werden soll + "ShiftKey" { + $Pfad = $VERPfadFeld.Text + $Auswahl = $VERListeOrdnernamen.SelectedItem + ReaktionShiftKey $Pfad $Auswahl + } + Default { + } + } +} + +return +} + +#Funktion, die auf Tastendruck auf den Buttons/Knoepfen reagiert +Function TastenReaktionButtons($AuswahlTyp, $Taste) +{ +#Unterscheiden, ob der Tastendruck in der Ansicht der Verzeichnisauswahl oder der .txt-Dateiauswahl erfolgt ist +if ($AuswahlTyp -eq "txt") { + #Unterscheiden, welche Taste gedrueckt wurde + switch ($Taste){ + "Back" { + $Pfad = $TXTPfadFeld.Text + # Pfad aktualisieren + VerzeichnisZurueck $AuswahlTyp $Pfad + } + Default { + } + } +} +elseif ($AuswahlTyp -eq "ver") { + #Unterscheiden, welche Taste gedrueckt wurde + switch ($Taste) { + "Back" { + $Pfad = $VERPfadFeld.Text + VerzeichnisZurueck $AuswahlTyp $Pfad + } + #ShiftKey bedeutet, dass das aktuelle verzeichnis bestaetigt werden soll + "ShiftKey" { + $Pfad = $VERPfadFeld.Text + $Auswahl = $VERListeOrdnernamen.SelectedItem + ReaktionShiftKey $Pfad $Auswahl + } + Default { + } + } +} +return +} + +#Funktion, die in Abhaenigigkeit des Pfades und des Auswahltyps (.txt-Datei oder Verzeichnis) die Auswahloptionen (also Unterordner oder Unterordner und .txt-Dateien) zurueckgibt +Function Optionen($AuswahlTyp, $Pfad) +{ +#Zuweisen der Unterordner +#Typzuweisung noetig, da aus unbekanntem Grund sonst Unterordner, die mit "_" beginnen, nicht gefunden werden koennen +[System.Object[]]$UnterOrdner = UnterOrdnerFinden $Pfad + +#Bei Auswahltp "txt" zusaetzlich auch diese zuweisen und alles zurueckgeben +if ($AuswahlTyp -eq "txt") { + $TxtDateien = TxtDateienFinden $Pfad + #Gibt auch Index und Typ (System.IO.DirectoryInfo bzw. System.String) zurueck, verursacht aber keine Probleme + $Optionen = $UnterOrdner + $TxtDateien +} +#Bei Auswahltyp "ver" sind die Optionen nur die Unterordner +elseif ($AuswahlTyp -eq "ver") { + #Gibt auch Index und Typ (System.IO.DirectoryInfo bzw. System.String) zurueck, verursacht aber keine Probleme + $Optionen = $UnterOrdner +} +return $Optionen +} + +#Funktion, die ueberprueft, ob ein gegebener Pfad vorhanden ist. Pfad mit der Endung "*.txt" werden auch als vorhanden gewertet +Function PfadExistiert ($Pfad) +{ +#Um Abzufangen, dass Test-Path mit leerem Wert durchlaufen wird. Leere Verzeichnisse gelten als ungueltig. +if ($Pfad.Length -eq 0) { + return $false +} +if ($(Test-Path $Pfad -PathType Container) -or $(Test-Path $Pfad -Include "*.txt")) +{ + return $true +} +else +{ + return $false +} +} + +#Funktion, die eine Liste der Laufwerke zurueckgibt +Function LaufwerkeFinden() +{ +#Festlegen der Laufwerksbuchstaben. Mit der Where-Object Bedingung werden virtuell von Powershell erzeugte Laufwerke entfernt +$Laufwerke = $(Get-PSDrive | Where-Object {$_.Free}).Name + +#Hinzufuegen von ":\" an die Laufwerksbuchstaben, damit diese passend fuer den Pfad sind +$i = 0 +foreach($Laufwerk in $Laufwerke) +{ + $Laufwerke[$i] = $Laufwerk + ":\" + $i++ +} +return $Laufwerke +} + +#Funktion, die in Abhaengigkeit des Pfades eine Liste der Unterordner dieses Pfades zurueckgibt +Function UnterOrdnerFinden($Pfad) +{ +#Festlegen der Unterordner +$UnterOrdner = $(Get-ChildItem $Pfad -Directory) + +#Falls es Unterordner gibt, wird der restliche Pfad entfernt +if ($($UnterOrdner.Length -gt 0)) +{ + $Ordner = $(Split-Path $UnterOrdner -Leaf) +} +else { + $Ordner = "" +} + +return $Ordner +} + +#Funktion, die bei einer gegebenen Datei ueberprueft, ob diese Kompatibel ist fuer die Konvertierung +function KompatibilitaetsCheck ($SpeicherOrt){ + $Inhalte = Get-Content $SpeicherOrt + #Dateien mit der Laenge 0 (also keinem Inhalt) gelten als nicht kompatibel + if ($Inhalte.Length -eq 0) { + return $false + } + else { + #Gehe durch alle Zeilen der Datei. Falls eine Zeile nicht korrekt ist, wird $false zurueckgegeben + foreach ($Zeile in $Inhalte) { + if (-not ($Zeile -match "'\w+','.+'") -and $Zeile.Length -gt 0) { + return $false + } + } + } + #Wenn keine Zeile falsch war, gilt die Datei als kompatibel + return $true +} + +#Funktion, die in Abhaengigkeit eines Pfades eine Liste der .txt-Dateien zurueckgibt. Es werden nur fuer die Konvertierung kompatible Dateien zurueckgegeben +Function TxtDateienFinden($Pfad) +{ +#Definieren aller im Verzeichnis vorhandenen .txt-Dateien +$TxtDateien = $(Get-Childitem $Pfad\*.txt) +$KompatibleTxtDateien = @() + +#Falls .txt-Dateien gefunden wurden, pruefe diese auf kompatibilitaet +if ($TxtDateien.Length -gt 0) +{ + #Jede Datei, die kompatibel ist, wird dem Arry $KompatibleTxtDateien hinzugefuegt + foreach ($TxtDatei in $TxtDateien) { + if (KompatibilitaetsCheck $TxtDatei) { + $KompatibleTxtDateien += $TxtDatei + } + } + #Falls kompatible .txt-Dateien gefunden wurden, gebe deren Namen zurueck + if ($KompatibleTxtDateien.Length -gt 0) { + return $(Split-Path $KompatibleTxtDateien -Leaf) + } + else { + return + } +} +else +{ + return +} +} + +#Funktion, die den Tastedruck der Shift-Taste verarbeitet +Function ReaktionShiftKey ($Pfad, $Auswahl) +{ + #Falls das Verzeichnis existiert, ist die Auswahl des Zielverzeichnisses abgeschlossen + if (PfadExistiert $Pfad) + { + VERAuswahlBestaetigt $Pfad $Auswahl + } + #Falls das Verzeichnis nicht existiert, zeige die Laufwerke an + else + { + AnzeigeAktualisieren "ver" "" + } + return +} + + +#Funktion, die sowohl die aktuell uebergebene Aufgabe ausgibt, als auch die Liste der vorher durchgefuehrten Aufgaben aktualisiert +Function AufgabenAktualisieren ($Aufgabe) +{ + #Die zuletzt ausgefuehrte Aufgabe zu den erledigten Aufgaben hinzufuegen + $FAListeErledigteAufgaben.Items.Add($FATextfeldAktuelleAufgabe.Text) + #Die uebergebene Aufgabe als aktuell durchgefuehrte Aufgabe ausgeben + $FATextfeldAktuelleAufgabe.Text = $Aufgabe +} + +#Funktion, die den Fortschrittsbalken des Dateibeschreibens bei jedem Aufruf um einen Anteil der Gesamteintraege weiter bewegt +Function DateiBeschreibenAktualisieren +{ + #Stelle fest, um welchen Wert die Anzeige pro Aufruf der Funktion erhoeht werden muss. Der Wert ist entspricht 100 Prozent fortschritt + $AnteilJeAufruf = 100 / $($FATextfeldGesamtEintraege.Text) + #Erhoehen des gespeicherten Werts der Fortschrittsbar um den vorher ermittelten Anteil Aufruf + #Der Wert wird versteckt in einem Textfeld in der GUI gespeichert, weil der Wert von $FAFortschrittsbar.Value zu ungenau ist + [System.double] $FATextfeldRealwertFortschrittsbar.Text += $AnteilJeAufruf + + #Da $FAFortschrittsbar.Value sich wie ein int verhaelt, ist der letzte Wert i. d. R. hoeher als 100 -> Fehler, der hiermit abgefangen wird, indem dann der Wert 100 zugewiesen wird + if ($([System.Double]$FATextfeldRealwertFortschrittsbar.Text) -ge 100) + { + $FAFortschrittsbar.Value = 100 + } + #Weise ansonsten den tatsaechlichen Wert der Fortschrittsbar zu + else + { + $FAFortschrittsbar.Value = $FATextfeldRealwertFortschrittsbar.Text + } + + #Ermitteln der bisher bearbeiteten Eintraege und erhoehen des Werts + [System.Int64] $BearbeiteteEintraege = $FATextfeldBearbeiteteEintraege.Text + $BearbeiteteEintraege++ + #Aktualisieren der Ausgabe der bearbeiteten Eintraege + $FATextfeldBearbeiteteEintraege.Text = $BearbeiteteEintraege +} + +#--------------------------------------- Start Funktionen fuer Einstellungen ------------------------------- + +#Funktion, die den Benutzernamen des aktuell angemeldeten Benutzers ausgibt +Function BenutzerNameHolen () { + return $env:USERNAME +} + +#Funktion, die den Pfad mit Namen der Einstellungsdatei zurueckgibt. Die Einstellungsdatei liegt im gleichen Verzeichnis, in dem das Skript abgespeichert ist +Function PfadEinstellungsDateiHolen () { + # Koennte man eigentlich in einer Zeile machen, aber PS macht da Probleme + $AktuellesVerzeichnis = Get-Location + #Fuer persoenliche Einstellungsdateien werden diese in Abhaengigkeit des Benutzernamens erstellt + $Benutzer = BenutzerNameHolen + $PfadEinstellungsDatei = $("$AktuellesVerzeichnis\" + "EinstellungenSkriptKonvertierung_" + $Benutzer + ".txt") + return $PfadEinstellungsDatei +} + +#Funktion, die die Inhalte (also den Text) der Einstellungsdatei zurueckgibt +Function InhalteEinstellungsDateiHolen () { + #Festlegen des Pfades + $PfadEinstellungsDatei = PfadEinstellungsDateiHolen + + #Ueberpruefen, ob es den Pfad gibt. Falls er nicht vorhanden ist, erstellen der Einstellungsdatei + if (-not (Test-Path $PfadEinstellungsDatei)) { + #Die Funktion muss zugewiesen werden, weil sonst (zufaellige) Rueckgaben Probleme verursachen + $A = EinstellungsDateiErstellen + } + else { + $EinstellungsInhalte = Get-Content $PfadEinstellungsDatei + return $EinstellungsInhalte + } +} + +#Funktion, die den StartPfad fuer die Auswahl der .txt-Datei aus der Einstellungsdatei ausliest und zurueckgibt +Function StartPfadHolen () { + #Inhalte der Einstellungsdatei speichern + $EinstellungsZeilen = InhalteEinstellungsDateiHolen + + #Durch jede Zeile der Einstellungsdatei iterieren. Sobald in einer Zeile die Einstellung fuer StartPfad gefunden wird, wird der Wert dieser Zeile zurueckgegeben + #Sollte es mehrere Zeilen geben, in denen der StartPfad angegeben ist, wird also nur der als erstes Gefundene (also i. d. R. der Oberste) beruecksichtigt + #Falls der gefundene StartPfad nicht existiert, wird stattdessen das Verzeichnis des Skripts zurueckgegeben + foreach ($EinstellungsZeile in $EinstellungsZeilen) { + $EinstellungsBestandteile = $EinstellungsZeile.Split("|") + if ($EinstellungsBestandteile[0] -eq "StartPfad") { + $StartPfad = $EinstellungsBestandteile[1] + #Pruefen, ob es den Pfad gibt. Falls er nicht existiert, wird das aktuelle Verzeichnis als StartPfad festgelegt + if (PfadExistiert $StartPfad) { + return $StartPfad + } + else { + #Todo: Muesste eigentlich auch in der Einstellungsdatei neu gespeichert werden. Neue Funktion erstellen, die dies auch fuer VerzeichnisAendern macht? + return Get-Location + } + } + } + + #Falls kein StartPfad gefunden wurde, soll der Pfad der Einstellungsdatei als Pfad angegeben werden. Dieser wird auch in der Einstellungsdatei gespeichert. + $PfadEinstellungsDatei = PfadEinstellungsDateiHolen + $StartPfad = Split-Path $PfadEinstellungsDatei + Add-Content $PfadEinstellungsDatei $("StartPfad|" + $StartPfad) + return $StartPfad +} + +#Funktion, die den StartPfad fuer die Auswahl des Zielverzeichnisses aus der Einstellungsdatei ausliest und zurueckgibt +Function ZielPfadHolen () { + #Inhalte der Einstellungsdatei speichern + $EinstellungsZeilen = InhalteEinstellungsDateiHolen + + #Durch jede Zeile der Einstellungsdatei iterieren. Sobald in einer Zeile die Einstellung fuer ZielPfad gefunden wird, wird der Wert dieser Zeile zurueckgegeben + #Sollte es mehrere Zeilen geben, in denen der ZielPfad angegeben ist, wird also nur der als erstes Gefundene (also i. d. R. der Oberste) beruecksichtigt + #Falls der gefundene ZielPfad nicht existiert, wird stattdessen das Verzeichnis des Skripts zurueckgegeben + foreach ($EinstellungsZeile in $EinstellungsZeilen) { + $EinstellungsBestandteile = $EinstellungsZeile.Split("|") + if ($EinstellungsBestandteile[0] -eq "ZielPfad") { + $ZielPfad = $EinstellungsBestandteile[1] + return $ZielPfad + } + } + + #Falls kein ZielPfad gefunden wurde, soll der Pfad des StartVerzeichnisses als Pfad angegeben werden. Dieser wird auch in der Einstellungsdatei gespeichert. + $PfadEinstellungsDatei = PfadEinstellungsDateiHolen + $ZielPfad = StartPfadHolen + Add-Content $PfadEinstellungsDatei $("ZielPfad|" + $ZielPfad) + return $ZielPfad +} + +#Funktion, die den Wert der RadioButtons aus der Einstellungsdatei ausliest und zurueckgibt. +#In den RadioButtons ist festgelegt, ob das initial geoeffnete Verzeichnis bei der Auswahl des Zielverzeichnisses +# a) gleich dem Verzeichnis ist, in dem die .txt-Datei gespeichert ist +# b) gleich dem Verzeichnis ist, das initial bei Auswahl der .txt-Datei angzeigt wird +# c) ein unabhaenig davon festgelegtes Verzeichnis ist +# Unabhaengig von der Auswahl der RadioButtons kann natuerlich frei durch die Verzeichnisse navigiert werden +Function RadioButtonHolen () { + #Inhalte der Einstellungsdatei speichern + $EinstellungsZeilen = InhalteEinstellungsDateiHolen + + #Durch jede Zeile der Einstellungsdatei iterieren. Sobald in einer Zeile die Einstellung fuer RadioButton gefunden wird, wird der Wert dieser Zeile zurueckgegeben + #Sollte es mehrere Zeilen geben, in denen der RadioButton angegeben ist, wird also nur der als erstes Gefundene (also i. d. R. der Oberste) beruecksichtigt + #Falls der gefundene RadioButton nicht existiert, wird stattdessen das Verzeichnis des Skripts zurueckgegeben + foreach ($EinstellungsZeile in $EinstellungsZeilen) { + $EinstellungsBestandteile = $EinstellungsZeile.Split("|") + if ($EinstellungsBestandteile[0] -eq "VerzeichnisWahl") { + $RadioButton = $EinstellungsBestandteile[1] + return $RadioButton + } + } + + #Falls kein VerzeichnisWahl gefunden wurde, soll die Einstellung auf "Gleich" gesetzt werden, also gleich dem Verzeichnis, in dem die .txt-Datei ausgewaehlt wurde. + #Dieser Wert wird auch in der Einstellungsdatei gespeichert. + $PfadEinstellungsDatei = PfadEinstellungsDateiHolen + Add-Content $PfadEinstellungsDatei $("VerzeichnisWahl|Gleich") + return "Gleich" +} + +#Funktion, die eine ueberpruefte Version der zu erstellenden ZielDateien zurueckgibt. +Function ZielDateienHolen () { + #Inhalte der Einstellungsdatei speichern + $EinstellungsInhalte = InhalteEinstellungsDateiHolen + + #Durch jede Zeile der Einstellungsdatei iterieren. In jeder Zeile, in der Werte fuer die ZielDateien gefunden werden, werden diese in $ZielDateien zwischengespeichert + foreach ($EinstellungsZeile in $EinstellungsInhalte) { + $EinstellungsInhalt = $EinstellungsZeile.Split("|") + if ($EinstellungsInhalt[0] -eq "Datei") { + $ZielDateien += @([PSCustomObject]@{ + PrefixEingang = $EinstellungsInhalt[1] + PrefixAusgang = $EinstellungsInhalt[2] + DateiName = $EinstellungsInhalt[3] + WandlungsTyp = $EinstellungsInhalt[4] + }) + } + } + #Ueberpruefen der $ZielDateien in der Funktion ZielDateienCheck + #Todo: Was passiert, wenn $ZielDateien leer ist? Wird dies als "Ich wollte nur nach Duplikaten und falschen BMKs suchen" gewertet? + $ZielDateienSicher = ZielDateienCheck $ZielDateien + return $ZielDateienSicher +} + +#Funktion, die ein Array mit Einstellungswerten der zu erstellenden Dateien erhaelt und bei diesen einige Fehler findet und so gut es geht korrigiert +Function ZielDateienCheck ($ZielDateien) { + #Iterieren durch die Eintraege von $ZielDateien + #Reihenfolge der Korrektur ist wichtig! WandlungsTyp muss zuerst korrigiert werden, da Prefixe und DateiName dort einen Wert brauchen + #Wenn ein falscher Wert gefunden wird, wird die entsprechende Spalte in der GUI Rot markiert + $i = 0 + foreach ($ZielDatei in $ZielDateien) { + #Fehler: Keiner oder falscher Wandlungstyp angegeben + if (($ZielDatei.WandlungsTyp -ne "TIA") -and ($ZielDatei.WandlungsTyp -ne "WSCAD") -and ($ZielDatei.WandlungsTyp -ne "Simpel")) { + $ZielDatei.WandlungsTyp = "Simpel" + $ESListeEinstellungen.Rows[$i].Cells[3].Value = $ZielDatei.WandlungsTyp + $ESListeEinstellungen.Rows[$i].Cells[3].Style.BackColor = 'Red' + } + #Fehler: Zu langer Prefix fuer Eingaenge angegeben + if ($ZielDatei.PrefixEingang.Length -gt 3) { + $ZielDatei.PrefixEingang = $ZielDatei.PrefixEingang.Substring(0,3) + $ESListeEinstellungen.Rows[$i].Cells[0].Value = $ZielDatei.PrefixEingang + $ESListeEinstellungen.Rows[$i].Cells[0].Style.BackColor = 'Red' + } + #Fehler: Kein Prefix fuer Eingaenge angegeben + if ($ZielDatei.PrefixEingang.Length -eq 0) { + switch ($($ZielDatei.WandlungsTyp)) { + Simpel { + $ZielDatei.PrefixEingang = "E" + } + TIA { + $ZielDatei.PrefixEingang = "%E" + } + WSCAD { + $ZielDatei.PrefixEingang = "E" + } + Default { + $ZielDatei.PrefixEingang = "E" + } + } + $ESListeEinstellungen.Rows[$i].Cells[0].Value = $ZielDatei.PrefixEingang + $ESListeEinstellungen.Rows[$i].Cells[0].Style.BackColor = 'Red' + } + #Fehler: Zu langer Prefix fuer Ausgaenge angegeben + if ($ZielDatei.PrefixAusgang.Length -gt 3) { + $ZielDatei.PrefixAusgang = $ZielDatei.PrefixAusgang.Substring(0,3) + $ESListeEinstellungen.Rows[$i].Cells[1].Value = $ZielDatei.PrefixAusgang + $ESListeEinstellungen.Rows[$i].Cells[1].Style.BackColor = 'Red' + } + #Fehler: Kein Prefix fuer Ausgaenge angegeben + if ($ZielDatei.PrefixAusgang.Length -eq 0) { + switch ($($ZielDatei.WandlungsTyp)) { + Simpel { + $ZielDatei.PrefixAusgang = "A" + } + TIA { + $ZielDatei.PrefixAusgang = "%A" + } + WSCAD { + $ZielDatei.PrefixAusgang = "A" + } + Default { + $ZielDatei.PrefixAusgang = "A" + } + } + $ESListeEinstellungen.Rows[$i].Cells[1].Value = $ZielDatei.PrefixAusgang + $ESListeEinstellungen.Rows[$i].Cells[1].Style.BackColor = 'Red' + } + #Fehler: Zu langer Dateiname angegeben + if ($ZielDatei.DateiName.Length -gt 150) { + $ZielDatei.DateiName = $ZielDatei.DateiName.Substring(0,150) + $ESListeEinstellungen.Rows[$i].Cells[2].Value = $ZielDatei.DateiName + $ESListeEinstellungen.Rows[$i].Cells[2].Style.BackColor = 'Red' + } + #Fehler: Kein Dateiname angegeben + if ($ZielDatei.DateiName.Length -eq 0) { + $ZielDatei.DateiName = $($ZielDatei.WandlungsTyp + "_[Ursprungsdatei]") + $ESListeEinstellungen.Rows[$i].Cells[2].Value = $ZielDatei.DateiName + $ESListeEinstellungen.Rows[$i].Cells[2].Style.BackColor = 'Red' + } + #Werte speichern fuer Rueckgabe + $GepruefteZielDateien += @([PSCustomObject]@{ + PrefixEingang = $ZielDatei.PrefixEingang + PrefixAusgang = $ZielDatei.PrefixAusgang + DateiName = $ZielDatei.DateiName + WandlungsTyp = $ZielDatei.WandlungsTyp + }) + $i++ + } + + return $GepruefteZielDateien +} + +#Funktion, die eine Datei mit den Einstellungen und Standardwerten erstellt +Function EinstellungsDateiErstellen () { + #Verzeichnis, in dem die Einstellungsdatei gespeicher werden soll, festlegen + $PfadEinstellungsDatei = PfadEinstellungsDateiHolen + # Todo: Moegliches Problem mit der Funktion "StartVerzeichnisAktualisieren". Ueberpruefen! + + New-Item $PfadEinstellungsDatei -ItemType File + + #Festlegen von Variablen, die in die Einstellungsdatei geschrieben werden + $StartPfad = Get-Location + $ZielDateien = @([PSCustomObject]@{ + PrefixEingang = "E" + PrefixAusgang = "A" + DateiName = "WSCAD_[Ursprungsdatei]" + WandlungsTyp = "WSCAD" + }) + $ZielDateien += @([PSCustomObject]@{ + PrefixEingang = "%E" + PrefixAusgang = "%A" + DateiName = "TIA_[Ursprungsdatei]" + WandlungsTyp = "TIA" + }) + $ZielDateien += @([PSCustomObject]@{ + PrefixEingang = "E" + PrefixAusgang = "A" + DateiName = "EA_[Ursprungsdatei]" + WandlungsTyp = "Simpel" + }) + + #Aus Gruenden der besseren Uebersichtlichkeit im Code wird das Schreiben mit Add-Content durchgefuehrt + + #Schreiben in die Einstellungsdatei: Hinweise fuer den Benutzer + Add-Content $PfadEinstellungsDatei "Hinweise zur Einstellungsdatei: " + Add-Content $PfadEinstellungsDatei "1) Jeder Eintrag wird durch senkrechte Striche (|) geteilt. Der erste Bereich gibt die Art des Eintrags an." + Add-Content $PfadEinstellungsDatei " Moegliche Werte sind 'StartPfad' und 'Datei'. Es sollte nur ein StartPfad angegeben sein. Sind mehrere Angegeben," + Add-Content $PfadEinstellungsDatei " wird der erste verwendet. Es koennen beliebig viele Dateien angegeben werden." + Add-Content $PfadEinstellungsDatei "2) Die rechte Spalte bei Dateien gibt das Konvertierungsformat fuer diese Datei an. Moeglich sind 'TIA', 'WSCAD'" + Add-Content $PfadEinstellungsDatei " und 'Simpel'. Ist ein falscher oder kein Wert angegeben, wird automatisch in 'Simpel' konvertiert." + Add-Content $PfadEinstellungsDatei "3) Die zweite Spalte von rechts bei Dateien gibt den Zieldateinamen an. Ist darin [Ursprungsdatei] enthalten," + Add-Content $PfadEinstellungsDatei " wird dieser Teil durch den Namen der txt-Datei ersetzt, von der die Daten konvertiert werden." + Add-Content $PfadEinstellungsDatei "Nutzung des Konvertierers auf eigene Gefahr und ohne Haftungsuebernahme bei Schaeden!" + + #Schreiben in die Einstellungsdatei: StartPfad, VerzeichnisWahl, ZielPfad und Datei(en) + Add-Content $PfadEinstellungsDatei $("StartPfad|" + $StartPfad) + Add-Content $PfadEinstellungsDatei $("VerzeichnisWahl|WieZielDatei") + Add-Content $PfadEinstellungsDatei $("ZielPfad|" + $StartPfad) + foreach ($ZielDatei in $ZielDateien) { + Add-Content $PfadEinstellungsDatei $("Datei|" + $ZielDatei.PrefixEingang + "|" + $ZielDatei.PrefixAusgang + "|" + $ZielDatei.DateiName + "|" + $ZielDatei.WandlungsTyp) + } + + return $ZielDateien +} + +#Funktion, die die Werte in die GUI fuer den Einstellungen-Reiter initialisiert +Function AnzeigeEinstellungenInitialisieren () +{ + #Inhalte der Einstellungsdatei speichern + $EinstellungsInhalte = InhalteEinstellungsDateiHolen + + #Auslesen und anzeigen der Werte fuer die ZielDateien + foreach ($EinstellungsZeile in $EinstellungsInhalte) { + $EinstellungsBestandteile = $EinstellungsZeile.Split("|") + if ($EinstellungsBestandteile[0] -eq "Datei") { + $ESListeEinstellungen.Rows.Add($($EinstellungsBestandteile[1]),$($EinstellungsBestandteile[2]),$($EinstellungsBestandteile[3]),$($EinstellungsBestandteile[4])) + } + } + + #Auslesen und anzeigen des Werts fuer den StartPfad + $StartPfad = StartPfadHolen + $ESTextfeldStartPfad.Text = $StartPfad + + #Auslesen und anzeigen des Werts fuer die RadioButtons + #In den RadioButtons ist festgelegt, ob das initial geoeffnete Verzeichnis bei der Auswahl des Zielverzeichnisses + # a) gleich dem Verzeichnis ist, in dem die .txt-Datei gespeichert ist + # b) gleich dem Verzeichnis ist, das initial bei Auswahl der .txt-Datei angzeigt wird + # c) ein unabhaenig davon festgelegtes Verzeichnis ist + # Unabhaengig von der Auswahl der RadioButtons kann natuerlich frei durch die Verzeichnisse navigiert werden + $RadioButton = RadioButtonHolen + switch ($RadioButton) { + EigenerPfad { + $ESRadioButtonEigenerPfad.Checked = $true + $TabSeiteEigenschaften.Controls.Add($ESTextfeld3) + $TabSeiteEigenschaften.Controls.Add($ESTextfeldZielPfad) + $TabSeiteEigenschaften.Controls.Add($ESZielPfadAendernButton) + $ZielPfad = ZielPfadHolen + $ESTextfeldZielPfad.Text = $ZielPfad + } + WieTXT { + $ESRadioButtonWieTXT.Checked = $true + } + WieZielDatei { + $ESRadioButtonWieZieldatei.Checked = $true + } + Default { + $ESRadioButtonWieZieldatei.Checked = $true + } + } +} + +#Funktion, die einen Explorer oeffnet, bei der ein Verzeichnis ausgewaehlt wird, dieses in der Einstellungsdatei speichert und in der GUI im Tab der Einstellungen +#das neue Verzeichnis ausgibt. Zuvor wird das alte Verzeichnis geloescht. +#Welches Verzeichnis (i. d. R. StartPfad oder ZielPfad) geaendert wird, muss der Funktion uebergeben werden +Function VerzeichnisAendern ($SuchBereich) +{ + #Inhalte der Einstellungsdatei einlesen und die Inhalte der Datei loeschen + $DateiInhalt = InhalteEinstellungsDateiHolen + $PfadEinstellungsDatei = PfadEinstellungsDateiHolen + Clear-Content $PfadEinstellungsDatei + + #Wieder-Beschreiben der Datei und austauschen der in $SuchBereich uebergebenen Einstellung sowie oeffnen des Explorers, zur Auswahl des neuen Verzeichnisses + foreach ($DateiZeile in $DateiInhalt) { + $DateiBestandTeile = $DateiZeile.Split("|") + if ($DateiBestandTeile[0] -eq $SuchBereich) { + $Explorer = New-Object System.Windows.Forms.FolderBrowserDialog + $Explorer.SelectedPath = $DateiBestandTeile[1] + $Explorer.ShowDialog() + $Pfad = $Explorer.SelectedPath + $DateiZeile = $($DateiBestandTeile[0] + "|" + $Pfad) + } + Add-Content $PfadEinstellungsDatei $DateiZeile + } + + #Anzeige der GUI im Tab Verzeichnisauswahl des Verzeichnisses, in dem die Dateien gespeichert werden, aktualisieren. Dies muss aktualisiert werden, da evtl. aufgrund + #der Einstellung der Radio-Buttons auch bei Aenderung des Verzeichnisses zur Wahl der .txt-Datei diese Ansicht aktualisiert werden muss + VERVorauswahlAnzeigeAktualisieren + + #Je nach gewaehltem $SuchBereich muessen verschiedene teile des GUI aktualisiert werden + switch ($SuchBereich) { + StartPfad { + AnzeigeAktualisieren "txt" $Pfad + $ESTextfeldStartPfad.Text = $Pfad + } + ZielPfad { + $ESTextfeldZielPfad.Text = $Pfad + } + Default {} + } +} + +#Funktion, die die aktuell gewaehlte Einstellung des RadioButtons in der Einstellungsdatei speichert +Function EinstellungenRadioButtonSpeichern () { + #Feststellen, welcher RadioButton aktiviert ist und die entsprechenden Teile der GUI aktualisieren + if ($ESRadioButtonEigenerPfad.Checked -eq $true) { + $Auswahl = "EigenerPfad" + $TabSeiteEigenschaften.Controls.Add($ESTextfeld3) + $TabSeiteEigenschaften.Controls.Add($ESTextfeldZielPfad) + $TabSeiteEigenschaften.Controls.Add($ESZielPfadAendernButton) + $ZielPfad = ZielPfadHolen + $ESTextfeldZielPfad.Text = $ZielPfad + } + elseif ($ESRadioButtonWieTXT.Checked -eq $true) { + $Auswahl = "WieTXT" + $TabSeiteEigenschaften.Controls.Remove($ESTextfeld3) + $TabSeiteEigenschaften.Controls.Remove($ESTextfeldZielPfad) + $TabSeiteEigenschaften.Controls.Remove($ESZielPfadAendernButton) + } + else { + $Auswahl = "WieZielDatei" + $TabSeiteEigenschaften.Controls.Remove($ESTextfeld3) + $TabSeiteEigenschaften.Controls.Remove($ESTextfeldZielPfad) + $TabSeiteEigenschaften.Controls.Remove($ESZielPfadAendernButton) + } + #Inhalte und Pfad der Einstelungsdatei speichern + $DateiInhalt = InhalteEinstellungsDateiHolen + $PfadEinstellungsDatei = PfadEinstellungsDateiHolen + + #Anzeige fuer Verzeichnisauswahl aktualisieren, Inhalte der Einstellungsdatei loeschen + VERVorauswahlAnzeigeAktualisieren + Clear-Content $PfadEinstellungsDatei + + #Durch die Einstellungsinhalte iterieren, dabei nach Zeile fuer VerzeichnisAuswahl suchen, alle Inhalte und aktualisierten Wert fuer VerzeichnisWahl in die Datei schreiben + foreach ($DateiZeile in $DateiInhalt) { + $DateiBestandTeile = $DateiZeile.Split("|") + #Zeile fuer VerzeichnisWahl finden und Einstellung durch neue Auswahl ersetzen + if ($DateiBestandTeile[0] -eq "VerzeichnisWahl") { + $DateiZeile = $($DateiBestandTeile[0] + "|" + $Auswahl) + } + Add-Content $PfadEinstellungsDatei $DateiZeile + } +} + +#Funktion, die die Tabelle der ZielDateien ausliest und deren Werte abspeichert +Function EinstellungenZielDateienSpeichern () +{ + #Auslesen der Tabelle mit den ZielDateien und daraus das Array $ZielDateien erstellen + for ($i = 0; $i -lt ($ESListeEinstellungen.RowCount-1); $i++) { + #Falls in keinem Feld ein Wert steht, wird die Zeile uebersprungen (=> eintrag geloescht) + if ($($($($ESListeEinstellungen.Rows[$i].Cells[0].Value).Length -ne 0) -or + $($($ESListeEinstellungen.Rows[$i].Cells[1].Value).Length -ne 0) -or + $($($ESListeEinstellungen.Rows[$i].Cells[2].Value).Length -ne 0) -or + $($($ESListeEinstellungen.Rows[$i].Cells[3].Value).Length -ne 0) + )) { + #Eintrag fuer $ZielDateien hinzufuegen + $ZielDateien += @([PSCustomObject]@{ + PrefixEingang = $ESListeEinstellungen.Rows[$i].Cells[0].Value + PrefixAusgang = $ESListeEinstellungen.Rows[$i].Cells[1].Value + DateiName = $ESListeEinstellungen.Rows[$i].Cells[2].Value + WandlungsTyp = $ESListeEinstellungen.Rows[$i].Cells[3].Value + }) + } + } + #Ueberpruefen der $ZielDateien + $ZielDateien = ZielDateienCheck $ZielDateien + + #Holen der Einstellungsdatei + $PfadEinstellungsDatei = PfadEinstellungsDateiHolen + $AlteEinstellungsDatei = Get-Content $PfadEinstellungsDatei + $NeueEinstellungsDatei = @() + + #Alte Ziel-Dateien loeschen + foreach ($Zeile in $AlteEinstellungsDatei) { + $Einstellung = $Zeile.Split("|") + if ($Einstellung[0] -ne "Datei") { + $NeueEinstellungsDatei += $Zeile + } + } + + #Neue Ziel-Dateien hinzufuegen + foreach ($ZielDatei in $ZielDateien) { + $ZielDateiensatz = $("Datei|" + $ZielDatei.PrefixEingang + "|" + $ZielDatei.PrefixAusgang + "|" + $ZielDatei.DateiName + "|" + $ZielDatei.WandlungsTyp) + $NeueEinstellungsDatei += $ZielDateiensatz + } + + #Inhalte der Einstellungsdatei loeschen und neu befuellen + Clear-Content $PfadEinstellungsDatei + foreach ($Zeile in $NeueEinstellungsdatei) { + Add-Content $PfadEinstellungsDatei $Zeile + } + + # UngespeichterteAenderungen reseten! (?) +} + + +#--------------------------------------- Ende Funktionen fuer GUI ------------------------------- + +#Funktion, die aus in den Einstellungen festgelegtem Namen, ggf. dem urspruenglichen Dateinamen und dem Speicherort fuer die Datei den neuen Dateinamen erstellt +Function ExcelDateiNameErstellen ($EingestellterName, $PfadUrsprungsdatei, $PfadZielDatei) +{ + #Feststellen des Namens der urspruenglichen Datei aus dem Gesamtpfad + $NameUrsprungsdatei = Split-Path $PfadUrsprungsdatei -Leaf + #Entfernen der Endung (".txt" --> 4 Zeichen) + $NameUrsprungsdateiLaenge = $NameUrsprungsdatei.Length + $NameUrsprungsdateiKurz = $NameUrsprungsdatei.Substring(0, $($NameUrsprungsdateiLaenge - 4)) + + #Zusammensetzen des neuen Namens aus dem uebergegenem Zielpfad, dem Zeichen "\", dem eingestellten Namen, wobei der Bereich "[Ursprungsdatei]" durch den Dateinamen + #der Datei ersetzt wird, die konvertiert wurde, und der Endung ".xlsx" + $GesamtPfadZielDatei = $PfadZielDatei + "\" + $EingestellterName.Replace("[Ursprungsdatei]",$NameUrsprungsdateiKurz) + ".xlsx" + + return $GesamtPfadZielDatei +} + +#Funktion, die aus einem gegebenem Pfad, Prefixen fuer Ein- und Ausgang und dem Pfad der Zieldatei dort eine Datei erstellt nach dem Format "Simpel" +#Bei Simpel gibt es keine spezielle Verarbeitung, die geaenderten Betriebsmittel und Kommentare werden einfach in die Excel-Datei eingetragen +Function ExcelDateiBeschreibenSimpel ($PfadUrsprungsdatei, $PrefixEingang, $PrefixAusgang, $ZielDatei) +{ + #Deklarieren der Variablen/Arrays + $Eingaenge = @() + $ZuEingang = @("FDI", "B", "S", "E", "I", "DI", "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BJ", "BK", "BL", "BM", "BN", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", "FA", "FB", "FC", "FD", "FE", "FF", "FG", "FH", "FJ", "FK", "FL", "FM", "FN", "FP", "FQ", "FR", "FS", "FT", "FU", "FV", "FW", "FX", "FY", "FZ", "SA", "SB", "SC", "SD", "SE", "SF", "SG", "SH", "SJ", "SK", "SL", "SM", "SN", "SP", "SQ", "SR", "SS", "ST", "SU", "SV", "SW", "SX", "SY", "SZ") + $Ausgaenge = @() + $ZuAusgang = @("K", "O", "Q", "M", "A", "P", "DQ", "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CJ", "CK", "CL", "CM", "CN", "CP", "CQ", "CR", "CS", "CT", "CU", "CV", "CW", "CX", "CY", "CZ", "EA", "EB", "EC", "ED", "EE", "EF", "EG", "EH", "EJ", "EK", "EL", "EM", "EN", "EP", "EQ", "ER", "ES", "ET", "EU", "EV", "EW", "EX", "EY", "EZ", "GA", "GB", "GC", "GD", "GE", "GF", "GG", "GH", "GJ", "GK", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GV", "GW", "GX", "GY", "GZ", "HA", "HB", "HC", "HD", "HE", "HF", "HG", "HH", "HJ", "HK", "HL", "HM", "HN", "HP", "HQ", "HR", "HS", "HT", "HU", "HV", "HW", "HX", "HY", "HZ", "KA", "KB", "KC", "KD", "KE", "KF", "KG", "KH", "KJ", "KK", "KL", "KM", "KN", "KP", "KQ", "KR", "KS", "KT", "KU", "KV", "KW", "KX", "KY", "KZ", "MA", "MB", "MC", "MD", "ME", "MF", "MG", "MH", "MJ", "MK", "ML", "MM", "MN", "MP", "MQ", "MR", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "PA", "PB", "PC", "PD", "PE", "PF", "PG", "PH", "PJ", "PK", "PL", "PM", "PN", "PP", "PQ", "PR", "PS", "PT", "PU", "PV", "PW", "PX", "PY", "PZ", "QA", "QB", "QC", "QD", "QE", "QF", "QG", "QH", "QJ", "QK", "QL", "QM", "QN", "QP", "QQ", "QR", "QS", "QT", "QU", "QV", "QW", "QX", "QY", "QZ", "RA", "RB", "RC", "RD", "RE", "RF", "RG", "RH", "RJ", "RK", "RL", "RM", "RN", "RP", "RQ", "RR", "RS", "RT", "RU", "RV", "RW", "RX", "RY", "RZ", "TA", "TB", "TC", "TD", "TE", "TF", "TG", "TH", "TJ", "TK", "TL", "TM", "TN", "TP", "TQ", "TR", "TS", "TT", "TU", "TV", "TW", "TX", "TY", "TZ") + $Fehler = @() + $Ursprungdatei = Get-Content $PfadUrsprungsdatei + + AufgabenAktualisieren "Daten fuer Simpel konvertieren" + #Interieren durch die Eintraege + #$i steht fuer die Zeilennummer + $i = 0 + foreach ($Eintrag in $Ursprungdatei) + { + #Teilen der Eintraege in $BMKZahl und $Kommentar + $Eintragszeile = $Eintrag.Split("'") + $BMKZahl = $Eintragszeile[1] + $BMKZahl = $BMKZahl.TrimStart("'") + $Kommentar = $Eintragszeile[3] + $Kommentar = $Kommentar.TrimEnd("'") + + #Unterscheiden, ob es sich um einen Ein-, Ausgang oder Fehler handelt + if ($($($BMKZahl -replace "[\d]") -in $ZuEingang)) + { + #Anpassen der $BMKZahl: Entfernen der Buchstaben, einfuegen eines Punkts (".") zwischen letzter und vorletzer Stelle von Rechts und hinzufuegen des Prefix fuer Eingaenge + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $PrefixEingang + $BMKZahl + #Eintraegen in das Array fuer Eingaenge + $Eingaenge += @([PSCustomObject]@{ + Name = $BMKZahl + Kommentar = $Kommentar + Zeile = $i + }) + } + elseif ($($($BMKZahl -replace "[\d]") -in $ZuAusgang)) + { + #Anpassen der $BMKZahl: Entfernen der Buchstaben, einfuegen eines Punkts (".") zwischen letzter und vorletzer Stelle von Rechts und hinzufuegen des Prefix fuer Ausgaenge + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $PrefixAusgang + $BMKZahl + #Eintragen in das Array fuer Ausgaenge + $Ausgaenge += @([PSCustomObject]@{ + Name = $BMKZahl + Kommentar = $Kommentar + Zeile = $i + }) + } + else + { + #Anpassen der $BMKZahl: Einfuegen eines Punkts (".") zwischen letzter und vorletzer Stelle von Rechts + $BMKZahlLaenge = $($BMKZahl.length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + #Eintragen in das Array fuer Fehler + $Fehler += @([PSCustomObject]@{ + Name = $BMKZahl + Kommentar = $Kommentar + Zeile = $i + }) + } + #Erhoehen des Zeilencounters + $i++ + } + + AufgabenAktualisieren "Daten fuer Simpel in Excel-Datei schreiben" + #Excel oeffnen und Datei erstellen + $Datei = New-Object -ComObject Excel.Application + $Mappe = $Datei.Workbooks.Add() + $Mappe.SaveAs($ZielDatei) + $Blatt = $Mappe.WorkSheets.item(1) + $Datei.Visible = $false + + #Header erstellen + #(kein Header vorhanden) + + #Schleife fuer Fehler + #$i ist der Zeilencounter. Die oberste Zeile in Excel ist Zeile 1 + $i = 1 + $Fehler = $Fehler | Sort-Object "Name" + foreach ($EinzelFehler in $Fehler) { + $Blatt.Cells.Item($i,1) = $EinzelFehler.Name + $Blatt.Cells.Item($i,2) = $EinzelFehler.Kommentar + + DateiBeschreibenAktualisieren + $i++ + } + + #Schleife fuer Eingaenge + $Eingaenge = $Eingaenge | Sort-Object "Name" + foreach ($Eingang in $Eingaenge) { + $Blatt.Cells.Item($i,1) = $Eingang.Name + $Blatt.Cells.Item($i,2) = $Eingang.Kommentar + + DateiBeschreibenAktualisieren + $i++ + } + + #Schleife fuer Ausgaenge + $Ausgaenge = $Ausgaenge | Sort-Object "Name" + foreach ($Ausgang in $Ausgaenge) { + $Blatt.Cells.Item($i,1) = $Ausgang.Name + $Blatt.Cells.Item($i,2) = $Ausgang.Kommentar + + DateiBeschreibenAktualisieren + $i++ + } + + #Speichern der Datei und schließen von Excel + $Mappe.Save() + $Datei.Quit() + + #Ermitteln von Duplikaten + $GleicheEingaenge = GleicheFinden $Eingaenge + $GleicheAusgaenge = GleicheFinden $Ausgaenge + + #Dieses beschreiben ist noetig, da sonst in der Rueckgabe Fehler entstehen koennen, wenn entweder $GleicheEingaenge oder $GleicheAusgaenge leer sind (aber nicht beide) + if ( $($Fehler.Length -eq 0)) + { + $Fehler += @([PSCustomObject]@{ + Name = "Keine" + Zeile = "Alle" + }) + } + + return $GleicheEingaenge, $GleicheAusgaenge, $Fehler +} + +#Funktion, die aus einem gegebenem Pfad, Prefixen fuer Ein- und Ausgang und dem Pfad der Zieldatei dort eine Datei erstellt nach dem Format "TIA" +#Bei TIA ist ein spezielle Header notwendig. Außerdem wird ein zweites Tabellenblatt erstellt, bei dem in etwas angepasster Form und mit speziellem Zaehler die Ein- und Ausgaenge +#aufgelistet sind. +#Das Format fuer TIA wurde nach Vorgaben von Christian Forkl (SPS-Programmierer) erstellt +Function ExcelDateiBeschreibenTIA ($PfadUrsprungsdatei, $PrefixEingang, $PrefixAusgang, $ZielDatei) +{ + $Eingaenge = @() + $ZuEingang = @("FDI", "B", "S", "E", "I", "DI", "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BJ", "BK", "BL", "BM", "BN", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", "FA", "FB", "FC", "FD", "FE", "FF", "FG", "FH", "FJ", "FK", "FL", "FM", "FN", "FP", "FQ", "FR", "FS", "FT", "FU", "FV", "FW", "FX", "FY", "FZ", "SA", "SB", "SC", "SD", "SE", "SF", "SG", "SH", "SJ", "SK", "SL", "SM", "SN", "SP", "SQ", "SR", "SS", "ST", "SU", "SV", "SW", "SX", "SY", "SZ") + $Ausgaenge = @() + $ZuAusgang = @("K", "O", "Q", "M", "A", "P", "DQ", "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CJ", "CK", "CL", "CM", "CN", "CP", "CQ", "CR", "CS", "CT", "CU", "CV", "CW", "CX", "CY", "CZ", "EA", "EB", "EC", "ED", "EE", "EF", "EG", "EH", "EJ", "EK", "EL", "EM", "EN", "EP", "EQ", "ER", "ES", "ET", "EU", "EV", "EW", "EX", "EY", "EZ", "GA", "GB", "GC", "GD", "GE", "GF", "GG", "GH", "GJ", "GK", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GV", "GW", "GX", "GY", "GZ", "HA", "HB", "HC", "HD", "HE", "HF", "HG", "HH", "HJ", "HK", "HL", "HM", "HN", "HP", "HQ", "HR", "HS", "HT", "HU", "HV", "HW", "HX", "HY", "HZ", "KA", "KB", "KC", "KD", "KE", "KF", "KG", "KH", "KJ", "KK", "KL", "KM", "KN", "KP", "KQ", "KR", "KS", "KT", "KU", "KV", "KW", "KX", "KY", "KZ", "MA", "MB", "MC", "MD", "ME", "MF", "MG", "MH", "MJ", "MK", "ML", "MM", "MN", "MP", "MQ", "MR", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "PA", "PB", "PC", "PD", "PE", "PF", "PG", "PH", "PJ", "PK", "PL", "PM", "PN", "PP", "PQ", "PR", "PS", "PT", "PU", "PV", "PW", "PX", "PY", "PZ", "QA", "QB", "QC", "QD", "QE", "QF", "QG", "QH", "QJ", "QK", "QL", "QM", "QN", "QP", "QQ", "QR", "QS", "QT", "QU", "QV", "QW", "QX", "QY", "QZ", "RA", "RB", "RC", "RD", "RE", "RF", "RG", "RH", "RJ", "RK", "RL", "RM", "RN", "RP", "RQ", "RR", "RS", "RT", "RU", "RV", "RW", "RX", "RY", "RZ", "TA", "TB", "TC", "TD", "TE", "TF", "TG", "TH", "TJ", "TK", "TL", "TM", "TN", "TP", "TQ", "TR", "TS", "TT", "TU", "TV", "TW", "TX", "TY", "TZ") + $Fehler = @() + + $Ursprungdatei = Get-Content $PfadUrsprungsdatei + + AufgabenAktualisieren "Daten fuer TIA konvertieren" + #Interieren durch die Eintraege + #$i steht fuer die Zeilennummer + $i = 0 + foreach ($Eintrag in $Ursprungdatei) + { + #Teilen der Eintraege in $BMKZahl, $BMKZahlOriginal und $Kommentar + $Eintragszeile = $Eintrag.Split("'") + $BMKZahl = $Eintragszeile[1] + $BMKZahl = $BMKZahl.TrimStart("'") + $BMKZahlOriginal = $BMKZahl + $Kommentar = $Eintragszeile[3] + $Kommentar = $Kommentar.TrimEnd("'") + #Unterscheiden, ob es sich um einen Ein-, Ausgang oder Fehler handelt + if ($($($BMKZahl -replace "[\d]") -in $ZuEingang)) + { + #Anpassen der $BMKZahl: Entfernen der Buchstaben, einfuegen eines Punkts (".") zwischen letzter und vorletzer Stelle von Rechts und hinzufuegen des Prefix fuer Eingaenge und Konstanten + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKNurZahl = $BMKZahl + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $PrefixEingang + $BMKZahl + $BMKZahlConstant = "cIn" + $BMKZahlOriginal + #Eintraegen in das Array fuer Eingaenge + $Eingaenge += @([PSCustomObject]@{ + Name = $BMKZahl + NameOriginal = $BMKZahlOriginal + NameConstant = $BMKZahlConstant + Kommentar = $Kommentar + Zahl = $BMKNurZahl + Zeile = $i + }) + } + elseif ($($($BMKZahl -replace "[\d]") -in $ZuAusgang)) + { + #Anpassen der $BMKZahl: Entfernen der Buchstaben, einfuegen eines Punkts (".") zwischen letzter und vorletzer Stelle von Rechts und hinzufuegen des Prefix fuer Ausgaenge + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKNurZahl = $BMKZahl + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahl = $PrefixAusgang + $BMKZahl + $BMKZahlConstant = "cOut" + $BMKZahlOriginal + #Eintragen in das Array fuer Ausgaenge + $Ausgaenge += @([PSCustomObject]@{ + Name = $BMKZahl + NameOriginal = $BMKZahlOriginal + NameConstant = $BMKZahlConstant + Kommentar = $Kommentar + Zahl = $BMKNurZahl + Zeile = $i + }) + } + else + { + #Anpassen der $BMKZahl: Einfuegen eines Punkts (".") zwischen letzter und vorletzer Stelle von Rechts + $BMKNurZahl = $i + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + $BMKZahlConstant = "cErr" + $BMKZahlOriginal + #Eintragen in das Array fuer Fehler + $Fehler += @([PSCustomObject]@{ + Name = $BMKZahl + NameOriginal = $BMKZahlOriginal + NameConstant = $BMKZahlConstant + Zahl = $BMKNurZahl + Zeile = $i + }) + } + #Erhoehen des Zeilencounters + $i++ + } + + AufgabenAktualisieren "Daten fuer TIA in Excel-Datei schreiben" + #Excel oeffnen und Datei erstellen, Arbeitmappen erstellen und umbennenen + $Datei = New-Object -ComObject Excel.Application + $Mappe = $Datei.Workbooks.Add() + $Mappe.SaveAs($ZielDatei) + $BlattConstants = $Mappe.WorkSheets.item(1) + $BlattConstants.Name = "Constants" + $BlattPLCTags = $Mappe.WorkSheets.Add() + $BlattPLCTags.Name = "PLC Tags" + $Datei.Visible = $false + + #Header fuer Blatt "Constants" erstellen + $BlattConstants.Cells.Item(1,1) = "Name" + $BlattConstants.Cells.Item(1,2) = "Path" + $BlattConstants.Cells.Item(1,3) = "Data Type" + $BlattConstants.Cells.Item(1,4) = "Value" + $BlattConstants.Cells.Item(1,5) = "Comment" + + #Header fuer Blatt "PLC Tags" erstellen + $BlattPLCTags.Cells.Item(1,1) = "Name" + $BlattPLCTags.Cells.Item(1,2) = "Path" + $BlattPLCTags.Cells.Item(1,3) = "Data Type" + $BlattPLCTags.Cells.Item(1,4) = "Logical Address" + $BlattPLCTags.Cells.Item(1,5) = "Comment" + $BlattPLCTags.Cells.Item(1,6) = "Hmi Visible" + $BlattPLCTags.Cells.Item(1,7) = "Hmi Accessible" + $BlattPLCTags.Cells.Item(1,8) = "Hmi Writeable" + $BlattPLCTags.Cells.Item(1,9) = "Typeobject ID" + $BlattPLCTags.Cells.Item(1,10) = "Version ID" + + #Schleife fuer Fehler + #$i ist der Zeilencounter. Die oberste Zeile in Excel ist Zeile 1. In Zeile 1 ist der Header, ab Zeile 2 die Inhalte + #$j ist fuer einen Counter der Eingaenge im Blatt "Constants" + $i = 2 + $j = 0 + $Fehler = $Fehler | Sort-Object "Zahl" + foreach ($EinzelFehler in $Fehler) { + #In Blatt "Constants" schreiben + $BlattConstants.Cells.Item($i,1) = $EinzelFehler.NameConstant#Name + $BlattConstants.Cells.Item($i,2) = "Import" #Path + $BlattConstants.Cells.Item($i,3) = "Int" #Data Type + $BlattConstants.Cells.Item($i,4) = $j #Value + # $BlattConstants.Cells.Item($i,5) = #Comment + + #In Blatt "PLC Tags" schreiben + $BlattPLCTags.Cells.Item($i,1) = $EinzelFehler.NameOriginal#Name + $BlattPLCTags.Cells.Item($i,2) = "Import" #Path + $BlattPLCTags.Cells.Item($i,3) = "Bool" #Data Type + $BlattPLCTags.Cells.Item($i,4) = $EinzelFehler.Name #Logical Address + $BlattPLCTags.Cells.Item($i,5) = $EinzelFehler.Kommentar #Comment + $BlattPLCTags.Cells.Item($i,6) = "'True" #Hmi Visible + $BlattPLCTags.Cells.Item($i,7) = "'True" #Hmi Accessible + $BlattPLCTags.Cells.Item($i,8) = "'True" #Hmi Writeable + # $BlattPLCTags.Cells.Item($i,9) = #Typeobject ID + # $BlattPLCTags.Cells.Item($i,10) = #Version ID + + DateiBeschreibenAktualisieren + $i++ + $j++ + } + + #Schleife fuer Eingaenge + #Zuruecksetzen von $j, da dies jeweils bei Ein- und Ausgaenge bei 0 beginnen muss + $j = 0 + $Eingaenge = $Eingaenge | Sort-Object "Zahl" + foreach ($Eingang in $Eingaenge) { + #In Blatt "Constants" schreiben + $BlattConstants.Cells.Item($i,1) = $Eingang.NameConstant #Name + $BlattConstants.Cells.Item($i,2) = "Import" #Path + $BlattConstants.Cells.Item($i,3) = "Int" #Data Type + $BlattConstants.Cells.Item($i,4) = $j #Value + # $BlattConstants.Cells.Item($i,5) = #Comment + + #In Blatt "PLC Tags" schreiben + $BlattPLCTags.Cells.Item($i,1) = $Eingang.NameOriginal #Name + $BlattPLCTags.Cells.Item($i,2) = "Import" #Path + $BlattPLCTags.Cells.Item($i,3) = "Bool" #Data Type + $BlattPLCTags.Cells.Item($i,4) = $Eingang.Name #Logical Address + $BlattPLCTags.Cells.Item($i,5) = $Eingang.Kommentar #Comment + $BlattPLCTags.Cells.Item($i,6) = "'True" #Hmi Visible + $BlattPLCTags.Cells.Item($i,7) = "'True" #Hmi Accessible + $BlattPLCTags.Cells.Item($i,8) = "'True" #Hmi Writeable + # $BlattPLCTags.Cells.Item($i,9) = #Typeobject ID + # $BlattPLCTags.Cells.Item($i,10) = #Version ID + + DateiBeschreibenAktualisieren + $i++ + $j++ + } + + #Schleife fuer Ausgaenge + #Zuruecksetzen von $j, da dies jeweils bei Ein- und Ausgaenge bei 0 beginnen muss + $j = 0 + $Ausgaenge = $Ausgaenge | Sort-Object "Zahl" + foreach ($Ausgang in $Ausgaenge) { + #In Blatt "Constants" schreiben + $BlattConstants.Cells.Item($i,1) = $Ausgang.NameConstant #Name + $BlattConstants.Cells.Item($i,2) = "Import" #Path + $BlattConstants.Cells.Item($i,3) = "Int" #Data Type + $BlattConstants.Cells.Item($i,4) = $j #Value + # $BlattConstants.Cells.Item($i,5) = #Comment + + #In Blatt "PLC Tags" schreiben + $BlattPLCTags.Cells.Item($i,1) = $Ausgang.NameOriginal #Name + $BlattPLCTags.Cells.Item($i,2) = "Import" #Path + $BlattPLCTags.Cells.Item($i,3) = "Bool" #Data Type + $BlattPLCTags.Cells.Item($i,4) = $Ausgang.Name #Logical Address + $BlattPLCTags.Cells.Item($i,5) = $Ausgang.Kommentar #Comment + $BlattPLCTags.Cells.Item($i,6) = "'True" #Hmi Visible + $BlattPLCTags.Cells.Item($i,7) = "'True" #Hmi Accessible + $BlattPLCTags.Cells.Item($i,8) = "'True" #Hmi Writeable + # $BlattPLCTags.Cells.Item($i,9) = #Typeobject ID + # $BlattPLCTags.Cells.Item($i,10) = #Version ID + + DateiBeschreibenAktualisieren + $i++ + $j++ + } + + #Speichern der Datei und schließen von Excel + $Mappe.Save() + $Datei.Quit() + + #Ermitteln von Duplikaten + $GleicheEingaenge = GleicheFinden $Eingaenge + $GleicheAusgaenge = GleicheFinden $Ausgaenge + + #Dieses beschreiben ist noetig, da sonst in der Rueckgabe Fehler entstehen koennen, wenn entweder $GleicheEingaenge oder $GleicheAusgaenge leer sind (aber nicht beide) + if ( $($Fehler.Length -eq 0)) + { + $Fehler += @([PSCustomObject]@{ + Name = "Keine" + Zeile = "Alle" + }) + } + + return $GleicheEingaenge, $GleicheAusgaenge, $Fehler +} + +#Funktion, die aus einem gegebenem Pfad, Prefixen fuer Ein- und Ausgang und dem Pfad der Zieldatei dort eine Datei erstellt nach dem Format "WSCAD" +#Bei WSCAD ist ein spezieller Header notwendig. Außerdem werden die Ein- und Ausgaenge ergaenzt. Falls im Bereich mit der Endung 0-7 min. ein Ein- oder Ausgang existiert, +#werden alle weiteren Ein- und Ausgaenge in diesem Bereich ergänzt +Function ExcelDateiBeschreibenWSCAD ($PfadUrsprungsdatei, $PrefixEingang, $PrefixAusgang, $ZielDatei) +{ + $Eingaenge = @() + $ZuEingang = @("FDI", "B", "S", "E", "I", "DI", "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BJ", "BK", "BL", "BM", "BN", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", "FA", "FB", "FC", "FD", "FE", "FF", "FG", "FH", "FJ", "FK", "FL", "FM", "FN", "FP", "FQ", "FR", "FS", "FT", "FU", "FV", "FW", "FX", "FY", "FZ", "SA", "SB", "SC", "SD", "SE", "SF", "SG", "SH", "SJ", "SK", "SL", "SM", "SN", "SP", "SQ", "SR", "SS", "ST", "SU", "SV", "SW", "SX", "SY", "SZ") + $Ausgaenge = @() + $ZuAusgang = @("K", "KF", "O", "Q", "M", "A", "P", "DQ", "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CJ", "CK", "CL", "CM", "CN", "CP", "CQ", "CR", "CS", "CT", "CU", "CV", "CW", "CX", "CY", "CZ", "EA", "EB", "EC", "ED", "EE", "EF", "EG", "EH", "EJ", "EK", "EL", "EM", "EN", "EP", "EQ", "ER", "ES", "ET", "EU", "EV", "EW", "EX", "EY", "EZ", "GA", "GB", "GC", "GD", "GE", "GF", "GG", "GH", "GJ", "GK", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GV", "GW", "GX", "GY", "GZ", "HA", "HB", "HC", "HD", "HE", "HF", "HG", "HH", "HJ", "HK", "HL", "HM", "HN", "HP", "HQ", "HR", "HS", "HT", "HU", "HV", "HW", "HX", "HY", "HZ", "KA", "KB", "KC", "KD", "KE", "KG", "KH", "KJ", "KK", "KL", "KM", "KN", "KP", "KQ", "KR", "KS", "KT", "KU", "KV", "KW", "KX", "KY", "KZ", "MA", "MB", "MC", "MD", "ME", "MF", "MG", "MH", "MJ", "MK", "ML", "MM", "MN", "MP", "MQ", "MR", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "PA", "PB", "PC", "PD", "PE", "PF", "PG", "PH", "PJ", "PK", "PL", "PM", "PN", "PP", "PQ", "PR", "PS", "PT", "PU", "PV", "PW", "PX", "PY", "PZ", "QA", "QB", "QC", "QD", "QE", "QF", "QG", "QH", "QJ", "QK", "QL", "QM", "QN", "QP", "QQ", "QR", "QS", "QT", "QU", "QV", "QW", "QX", "QY", "QZ", "RA", "RB", "RC", "RD", "RE", "RF", "RG", "RH", "RJ", "RK", "RL", "RM", "RN", "RP", "RQ", "RR", "RS", "RT", "RU", "RV", "RW", "RX", "RY", "RZ", "TA", "TB", "TC", "TD", "TE", "TF", "TG", "TH", "TJ", "TK", "TL", "TM", "TN", "TP", "TQ", "TR", "TS", "TT", "TU", "TV", "TW", "TX", "TY", "TZ") + $Fehler = @() + + $Ursprungsdatei = Get-Content $PfadUrsprungsdatei + + AufgabenAktualisieren "Daten fuer WSCAD konvertieren" + #Interieren durch die Eintraege + #$i steht fuer die Zeilennummer + $i = 0 + foreach ($Eintrag in $Ursprungsdatei) { + #Teilen der Eintraege in $BMKZahl und $Kommentar + $Eintragszeile = $Eintrag.Split("'") + $BMKZahl = $Eintragszeile[1] + $BMKZahl = $BMKZahl.TrimStart("'") + $Kommentar = $Eintragszeile[3] + $Kommentar = $Kommentar.TrimEnd("'") + #Unterscheiden, ob es sich um einen Ein-, Ausgang oder Fehler handelt + if ($($($BMKZahl -replace "[\d]") -in $ZuEingang)) + { + #Anpassen der $BMKZahl: Entfernen der Buchstaben, einfuegen eines Punkts (".") zwischen letzter und vorletzer Stelle von Rechts und hinzufuegen des Prefix fuer Eingaenge + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + + #Bis zu zwei Voranstehende Nullen entfernen + if ($BMKZahl.Length -ge 4 -and $BMKZahl.Substring(0,1) -eq "0") { + $BMKZahl = $BMKZahl.Substring(1) + if ($BMKZahl.Length -ge 4 -and $BMKZahl.Substring(0,1) -eq "0") { + $BMKZahl = $BMKZahl.Substring(1) + } + } + $BMKZahl = $PrefixEingang + $BMKZahl + #Eintraegen in das Array fuer Eingaenge + $Eingaenge += @([PSCustomObject]@{ + Name = $BMKZahl + Kommentar = $Kommentar + Zeile = $i + }) + } + elseif ($($($BMKZahl -replace "[\d]") -in $ZuAusgang)) + { + #Anpassen der $BMKZahl: Entfernen der Buchstaben, einfuegen eines Punkts (".") zwischen letzter und vorletzer Stelle von Rechts und hinzufuegen des Prefix fuer Ausgaenge + $BMKZahl = $BMKZahl -replace("[a-zA-Z]","") + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + + #Bis zu zwei Voranstehende Nullen entfernen + if ($BMKZahl.Length -ge 3 -and $BMKZahl.Substring(0,1) -eq "0") { + $BMKZahl = $BMKZahl.Substring(1) + if ($BMKZahl.Length -ge 3 -and $BMKZahl.Substring(0,1) -eq "0") { + $BMKZahl = $BMKZahl.Substring(1) + } + } + $BMKZahl = $PrefixAusgang + $BMKZahl + #Eintragen in das Array fuer Ausgaenge + $Ausgaenge += @([PSCustomObject]@{ + Name = $BMKZahl + Kommentar = $Kommentar + Zeile = $i + }) + } + else + { + #Anpassen der $BMKZahl: Einfuegen eines Punkts (".") zwischen letzter und vorletzer Stelle von Rechts + $BMKZahlLaenge = $($BMKZahl.Length - 1) + $BMKZahl = $BMKZahl.Substring(0,$BMKZahlLaenge) + "." + $BMKZahl.Substring($BMKZahlLaenge) + #Eintragen in das Array fuer Fehler + $Fehler += @([PSCustomObject]@{ + Name = $BMKZahl + Kommentar = $Kommentar + Zeile = $i + }) + } + #Erhoehen des Zeilencounters + $i++ + } + + #Ergaenzen der Ein- und Ausgaenge. Falls an der SPS (physikalisch) min. einer der 8 Anschluesse (0-7) genutzt wird, sind zwangsweise die anderen auch vorhanden. + #Deswegen werden diese hier ohne Kommentar hinzugefuegt. + AufgabenAktualisieren "Anschluesse fuer Eingaenge ergaenzen" + $Eingaenge = AnschluesseErgaenzen $Eingaenge + AufgabenAktualisieren "Anschluesse fuer Ausgaenge ergaenzen" + $Ausgaenge = AnschluesseErgaenzen $Ausgaenge + + AufgabenAktualisieren "Daten fuer WSCAD in Excel-Datei schreiben" + #Excel oeffnen und Datei erstellen + $Datei = New-Object -ComObject Excel.Application + $Mappe = $Datei.Workbooks.Add() + $Mappe.SaveAs($ZielDatei) + $Blatt = $Mappe.WorkSheets.item(1) + $Datei.Visible = $false + + #Header erstellen + $Blatt.Cells.Item(1,1) = "Anschluss" + $Blatt.Cells.Item(1,2) = "Kommentar" + $Blatt.Cells.Item(1,3) = "Symboltext" + $Blatt.Cells.Item(1,4) = "Bezug" + $Blatt.Cells.Item(1,5) = "Sondertext 1" + $Blatt.Cells.Item(1,6) = "Sondertext 2" + $Blatt.Cells.Item(1,7) = "Sondertext 3" + $Blatt.Cells.Item(1,8) = "Sondertext 4" + $Blatt.Cells.Item(1,9) = "Sondertext 5" + $Blatt.Cells.Item(1,10) = "Sondertext 6" + $Blatt.Cells.Item(1,11) = "Sondertext 7" + $Blatt.Cells.Item(1,12) = "Sondertext 8" + + #Schleife fuer Fehler + #$i ist der Zeilencounter. Die oberste Zeile in Excel ist Zeile 1. Dort ist der Header. Ab Zeile 2 kommen die Inhalte. + $i = 2 + $Fehler = $Fehler | Sort-Object "Name" + foreach ($EinzelFehler in $Fehler) { + #In Blatt schreiben + $Blatt.Cells.Item($i,1) = $EinzelFehler.Name #Anschluss + $Blatt.Cells.Item($i,2) = $EinzelFehler.Kommentar #Kommentar + # $Blatt.Cells.Item($i,3) = "" #Symboltext + # $Blatt.Cells.Item($i,4) = "" #Bezug + + DateiBeschreibenAktualisieren + $i++ + } + + #Schleife fuer Eingaenge + $Eingaenge = $Eingaenge | Sort-Object "Name" + foreach ($Eingang in $Eingaenge) { + #In Blatt schreiben + $Blatt.Cells.Item($i,1) = $Eingang.Name #Anschluss + $Blatt.Cells.Item($i,2) = $Eingang.Kommentar #Kommentar + # $Blatt.Cells.Item($i,3) = "" #Symboltext + # $Blatt.Cells.Item($i,4) = "" #Bezug + + DateiBeschreibenAktualisieren + $i++ + } + + #Schleife fuer Ausgaenge + $Ausgaenge = $Ausgaenge | Sort-Object "Name" + foreach ($Ausgang in $Ausgaenge) { + #In Blatt schreiben + $Blatt.Cells.Item($i,1) = $Ausgang.Name #Anschluss + $Blatt.Cells.Item($i,2) = $Ausgang.Kommentar #Kommentar + # $Blatt.Cells.Item($i,3) = "" #Symboltext + # $Blatt.Cells.Item($i,4) = "" #Bezug + + DateiBeschreibenAktualisieren + $i++ + } + + #Speichern der Datei und schließen von Excel + $Mappe.Save() + $Datei.Quit() + + #Ermitteln von Duplikaten + $GleicheEingaenge = GleicheFinden $Eingaenge + $GleicheAusgaenge = GleicheFinden $Ausgaenge + + #Dieses beschreiben ist noetig, da sonst in der Rueckgabe Fehler entstehen koennen, wenn entweder $GleicheEingaenge oder $GleicheAusgaenge leer sind (aber nicht beide) + if ( $($Fehler.Length -eq 0)) + { + $Fehler += @([PSCustomObject]@{ + Name = "Keine" + Zeile = "Alle" + }) + } + + return $GleicheEingaenge, $GleicheAusgaenge, $Fehler +} + +#Funktion, die ein Array erhaelt und ueberprueft, ob ein oder mehrere Eintraege gleich sind. Die gleiche Eintraege werden zurueckgegeben. +Function GleicheFinden ($ZuUeberpruefen) +{ + $ZuUeberpruefen = $ZuUeberpruefen | Sort-Object "Name" + $Gleiche = @() + #Schleife zum iterieren durch die Eintraege + for ($i = 0; $i -lt $($ZuUeberpruefen.Count - 1); $i++) + { + #Boolean $IstGleich gibt an, ob der aktuelle und der folgende Eintrag gleich sind. + $IstGleich = $($ZuUeberpruefen[$i].Name -eq $ZuUeberpruefen[$($i+1)].Name) + if ($IstGleich) + { + #Eintrag hinzufuegen, falls es den Eintrag nicht schon gibt + if (-not $($Gleiche[-1].Zeile -eq $ZuUeberpruefen[$i].Zeile)) + { + $Gleiche += $ZuUeberpruefen[$i] + } + $Gleiche += $ZuUeberpruefen[$($i+1)] + } + } + + #Falls es keine Duplikate gibt, gibt es fuer keine Namen in allen Zeilen Duplikate + #Die Werte werden hinzugefuegt, um spaetere Probleme beim Eintragen der Wert in das GUI verhindert werden + if ( $($Gleiche.Length -eq 0)) + { + $Gleiche += @([PSCustomObject]@{ + Name = "Keine" + Zeile = "Alle" + }) + } + + return $Gleiche +} + +#Funktion, die eine Liste von Anschluessen erhaelt und diese ergaenzt. Falls min. einer der Anschluesse von 0-7 vorhanden ist, werden alle anderen, noch nicht vorhandenen, hinzugefuegt +Function AnschluesseErgaenzen ($Anschluesse) +{ + $Anschluesse = $Anschluesse | Sort-Object "Name" + + #Schleife zum iterieren durch die Anschluesse + foreach ($Anschluss in $Anschluesse) { + #Ermitteln der Baugruppe des aktuellen Anschlusses. Die Baugruppe ist die zweite Stelle von Rechts. + $AnschlussBauteil = $Anschluss.Name.Substring(0,$Anschluss.Name.Length - 2) + #Festlegen der Anschluesse, die vorhanden sein sollen + $SollAnschluesse = @(0,1,2,3,4,5,6,7) + #Schleife zum ueberpruefen, ob in der Baugruppe des aktuellen Anschlusses weitere Anschluesse vorhanden sind + foreach ($SubAnschluss in $Anschluesse) { + #Ermitteln der Baugruppe des aktuellen Sub-Anschlusses + $SubAnschlussBauteil = $SubAnschluss.Name.Substring(0,$SubAnschluss.Name.Length - 2) + #Wenn das Bauteil von Anschluss und Sub-Anschluss gleich ist, muss der Anschluss in der Liste der $SollAnschluesse gestrichen werden + if ($SubAnschlussBauteil -eq $AnschlussBauteil) { + #Den zu streichenden Anschluss ermitteln + $SubAnschlussLetzteStelle = $($SubAnschluss.Name).Substring($SubAnschluss.Name.Length - 1,1) + #Den zu streichenden Anschluss aus der Liste entfernen + $SollAnschluesse = $SollAnschluesse | Where-Object {$_ -ne $SubAnschlussLetzteStelle} + } + } + #Ergaenzen der fehlenden Anschluesse + foreach ($FehlenderAnschluss in $SollAnschluesse) { + #Weil durch die zusaetzlichen Eintraege auch die Zahl der Gesamteintraege steigt, wird die Zahl der $GesamtEintraege korrigiert + [System.Double] $GesamtEintraege = $FATextfeldGesamtEintraege.Text + $GesamtEintraege++ + $FATextfeldGesamtEintraege.Text = $GesamtEintraege + + #Der Name des zu ergaenzenden Anschlusses ist, bis auf die letzte Stelle, gleich dem des aktuellen Anschlusses + $Name = $Anschluss.Name + #Tausche die letzte Stelle durch den Wert von $FehlenderAnschluss aus + $BMKZahl = $($($Name.Substring(0,$Name.Length - 1)) + $FehlenderAnschluss) + #Den ergaenzten Anschluss in die Liste aller Anschluesse ergaenzen + $Anschluesse += @([PSCustomObject]@{ + Name = $BMKZahl + Kommentar = "" + #Zeile = "" # Wird nich gebraucht, da hier keine Duplikate auftreten koennen. Ausserdem gibt es ohnehin keine zugehoerige Zeile in der UrsprungsDatei + }) + } + } + $Anschluesse = $Anschluesse | Sort-Object "Name" + return $Anschluesse +} + +Main \ No newline at end of file diff --git a/Test-Skripte/GUI-Vorlage.ps1 b/Test-Skripte/GUI-Vorlage.ps1 new file mode 100644 index 0000000..0eb2b9f --- /dev/null +++ b/Test-Skripte/GUI-Vorlage.ps1 @@ -0,0 +1,43 @@ +$mailAddresses = ("sdasd@ddfsf.net","ououoizu@fdssd.com","ssdfdsfds@dsfds.org") + +function FnShowDialog { + [void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") + #~~< Form1 >~~~~~~~~~~~~~~~~~~~~~~~~~~ + $Form1 = New-Object System.Windows.Forms.Form + $Form1.ClientSize = "347, 86" + $Form1.Font = New-Object System.Drawing.Font("Microsoft Sans Serif", 9.75, [System.Drawing.FontStyle]::Regular, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) + $Form1.FormBorderStyle = "FixedToolWindow" + $Form1.MaximizeBox = $false + $Form1.MinimizeBox = $false + $Form1.BackColor = "White" + #~~< Label1 >~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + $Label1 = New-Object System.Windows.Forms.Label + $Label1.Location = "13, 13" + $Label1.Size = "217, 23" + $Label1.Text = "Bitte Mailadresse wählen:" + #~~< Button1 >~~~~~~~~~~~~~~~~~~~~~~~~~ + $Button1 = New-Object System.Windows.Forms.Button + $Button1.Location = "259, 41" + $Button1.Size = "76, 26" + $Button1.Text = "OK" + $Button1.add_MouseClick({ + $script:selectedMailAdr = $ComboBox1.SelectedItem + $Form1.dispose() + }) + #~~< ComboBox1 >~~~~~~~~~~~~~~~~~~~~~~~~~~ + $ComboBox1 = New-Object System.Windows.Forms.ComboBox + $ComboBox1.Location = "12, 40" + $ComboBox1.SelectedIndex = -1 + $ComboBox1.DropDownStyle = "DropDownList" + $ComboBox1.Size = "231, 24" + $ComboBox1.Items.AddRange($mailAddresses) + + $Form1.Controls.Add($Label1) + $Form1.Controls.Add($Button1) + $Form1.Controls.Add($ComboBox1) + [System.Windows.Forms.Application]::Run($Form1) +} + + +FnShowDialog +Write-Host $selectedMailAdr \ No newline at end of file diff --git a/Test-Skripte/Skript1.ps1 b/Test-Skripte/Skript1.ps1 new file mode 100644 index 0000000..871efd6 --- /dev/null +++ b/Test-Skripte/Skript1.ps1 @@ -0,0 +1,10 @@ +$Excel = New-Object -ComObject Excel.Application +$EDatei = $Excel.WorkBooks.Open("R:\m.kraft\Excel Werte ändern\Excel-Datei.xlsx") +$EBlatt = $EDatei.WorkSheets.item(1) +$Excel.Visible = $true +$EBlatt.Cells.Item(1,1) = 5 +$EBlatt.Cells.Item(2,1) = 15 +$EBlatt.Cells.Item(1,2) = 25 +# [Zahl 1 => Zeile][Zahl 2 => Spalte] +$EDatei.Save() +$Excel.Quit() \ No newline at end of file diff --git a/Test-Skripte/Skript10.ps1 b/Test-Skripte/Skript10.ps1 new file mode 100644 index 0000000..a8f1f47 --- /dev/null +++ b/Test-Skripte/Skript10.ps1 @@ -0,0 +1,17 @@ +$Laufwerke = $(Get-PSDrive | where {$_.Free}).Name + +Write-Host "Laufwerke: " $Laufwerke +$i = 0 + +foreach($LaufwerksBuchstabe in $Laufwerke) +{ + $Laufwerke[$i] = $LaufwerksBuchstabe + ":\" + Write-Host $LaufwerksBuchstabe + + $i++ +} + +Write-Host "Laufwerke: " $Laufwerke +$Laufwerke[0] = $(Split-Path $Laufwerke[0]) +Write-Host $Laufwerke[0] +#Write-Host $CMod \ No newline at end of file diff --git a/Test-Skripte/Skript11.ps1 b/Test-Skripte/Skript11.ps1 new file mode 100644 index 0000000..8039082 --- /dev/null +++ b/Test-Skripte/Skript11.ps1 @@ -0,0 +1,29 @@ +$Pfad = "R:\m.kraft\Excel Werte ändern" + +$UnterOrdner = $(Get-ChildItem $Pfad -Directory) +$Zurueck = "Zurück" +$Ordner2 = @() + +foreach ($Ordner in $UnterOrdner) +{ + $Ordner2 += [System.String]$Ordner +} + +$Optionen = $Ordner2 + $Zurueck +Write-Host "Optionen: " $Optionen + +$Input = $Optionen | Out-GridView -Title "Name" -OutputMode Single +Write-Host "Auswahl: " $Input + +<# +$Pfad = "R:\m.kraft\Excel Werte ändern" + +$UnterOrdner = $(Get-ChildItem $Pfad -Directory) +[System.IO.DirectoryInfo]$Zurueck = "Zurück" + +$Optionen = $UnterOrdner + $Zurueck +Write-Host "Optionen: " $Optionen + +$Input = $Optionen | Out-GridView -Title "Name" -OutputMode Single +Write-Host "Auswahl: " $Input +#> \ No newline at end of file diff --git a/Test-Skripte/Skript12.ps1 b/Test-Skripte/Skript12.ps1 new file mode 100644 index 0000000..9ccd87a --- /dev/null +++ b/Test-Skripte/Skript12.ps1 @@ -0,0 +1,5 @@ +$Datei = Get-Content "R:\m.kraft\Excel Werte ändern\EA_Krüger_19.03.2020 - K.txt" + +$LaengeDatei = $($Datei.Length) + +Write-Host $LaengeDatei \ No newline at end of file diff --git a/Test-Skripte/Skript13 copy.ps1 b/Test-Skripte/Skript13 copy.ps1 new file mode 100644 index 0000000..489a59e --- /dev/null +++ b/Test-Skripte/Skript13 copy.ps1 @@ -0,0 +1,17 @@ + +function Menue +{ + [reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null + [reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null + + $Fenster = New-Object System.Windows.Forms.FolderBrowserDialog + #$Fenster.Title = "Datei öffnen" + #$Fenster.Filter = ".txt Dateien (*.txt)|*.txt" #Anzeigename|Dateityp + #$Fenster.ShowHelp = $true # Dadurch sieht der Explorer aus wie von Win 98 und die "Hilfe" funktioniert nicht + $Fenster.ShowDialog() + $Pfad = $Fenster.SelectedPath + return $Pfad +} + +$Pfad = Menue +Write-Host "Rückgabe: " $Pfad \ No newline at end of file diff --git a/Test-Skripte/Skript13.ps1 b/Test-Skripte/Skript13.ps1 new file mode 100644 index 0000000..01145b4 --- /dev/null +++ b/Test-Skripte/Skript13.ps1 @@ -0,0 +1,17 @@ + +function Menue +{ + [reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null + [reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null + + $Fenster = New-Object System.Windows.Forms.OpenFileDialog + $Fenster.Title = "Datei öffnen" + $Fenster.Filter = ".txt Dateien (*.txt)|*.txt" #Anzeigename|Dateityp + #$Fenster.ShowHelp = $true # Dadurch sieht der Explorer aus wie von Win 98 und die "Hilfe" funktioniert nicht + $Fenster.ShowDialog() + $Pfad = $Fenster.FileName + return $Pfad +} + +$Pfad = Menue +Write-Host "Rückgabe: " $Pfad \ No newline at end of file diff --git a/Test-Skripte/Skript14.ps1 b/Test-Skripte/Skript14.ps1 new file mode 100644 index 0000000..bfef7e7 --- /dev/null +++ b/Test-Skripte/Skript14.ps1 @@ -0,0 +1,107 @@ +Write-Host $(Get-Date -Format "HH:mm:ss") +<# +$Excel = New-Object -ComObject Excel.Application +$EDatei = $Excel.WorkBooks.Open("R:\m.kraft\Excel Werte ändern\Excel-Datei.xlsx") +$EBlatt = $EDatei.WorkSheets.item(1) +$Excel.Visible = $false +#> + +$Pfad = "R:\m.kraft\Excel Werte ändern\EA_Krüger_19.03.2020.txt" +$i = 1 + +$DIs = @() +$DQs = @() +$Fehler = @() + + +$Datei = Get-Content $Pfad + +$ZuDI = @(„DI“, „BA“, „BB“, „BC“, „BD“, „BE“, „BF“, „BG“, „BH“, „BJ“, „BK“, „BL“, „BM“, „BN“, „BP“, „BQ“, „BR“, „BS“, „BT“, „BU“, „BV“, „BW“, „BX“, „BY“, „BZ“, „FA“, „FB“, „FC“, „FD“, „FE“, „FF“, „FG“, „FH“, „FJ“, „FK“, „FL“, „FM“, „FN“, „FP“, „FQ“, „FR“, „FS“, „FT“, „FU“, „FV“, „FW“, „FX“, „FY“, „FZ“, „SA“, „SB“, „SC“, „SD“, „SE“, „SF“, „SG“, „SH“, „SJ“, „SK“, „SL“, „SM“, „SN“, „SP“, „SQ“, „SR“, „SS“, „ST“, „SU“, „SV“, „SW“, „SX“, „SY“, „SZ“) +$ZuDQ = @(„DQ“, „CA“, „CB“, „CC“, „CD“, „CE“, „CF“, „CG“, „CH“, „CJ“, „CK“, „CL“, „CM“, „CN“, „CP“, „CQ“, „CR“, „CS“, „CT“, „CU“, „CV“, „CW“, „CX“, „CY“, „CZ“, „EA“, „EB“, „EC“, „ED“, „EE“, „EF“, „EG“, „EH“, „EJ“, „EK“, „EL“, „EM“, „EN“, „EP“, „EQ“, „ER“, „ES“, „ET“, „EU“, „EV“, „EW“, „EX“, „EY“, „EZ“, „GA“, „GB“, „GC“, „GD“, „GE“, „GF“, „GG“, „GH“, „GJ“, „GK“, „GL“, „GM“, „GN“, „GP“, „GQ“, „GR“, „GS“, „GT“, „GU“, „GV“, „GW“, „GX“, „GY“, „GZ“, „HA“, „HB“, „HC“, „HD“, „HE“, „HF“, „HG“, „HH“, „HJ“, „HK“, „HL“, „HM“, „HN“, „HP“, „HQ“, „HR“, „HS“, „HT“, „HU“, „HV“, „HW“, „HX“, „HY“, „HZ“, „KA“, „KB“, „KC“, „KD“, „KE“, „KF“, „KG“, „KH“, „KJ“, „KK“, „KL“, „KM“, „KN“, „KP“, „KQ“, „KR“, „KS“, „KT“, „KU“, „KV“, „KW“, „KX“, „KY“, „KZ“, „MA“, „MB“, „MC“, „MD“, „ME“, „MF“, „MG“, „MH“, „MJ“, „MK“, „ML“, „MM“, „MN“, „MP“, „MQ“, „MR“, „MQ“, „MR“, „MS“, „MT“, „MU“, „MV“, „MW“, „MX“, „MY“, „MZ“, „PA“, „PB“, „PC“, „PD“, „PE“, „PF“, „PG“, „PH“, „PJ“, „PK“, „PL“, „PM“, „PN“, „PP“, „PQ“, „PR“, „PS“, „PT“, „PU“, „PV“, „PW“, „PX“, „PY“, „PZ“, „QA“, „QB“, „QC“, „QD“, „QE“, „QF“, „QG“, „QH“, „QJ“, „QK“, „QL“, „QM“, „QN“, „QP“, „QQ“, „QR“, „QS“, „QT“, „QU“, „QV“, „QW“, „QX“, „QY“, „QZ“, „RA“, „RB“, „RC“, „RD“, „RE“, „RF“, „RG“, „RH“, „RJ“, „RK“, „RL“, „RM“, „RN“, „RP“, „RQ“, „RR“, „RS“, „RT“, „RU“, „RV“, „RW“, „RX“, „RY“, „RZ“, „TA“, „TB“, „TC“, „TD“, „TE“, „TF“, „TG“, „TH“, „TJ“, „TK“, „TL“, „TM“, „TN“, „TP“, „TQ“, „TR“, „TS“, „TT“, „TU“, „TV“, „TW“, „TX“, „TY“, „TZ“) + +foreach ($Eintrag in $Datei) +{ + $Eintragszeile = $Eintrag.split("'") + <#Write-Host "Gesamter eintrag " $Eintragszeile + Write-Host "Eintrag 1 " $Eintragszeile[0] + Write-Host "Eintrag 2 " $Eintragszeile[1] + Write-Host "Eintrag 3 " $Eintragszeile[2] + Write-Host "Eintrag 4 " $Eintragszeile[3]#> + $EAZahl = $Eintragszeile[1] + $EAKommentar = $Eintragszeile[3] + + $EAZahl = $EAZahl.TrimStart("'") + #$EAZahl = $EAZahl.TrimEnd("'") + #$EAKommentar = $EAKommentar.TrimStart("'") + $EAKommentar = $EAKommentar.TrimEnd("'") + + if ($($($EAZahl.Substring(0,2)) -in $ZuDI)) + { + $EAZahl = $EAZahl -replace("[a-zA-Z]", "") + $LaengeEAZahl = $($EAZahl.Length - 1) + $EAZahl = $EAZahl.Substring(0,$LaengeEAZahl) + "." + $EAZahl.Substring($LaengeEAZahl) + $EAZahl = "DI" + $EAZahl + $DIs += @([pscustomobject]@{Name=$EAZahl;Zeile=$i}) + } + elseif ($($($EAZahl.Substring(0,2)) -in $ZuDQ)) + { + $EAZahl = $EAZahl -replace("[a-zA-Z]", "") + $LaengeEAZahl = $($EAZahl.Length - 1) + $EAZahl = $EAZahl.Substring(0,$LaengeEAZahl) + "." + $EAZahl.Substring($LaengeEAZahl) + $EAZahl = "DQ" + $EAZahl + $DQs += @([pscustomobject]@{Name=$EAZahl;Zeile=$i}) + } + else + { + Write-Host "Achtung, Fehler bei $EAZahl $EAKommentar" + $Fehler += @([pscustomobject]@{Name=$EAZahl;Zeile=$i}) + #fehler + } + + #Write-Host $EAZahl + #Write-Host $EAKommentar + + #$EBlatt.Cells.Item($i,1) = $EAZahl + #$EBlatt.Cells.Item($i,2) = $EAKommentar + + $i++ +} + +#$EDatei.Save() +#$Excel.Quit() + +$DIs = $DIs | Sort-Object "Name" +$Gleiche = @() + +for ($j = 0; $j -lt $($DIs.Count -1); $j++) +{ + $IstGleich = $($DIs[$j].Name -eq $DIs[$($j+1)].Name) + if ( $IstGleich ) + { + #Eintrag hinzufügen + if ( -not $($Gleiche[-1].Zeile -eq $DIs[$j].Zeile)) + { + $Gleiche += $DIs[$j] + } + $Gleiche += $DIs[$($j +1)] + Write-Host "Gleiche: " $Gleiche + } +} + +# $Gleiche = $Gleiche.Zeile | select -Unique + +if ($($Gleiche.Length) -gt 0) +{ + Write-Host "Folgende Eingänge sind doppelt belegt" + Write-Host "Eingang Zeile (Excel)" + foreach ($Gleich in $Gleiche) + { + Write-Host $Gleich.Name " " $Gleich.Zeile + } +} +else +{ + Write-Host "Es gibt keine doppelt belegten Eingänge!" +} + +Write-Host $(Get-Date -Format "HH:mm:ss") \ No newline at end of file diff --git a/Test-Skripte/Skript15.ps1 b/Test-Skripte/Skript15.ps1 new file mode 100644 index 0000000..53c2f73 --- /dev/null +++ b/Test-Skripte/Skript15.ps1 @@ -0,0 +1,8 @@ +$Pfad = "R:\m.kraft\Excel Werte ändern\Test-Skripte\EinstellungenSkriptKonvertierung2.txt" + +$DateiInhalt = Get-Content $Pfad +$Zeile1 = $DateiInhalt[0] + +Clear-Content -Path $Pfad +Add-Content -Path $Pfad $Zeile1 +Add-Content -Path $Pfad "x" \ No newline at end of file diff --git a/Test-Skripte/Skript16.ps1 b/Test-Skripte/Skript16.ps1 new file mode 100644 index 0000000..9567888 --- /dev/null +++ b/Test-Skripte/Skript16.ps1 @@ -0,0 +1,14 @@ +Function ExcelDateiNameErstellen ($EingestellterName, $PfadUrsprungsdatei, $PfadZielDatei) +{ + $NameUrsprungsdatei = Split-Path $PfadUrsprungsdatei -Leaf + $NameUrsprungsdateiLaenge = $NameUrsprungsdatei.Length + $NameUrsprungsdateiKurz = $NameUrsprungsdatei.Substring(0, $($NameUrsprungsdateiLaenge - 4)) + + $GesamtPfadZielDatei = $PfadZielDatei + "\" + $EingestellterName.Replace("[Ursprungsdatei]",$NameUrsprungsdateiKurz) + ".xlsx" + + return $GesamtPfadZielDatei +} + +$Name = ExcelDateiNameErstellen "EA_Ausgabe" "R:\m.kraft\Excel Werte ändern\EA_Krüger_19.03.2020.xlsx" "R:\m.kraft\Excel Werte ändern\_Test" + +Write-Host $Name \ No newline at end of file diff --git a/Test-Skripte/Skript17.ps1 b/Test-Skripte/Skript17.ps1 new file mode 100644 index 0000000..305418c --- /dev/null +++ b/Test-Skripte/Skript17.ps1 @@ -0,0 +1,50 @@ +function KompatibilitaetsCheck ($SpeicherOrt){ + $Inhalte = Get-Content $SpeicherOrt + if ($Inhalte.Length -eq 0) { + Write-Host "Inhalte: $Inhalte" + return $false + } + else { + foreach ($Zeile in $Inhalte) { + if (-not ($Zeile -match "'\w+','.+'") -and $Zeile.Length -gt 0) { + return $false + } + } + } + return $true +} + +Function TxtDateienFinden($Pfad) +{ +$TxtDateien = $(Get-Childitem $Pfad\*.txt) + +$SaubereTxtS = @() + +if ($TxtDateien.Length -gt 0) +{ + foreach ($TxtDatei in $TxtDateien) { + if (KompatibilitaetsCheck $TxtDatei) { + $SaubereTxtS += $TxtDatei + } + else { + Write-Host "Aussortierte Dateien: $TxtDatei" + } + } + return $(Split-Path $SaubereTxtS -Leaf) +} +else +{ + return +} +} + + +Write-Host "------------------------------------------------------------" +$SZ = Get-Date -Format "HH:mm:ss" +Write-Host "Startzeit $SZ" + +$Dateien = TxtDateienFinden "R:\m.kraft\Excel Werte ändern" +Write-Host "Dateien: $Dateien" + +$EZ = Get-Date -Format "HH:mm:ss" +Write-Host "Endzeit " $EZ \ No newline at end of file diff --git a/Test-Skripte/Skript18.ps1 b/Test-Skripte/Skript18.ps1 new file mode 100644 index 0000000..1f359df --- /dev/null +++ b/Test-Skripte/Skript18.ps1 @@ -0,0 +1,62 @@ + $SPSAnschluesse = @([PSCustomObject]@{ + Name = "E100.5" + Kommentar = "Kommentar E100.5" + Zeile = "5" + }) + $SPSAnschluesse += @([PSCustomObject]@{ + Name = "E200.0" + Kommentar = "Kommentar E200.0" + Zeile = "7" + }) + $SPSAnschluesse += @([PSCustomObject]@{ + Name = "E100.0" + Kommentar = "Kommentar 100.0" + Zeile = "4" + }) + + Clear-Variable SPSFehlendeAnschluesse + + #Schleife fuer SPS + $SPSAnschluesse = $SPSAnschluesse | Sort-Object "Name" + Write-Host "Uebergebene SPS-Anschluesse: " $SPSAnschluesse + foreach ($SPSAnschluss in $SPSAnschluesse) { + # $SPSSubAnschlussLetzteStelle = @() + Write-Host "Aktueller SPS-Anschluss: " $SPSAnschluss.Name + #Write-Host "Laenge SPSAnschluss: " $SPSAnschluss.Name.Length + $SPSAnschlussBauteil = $SPSAnschluss.Name.Substring(0,$SPSAnschluss.Name.Length - 2) + Clear-Variable SPSFehlendeAnschluesse + $SollAnschluesse = @(0,1,2,3,4,5,6,7) + foreach ($SPSSubAnschluss in $SPSAnschluesse) { + Write-Host "Aktueller Sub-Anschluss: " $SPSSubAnschluss.Name + $SPSSubAnschlussBauteil = $SPSSubAnschluss.Name.Substring(0,$SPSSubAnschluss.Name.Length - 2) + if ($SPSSubAnschlussBauteil -eq $SPSAnschlussBauteil) { + Write-Host "Fall eingetreten: Vorletzte Stelle von SPS und SubSPS sind gleich" + $SPSSubAnschlussLetzteStelle = $($SPSSubAnschluss.Name).Substring($SPSSubAnschluss.Name.Length - 1,1) + Write-Host "Inhalt von SPSSubAnschlussLetzteStelle: " $SPSSubAnschlussLetzteStelle + Write-Host "Alte SollAnschluesse: " $SollAnschluesse + $SollAnschluesse = $SollAnschluesse | Where-Object {$_ -ne $SPSSubAnschlussLetzteStelle} + Write-Host "Neue SollAnschluesse: " $SollAnschluesse + } + } + + Write-Host "Uebergebene fehlende Anschluesse: " $SollAnschluesse + foreach ($FehlendenAnschluss in $SollAnschluesse) { + Write-Host "Aktuell fehlender Anschluss: " $FehlendenAnschluss + $SPSName = $SPSAnschluss.Name + $BMKZahl = $($($SPSName.Substring(0,$SPSName.Length - 1)) + $FehlendenAnschluss) + $SPSAnschluesse += @([PSCustomObject]@{ + Name = $BMKZahl + Kommentar = "" + #Zeile = "" wird nich gebraucht, da hier keine Duplikate auftreten koennen. Ausserdem gibt es ohnehin keine zugehoerige Zeile in der UrsprungsDatei + }) + Write-Host "Neue SPSAnschluesse: " $SPSAnschluesse + } + } + + $SPSAnschluesse = $SPSAnschluesse | Sort-Object "Name" + Write-Host "Neue SPSAnschluesse sortiert: " $SPSAnschluesse + Write-Host "" + Write-Host "" + Write-Host "------------------------------------------------------------------------------------------------------------------------------------------------------------" + Write-Host "" + Write-Host "" diff --git a/Test-Skripte/Skript19.ps1 b/Test-Skripte/Skript19.ps1 new file mode 100644 index 0000000..baeb4aa --- /dev/null +++ b/Test-Skripte/Skript19.ps1 @@ -0,0 +1,3 @@ +$ZielDatei = "R:\m.kraft\ExcelWerteÄndern\Pre-Veröffentlicht\PAG_Alle_Heber_Export_Brics.xlsx" +$ZielDateiBMK = $ZielDatei.Substring(0,$Zieldatei.Length -5) + "_BMK" + $ZielDatei.Substring($Zieldatei.Length -5) +Write-Host $ZielDateiBMK \ No newline at end of file diff --git a/Test-Skripte/Skript2-EA.ps1 b/Test-Skripte/Skript2-EA.ps1 new file mode 100644 index 0000000..01ee52e --- /dev/null +++ b/Test-Skripte/Skript2-EA.ps1 @@ -0,0 +1,106 @@ +Write-Host $(Get-Date -Format "HH:mm:ss") + +$Excel = New-Object -ComObject Excel.Application +$EDatei = $Excel.WorkBooks.Open("R:\m.kraft\Excel Werte ändern\Realtest\IO_EXP_TBS_14.01.2021.xlsx") +$EBlatt = $EDatei.WorkSheets.item(1) +$Excel.Visible = $false + +$Pfad = "R:\m.kraft\Excel Werte ändern\Realtest\IO_EXP_TBS_14.01.2021.txt" +$i = 1 + +$DIs = @() +$DQs = @() +$Fehler = @() + + +$Datei = Get-Content $Pfad + +$ZuDI = @(„DI“, „BA“, „BB“, „BC“, „BD“, „BE“, „BF“, „BG“, „BH“, „BJ“, „BK“, „BL“, „BM“, „BN“, „BP“, „BQ“, „BR“, „BS“, „BT“, „BU“, „BV“, „BW“, „BX“, „BY“, „BZ“, „FA“, „FB“, „FC“, „FD“, „FE“, „FF“, „FG“, „FH“, „FJ“, „FK“, „FL“, „FM“, „FN“, „FP“, „FQ“, „FR“, „FS“, „FT“, „FU“, „FV“, „FW“, „FX“, „FY“, „FZ“, „SA“, „SB“, „SC“, „SD“, „SE“, „SF“, „SG“, „SH“, „SJ“, „SK“, „SL“, „SM“, „SN“, „SP“, „SQ“, „SR“, „SS“, „ST“, „SU“, „SV“, „SW“, „SX“, „SY“, „SZ“) +$ZuDQ = @(„DQ“, „CA“, „CB“, „CC“, „CD“, „CE“, „CF“, „CG“, „CH“, „CJ“, „CK“, „CL“, „CM“, „CN“, „CP“, „CQ“, „CR“, „CS“, „CT“, „CU“, „CV“, „CW“, „CX“, „CY“, „CZ“, „EA“, „EB“, „EC“, „ED“, „EE“, „EF“, „EG“, „EH“, „EJ“, „EK“, „EL“, „EM“, „EN“, „EP“, „EQ“, „ER“, „ES“, „ET“, „EU“, „EV“, „EW“, „EX“, „EY“, „EZ“, „GA“, „GB“, „GC“, „GD“, „GE“, „GF“, „GG“, „GH“, „GJ“, „GK“, „GL“, „GM“, „GN“, „GP“, „GQ“, „GR“, „GS“, „GT“, „GU“, „GV“, „GW“, „GX“, „GY“, „GZ“, „HA“, „HB“, „HC“, „HD“, „HE“, „HF“, „HG“, „HH“, „HJ“, „HK“, „HL“, „HM“, „HN“, „HP“, „HQ“, „HR“, „HS“, „HT“, „HU“, „HV“, „HW“, „HX“, „HY“, „HZ“, „KA“, „KB“, „KC“, „KD“, „KE“, „KF“, „KG“, „KH“, „KJ“, „KK“, „KL“, „KM“, „KN“, „KP“, „KQ“, „KR“, „KS“, „KT“, „KU“, „KV“, „KW“, „KX“, „KY“, „KZ“, „MA“, „MB“, „MC“, „MD“, „ME“, „MF“, „MG“, „MH“, „MJ“, „MK“, „ML“, „MM“, „MN“, „MP“, „MQ“, „MR“, „MQ“, „MR“, „MS“, „MT“, „MU“, „MV“, „MW“, „MX“, „MY“, „MZ“, „PA“, „PB“, „PC“, „PD“, „PE“, „PF“, „PG“, „PH“, „PJ“, „PK“, „PL“, „PM“, „PN“, „PP“, „PQ“, „PR“, „PS“, „PT“, „PU“, „PV“, „PW“, „PX“, „PY“, „PZ“, „QA“, „QB“, „QC“, „QD“, „QE“, „QF“, „QG“, „QH“, „QJ“, „QK“, „QL“, „QM“, „QN“, „QP“, „QQ“, „QR“, „QS“, „QT“, „QU“, „QV“, „QW“, „QX“, „QY“, „QZ“, „RA“, „RB“, „RC“, „RD“, „RE“, „RF“, „RG“, „RH“, „RJ“, „RK“, „RL“, „RM“, „RN“, „RP“, „RQ“, „RR“, „RS“, „RT“, „RU“, „RV“, „RW“, „RX“, „RY“, „RZ“, „TA“, „TB“, „TC“, „TD“, „TE“, „TF“, „TG“, „TH“, „TJ“, „TK“, „TL“, „TM“, „TN“, „TP“, „TQ“, „TR“, „TS“, „TT“, „TU“, „TV“, „TW“, „TX“, „TY“, „TZ“) + +foreach ($Eintrag in $Datei) +{ + $Eintragszeile = $Eintrag.split("'") + <#Write-Host "Gesamter eintrag " $Eintragszeile + Write-Host "Eintrag 1 " $Eintragszeile[0] + Write-Host "Eintrag 2 " $Eintragszeile[1] + Write-Host "Eintrag 3 " $Eintragszeile[2] + Write-Host "Eintrag 4 " $Eintragszeile[3]#> + $EAZahl = $Eintragszeile[1] + $EAKommentar = $Eintragszeile[3] + + $EAZahl = $EAZahl.TrimStart("'") + #$EAZahl = $EAZahl.TrimEnd("'") + #$EAKommentar = $EAKommentar.TrimStart("'") + $EAKommentar = $EAKommentar.TrimEnd("'") + + if ($($($EAZahl.Substring(0,2)) -in $ZuDI)) + { + $EAZahl = $EAZahl -replace("[a-zA-Z]", "") + $LaengeEAZahl = $($EAZahl.Length - 1) + $EAZahl = $EAZahl.Substring(0,$LaengeEAZahl) + "." + $EAZahl.Substring($LaengeEAZahl) + $EAZahl = "E" + $EAZahl + $DIs += @([pscustomobject]@{Name=$EAZahl;Zeile=$i}) + } + elseif ($($($EAZahl.Substring(0,2)) -in $ZuDQ)) + { + $EAZahl = $EAZahl -replace("[a-zA-Z]", "") + $LaengeEAZahl = $($EAZahl.Length - 1) + $EAZahl = $EAZahl.Substring(0,$LaengeEAZahl) + "." + $EAZahl.Substring($LaengeEAZahl) + $EAZahl = "A" + $EAZahl + $DQs += @([pscustomobject]@{Name=$EAZahl;Zeile=$i}) + } + else + { + Write-Host "Achtung, Fehler bei $EAZahl $EAKommentar" + $DQs += @([pscustomobject]@{Name=$EAZahl;Zeile=$i}) + #fehler + } + + #Write-Host $EAZahl + #Write-Host $EAKommentar + + $EBlatt.Cells.Item($i,1) = $EAZahl + $EBlatt.Cells.Item($i,2) = $EAKommentar + + $i++ +} + +$EDatei.Save() +$Excel.Quit() + +$DIs = $DIs | sort "Name" +$Gleiche = @() + +for ($j = 0; $j -lt $($DIs.Count -1); $j++) +{ + $IstGleich = $($DIs[$j].Name -eq $DIs[$($j+1)].Name) + if ( $IstGleich ) + { + #Eintrag hinzufügen + if ( -not $($Gleiche[-1].Zeile -eq $DIs[$j].Zeile)) + { + $Gleiche += $DIs[$j] + } + $Gleiche += $DIs[$($j +1)] + Write-Host "Gleiche: " $Gleiche + } +} + +# $Gleiche = $Gleiche.Zeile | select -Unique + +if ($($Gleiche.Length) -gt 0) +{ + Write-Host "Folgende Eingänge sind doppelt belegt" + Write-Host "Eingang Zeile (Excel)" + foreach ($Gleich in $Gleiche) + { + Write-Host $Gleich.Name " " $Gleich.Zeile + } +} +else +{ + Write-Host "Es gibt keine doppelt belegten Eingänge!" +} + +Write-Host $(Get-Date -Format "HH:mm:ss") \ No newline at end of file diff --git a/Test-Skripte/Skript2.ps1 b/Test-Skripte/Skript2.ps1 new file mode 100644 index 0000000..3197caf --- /dev/null +++ b/Test-Skripte/Skript2.ps1 @@ -0,0 +1,106 @@ +Write-Host $(Get-Date -Format "HH:mm:ss") + +$Excel = New-Object -ComObject Excel.Application +$EDatei = $Excel.WorkBooks.Open("R:\m.kraft\Excel Werte ändern\Excel-Datei.xlsx") +$EBlatt = $EDatei.WorkSheets.item(1) +$Excel.Visible = $false + +$Pfad = "R:\m.kraft\Excel Werte ändern\EA_Krüger_19.03.2020 - Kurz.txt" +$i = 1 + +$DIs = @() +$DQs = @() +$Fehler = @() + + +$Datei = Get-Content $Pfad + +$ZuDI = @(„DI“, „BA“, „BB“, „BC“, „BD“, „BE“, „BF“, „BG“, „BH“, „BJ“, „BK“, „BL“, „BM“, „BN“, „BP“, „BQ“, „BR“, „BS“, „BT“, „BU“, „BV“, „BW“, „BX“, „BY“, „BZ“, „FA“, „FB“, „FC“, „FD“, „FE“, „FF“, „FG“, „FH“, „FJ“, „FK“, „FL“, „FM“, „FN“, „FP“, „FQ“, „FR“, „FS“, „FT“, „FU“, „FV“, „FW“, „FX“, „FY“, „FZ“, „SA“, „SB“, „SC“, „SD“, „SE“, „SF“, „SG“, „SH“, „SJ“, „SK“, „SL“, „SM“, „SN“, „SP“, „SQ“, „SR“, „SS“, „ST“, „SU“, „SV“, „SW“, „SX“, „SY“, „SZ“) +$ZuDQ = @(„DQ“, „CA“, „CB“, „CC“, „CD“, „CE“, „CF“, „CG“, „CH“, „CJ“, „CK“, „CL“, „CM“, „CN“, „CP“, „CQ“, „CR“, „CS“, „CT“, „CU“, „CV“, „CW“, „CX“, „CY“, „CZ“, „EA“, „EB“, „EC“, „ED“, „EE“, „EF“, „EG“, „EH“, „EJ“, „EK“, „EL“, „EM“, „EN“, „EP“, „EQ“, „ER“, „ES“, „ET“, „EU“, „EV“, „EW“, „EX“, „EY“, „EZ“, „GA“, „GB“, „GC“, „GD“, „GE“, „GF“, „GG“, „GH“, „GJ“, „GK“, „GL“, „GM“, „GN“, „GP“, „GQ“, „GR“, „GS“, „GT“, „GU“, „GV“, „GW“, „GX“, „GY“, „GZ“, „HA“, „HB“, „HC“, „HD“, „HE“, „HF“, „HG“, „HH“, „HJ“, „HK“, „HL“, „HM“, „HN“, „HP“, „HQ“, „HR“, „HS“, „HT“, „HU“, „HV“, „HW“, „HX“, „HY“, „HZ“, „KA“, „KB“, „KC“, „KD“, „KE“, „KF“, „KG“, „KH“, „KJ“, „KK“, „KL“, „KM“, „KN“, „KP“, „KQ“, „KR“, „KS“, „KT“, „KU“, „KV“, „KW“, „KX“, „KY“, „KZ“, „MA“, „MB“, „MC“, „MD“, „ME“, „MF“, „MG“, „MH“, „MJ“, „MK“, „ML“, „MM“, „MN“, „MP“, „MQ“, „MR“, „MQ“, „MR“, „MS“, „MT“, „MU“, „MV“, „MW“, „MX“, „MY“, „MZ“, „PA“, „PB“, „PC“, „PD“, „PE“, „PF“, „PG“, „PH“, „PJ“, „PK“, „PL“, „PM“, „PN“, „PP“, „PQ“, „PR“, „PS“, „PT“, „PU“, „PV“, „PW“, „PX“, „PY“, „PZ“, „QA“, „QB“, „QC“, „QD“, „QE“, „QF“, „QG“, „QH“, „QJ“, „QK“, „QL“, „QM“, „QN“, „QP“, „QQ“, „QR“, „QS“, „QT“, „QU“, „QV“, „QW“, „QX“, „QY“, „QZ“, „RA“, „RB“, „RC“, „RD“, „RE“, „RF“, „RG“, „RH“, „RJ“, „RK“, „RL“, „RM“, „RN“, „RP“, „RQ“, „RR“, „RS“, „RT“, „RU“, „RV“, „RW“, „RX“, „RY“, „RZ“, „TA“, „TB“, „TC“, „TD“, „TE“, „TF“, „TG“, „TH“, „TJ“, „TK“, „TL“, „TM“, „TN“, „TP“, „TQ“, „TR“, „TS“, „TT“, „TU“, „TV“, „TW“, „TX“, „TY“, „TZ“) + +foreach ($Eintrag in $Datei) +{ + $Eintragszeile = $Eintrag.split("'") + <#Write-Host "Gesamter eintrag " $Eintragszeile + Write-Host "Eintrag 1 " $Eintragszeile[0] + Write-Host "Eintrag 2 " $Eintragszeile[1] + Write-Host "Eintrag 3 " $Eintragszeile[2] + Write-Host "Eintrag 4 " $Eintragszeile[3]#> + $EAZahl = $Eintragszeile[1] + $EAKommentar = $Eintragszeile[3] + + $EAZahl = $EAZahl.TrimStart("'") + #$EAZahl = $EAZahl.TrimEnd("'") + #$EAKommentar = $EAKommentar.TrimStart("'") + $EAKommentar = $EAKommentar.TrimEnd("'") + + if ($($($EAZahl.Substring(0,2)) -in $ZuDI)) + { + $EAZahl = $EAZahl -replace("[a-zA-Z]", "") + $LaengeEAZahl = $($EAZahl.Length - 1) + $EAZahl = $EAZahl.Substring(0,$LaengeEAZahl) + "." + $EAZahl.Substring($LaengeEAZahl) + $EAZahl = "DI" + $EAZahl + $DIs += @([pscustomobject]@{Name=$EAZahl;Zeile=$i}) + } + elseif ($($($EAZahl.Substring(0,2)) -in $ZuDQ)) + { + $EAZahl = $EAZahl -replace("[a-zA-Z]", "") + $LaengeEAZahl = $($EAZahl.Length - 1) + $EAZahl = $EAZahl.Substring(0,$LaengeEAZahl) + "." + $EAZahl.Substring($LaengeEAZahl) + $EAZahl = "DQ" + $EAZahl + $DQs += @([pscustomobject]@{Name=$EAZahl;Zeile=$i}) + } + else + { + Write-Host "Achtung, Fehler bei $EAZahl $EAKommentar" + $Fehler += @([pscustomobject]@{Name=$EAZahl;Zeile=$i}) + #fehler + } + + #Write-Host $EAZahl + #Write-Host $EAKommentar + + $EBlatt.Cells.Item($i,1) = $EAZahl + $EBlatt.Cells.Item($i,2) = $EAKommentar + + $i++ +} + +$EDatei.Save() +$Excel.Quit() + +$DIs = $DIs | Sort-Object "Name" +$Gleiche = @() + +for ($j = 0; $j -lt $($DIs.Count -1); $j++) +{ + $IstGleich = $($DIs[$j].Name -eq $DIs[$($j+1)].Name) + if ( $IstGleich ) + { + #Eintrag hinzufügen + if ( -not $($Gleiche[-1].Zeile -eq $DIs[$j].Zeile)) + { + $Gleiche += $DIs[$j] + } + $Gleiche += $DIs[$($j +1)] + Write-Host "Gleiche: " $Gleiche + } +} + +# $Gleiche = $Gleiche.Zeile | select -Unique + +if ($($Gleiche.Length) -gt 0) +{ + Write-Host "Folgende Eingänge sind doppelt belegt" + Write-Host "Eingang Zeile (Excel)" + foreach ($Gleich in $Gleiche) + { + Write-Host $Gleich.Name " " $Gleich.Zeile + } +} +else +{ + Write-Host "Es gibt keine doppelt belegten Eingänge!" +} + +Write-Host $(Get-Date -Format "HH:mm:ss") \ No newline at end of file diff --git a/Test-Skripte/Skript3.ps1 b/Test-Skripte/Skript3.ps1 new file mode 100644 index 0000000..a61f712 --- /dev/null +++ b/Test-Skripte/Skript3.ps1 @@ -0,0 +1,39 @@ +$ZuDI = @("P", "DI", "SF") + +$EAZahl = "PF0001" + +$EANurZahl = $EAZahl -replace "[\d]" + +Write-Host $EANurZahl + +if ($EANurZahl -in $ZuDI) { + Write-Host "Ist enthalten" +} +else { + Write-Host "Ist nicht enthalten" +} + +#Write-Host $($($EAZahl.Substring(0,2)) -in $ZuDI) + +<# foreach ($Eingang in $ZuDI) { + if ($EAZahl.Contains($Eingang)) { + Write-Host "Ist enthalten bei Eingang " $Eingang + } + # Todo: Schleife verlassen, nachdem ersten positives Ergebnis vorliegt + # Was passiert, +} #> + +<# if ($($EAZahl -match $ZuDI )) { + Write-Host "Ist enthalten" +} +else { + Write-Host "Ist nicht enthalten" +} + #> + <# + if ($EAZahl -in $ZuDI) + { + $EAZahl = $EAZahl.Remove(0,2) + $EAZahl = "DI" + $EAZahl + #replace + }#> \ No newline at end of file diff --git a/Test-Skripte/Skript4.ps1 b/Test-Skripte/Skript4.ps1 new file mode 100644 index 0000000..f982538 --- /dev/null +++ b/Test-Skripte/Skript4.ps1 @@ -0,0 +1,7 @@ +[CmdletBinding()] +param ( +[Parameter(Mandatory=$true)][String]$var1, +[String]$var2 +) +Write-Host $var1 + diff --git a/Test-Skripte/Skript5.ps1 b/Test-Skripte/Skript5.ps1 new file mode 100644 index 0000000..6d71174 --- /dev/null +++ b/Test-Skripte/Skript5.ps1 @@ -0,0 +1,13 @@ +$EAZahl = "004" + +$LaengeEAZahl = $EAZahl.Length +Write-Host $LaengeEAZahl + +$Teil1 = $EAZahl.Substring(0,$($LaengeEAZahl - 1)) +Write-Host $Teil1 + +$Teil2 = $EAZahl.Substring($($LaengeEAZahl - 1)) +Write-Host $Teil2 + +$NeueEAZahl = $($Teil1 + "." + $Teil2) +Write-Host $NeueEAZahl \ No newline at end of file diff --git a/Test-Skripte/Skript6.ps1 b/Test-Skripte/Skript6.ps1 new file mode 100644 index 0000000..50cb055 --- /dev/null +++ b/Test-Skripte/Skript6.ps1 @@ -0,0 +1,32 @@ +<# +$Verzeichnis = Read-Host -Prompt "Zielverzeichnis: " + +Write-Host $Verzeichnis + +$IstVorhanden = $(Test-Path $Verzeichnis) + +Write-Host $IstVorhanden +#> + +# Gültigen Pfad eingeben und anschließend in diesem Verzeichnis .txt-Datei öffnen + +$UngueltigerPfad = $true + + +while ($UngueltigerPfad) +{ + $Pfad = Read-Host -Prompt "Zielverzeichnis: " + $UngueltigerPfad = -not $(Test-Path $Pfad -PathType Container) +} +# Write-Host "Gültigen Pfad angegeben" + +$Dateien = split-path $(Get-ChildItem $Pfad\*.txt) -Leaf + +Write-Host $Dateien + +$Input = $Dateien | Out-GridView -PassThru -Title "Datei wählen" + +Write-Host $Input + +$DateiPfad = Join-Path -path $Pfad -childpath $Input -Resolve +Write-Host $DateiPfad \ No newline at end of file diff --git a/Test-Skripte/Skript7.ps1 b/Test-Skripte/Skript7.ps1 new file mode 100644 index 0000000..0f4d7b8 --- /dev/null +++ b/Test-Skripte/Skript7.ps1 @@ -0,0 +1,25 @@ +$Laufwerke = $(Get-PSDrive | where {$_.Free}).Name + +Write-Host "Laufwerke: " $Laufwerke + +$Pfad = "R:\m.kraft\Excel Werte ändern\" +Write-Host "Pfad: " $Pfad +$AktuelleUnterordner = Get-ChildItem $Pfad -Directory +$AktuelleTxtDateien = $(Get-ChildItem $Pfad\*.txt) + +if ($AktuelleTxtDateien.length -gt 0) +{ + $AktuelleTxtDateien = $(Split-Path $AktuelleTxtDateien -Leaf) +} + +Write-Host "Unterordner: " $AktuelleUnterordner +Write-Host "Dateien: " $AktuelleTxtDateien + +<# +Schleife 1: Solange aktiv, bis Verzeichniswahl auf true ist + Schleife 2: (In Schleife 1) SOlange aktiv, bis Ordnerwahl auf true ist + +Oder: +[bool] $DateiauswahlAktiv = $true, bis eine Datei gewählt ist. Auch mit 2 Schleifen. +#> +# Start \ No newline at end of file diff --git a/Test-Skripte/Skript8.ps1 b/Test-Skripte/Skript8.ps1 new file mode 100644 index 0000000..edd6d61 --- /dev/null +++ b/Test-Skripte/Skript8.ps1 @@ -0,0 +1,16 @@ +# Excel-Datei erstellen + + + +$DateiPfad = "R:\m.kraft\Excel Werte ändern\_Test\Neuer Ordner\Test-Datei.xlsx" + +$ExcelDatei = New-Object -ComObject excel.application +$Mappe = $ExcelDatei.Workbooks.Item(1) # Rechte Mappe +$Blatt1 = $Mappe.WorkSheets.Add() +$Blatt1.Name = "PLC Tags" +$Blatt2 = $Mappe.WorkSheets.Add() # Linke Mappe +$Blatt2.Name = "Mappe2" +$Mappe.SaveAs($DateiPfad) + +$Mappe.Close() +$ExcelDatei.Quit() \ No newline at end of file diff --git a/Test-Skripte/Skript9.ps1 b/Test-Skripte/Skript9.ps1 new file mode 100644 index 0000000..b5c8382 --- /dev/null +++ b/Test-Skripte/Skript9.ps1 @@ -0,0 +1,143 @@ +# Wirft aktuell Fehler, wenn man zurück in das Laufwerkverzeichnis geht! + +Function Main +{ +$LaufwerkAuswahlAktiv = $true +$DateiAuswahlAktiv = $true + +while ($LaufwerkAuswahlAktiv) +{ + $Laufwerke = LaufwerkeFinden + Write-Host "Gefundene Laufwerke: " $Laufwerke + + $Pfad = Laufwerkwaehlen $Laufwerke + Write-Host "Gewähltes Laufwerk: " $Pfad + + $LaufwerkAuswahlAktiv = $false + $DateiAuswahlAktiv= $true + + while ($DateiAuswahlAktiv) + { + $UnterOrdner = UnterOrdnerFinden $Pfad + Write-Host "Mögliche Unterordner: " $UnterOrdner + + $TxtDateien = TxtDateienFinden $Pfad + Write-Host "Mögliche txt Dateien: " $TxtDateien + + #-> Fall einbauen, wenn es weder Unterordner noch TxtDateien gibt? + $AuswahlOptionen = Optionen $UnterOrdner $TxtDateien + Write-Host "Auswahloptionen: " $AuswahlOptionen + + $Auswahl = OrdnerWaehlen $Pfad $AuswahlOptionen + Write-Host "Gewählte Option: " $Auswahl + + if ($Auswahl -ne "Zurueck") + { + $Pfad = Join-Path -Path $Pfad -ChildPath $Auswahl -Resolve + } + else + { + Write-Host "Eine Ordnerebene zurück" + $Pfad = Split-Path $Pfad + Write-Host "Neuer Pfad: " $Pfad + + if ($($Pfad.Length -le 3)) + { + Write-Host "Der Pfad ist kürzer als 3 Zeichen -> Laufwerk wählen" + $DateiAusahlAktiv = $false + } + } + + Write-Host "Aktueller Pfad : " $Pfad + + if ($($Auswahl -match ".txt")) #Besser: Letzte 4 Zeichen von auswahl nehmen und dann -eq + { + Write-Host "Es handelt sich um eine .txt-Datei" + $DateiauswahlAktiv = $false + } + Write-Host "--------------------------------------------------------------------------------------" + # Zwei ifs + #1 .txt-Datei gewählt -> $DateiAuswahlAktiv = $false + #2 Pfad ist aufgrund von "Zurück" leer (kein Laufwerk mehr) -> $LaufwerkauswahlAktiv = $true + } + + Write-Host "Gewählte Datei: " $Pfad +} + +} + +Function LaufwerkeFinden() +{ +$Laufwerke = $(Get-PSDrive | where {$_.Free}).Name +$i = 0 + +foreach($Laufwerk in $Laufwerke) +{ + $Laufwerke[$i] = $Laufwerk + ":\" + $i++ +} + +return $Laufwerke +} + +Function Laufwerkwaehlen($Laufwerke) +{ +$Eingabe = $Laufwerke | Out-GridView -PassThru -Title "Laufwerke" + +return $Eingabe +} + +Function UnterOrdnerFinden($Pfad) +{ +#abfangen: keine Ordner vorhanden -> nicht nötig, da keine weitere Verarbeitung +return $(Get-Childitem $Pfad -Directory) +} + +Function TxtDateienFinden($Pfad) +{ +$TxtDateien = $(Get-Childitem $Pfad\*.txt) + +if ($TxtDateien.Length -gt 0) +{ + return $(Split-Path $TxtDateien -Leaf) +} +else +{ + return +} +} + +Function Optionen($UnterOrdner, $TxtDateien) +{ +#Gibt aktuell auch Index und Typ (System.IO.DirectoryInfo bzw. System.String) zurück +$OrdnerFormat = @() +$TxtDateienFormat = @() +foreach ($Ordner in $UnterOrdner) +{ + $OrdnerFormat += [System.String]$Ordner +} +foreach ($TxtDatei in $TxtDateien) +{ + $TxtDateienFormat += [System.String]$TxtDatei +} + +$Optionen = $OrdnerFormat + $TxtDateienFormat + "Zurueck" + +return $Optionen +} + +Function OrdnerWaehlen($Pfad, $AuswahlOptionen) +{ +if ($Pfad -eq "") +{ + $Pfad = "Laufwerke" +} + +$Eingabe = $AuswahlOptionen | Out-GridView -PassThru -Title $Pfad + +Write-Host "Gewählte Option in Funktion: " $Input + +return $Eingabe +} + +Main \ No newline at end of file diff --git a/Test-Skripte/Txt-Dateien-Test.ps1 b/Test-Skripte/Txt-Dateien-Test.ps1 new file mode 100644 index 0000000..7c8fe4f --- /dev/null +++ b/Test-Skripte/Txt-Dateien-Test.ps1 @@ -0,0 +1,49 @@ +function KompatibilitaetsCheck ($SpeicherOrt){ + $Inhalte = Get-Content $SpeicherOrt + if ($Inhalte.Length -eq 0) { + Write-Host "Laenge = 0" + return $false + } + else { + foreach ($Zeile in $Inhalte) { + if (-not ($Zeile -match "'\w+','.+'") -and $Zeile.Length -gt 0) { + Write-Host "Fehler in Zeile" $Zeile + return $false + } + } + } + return $true +} + +Function TxtDateienFinden($Pfad) +{ +$TxtDateien = $(Get-Childitem $Pfad\*.txt) + +$KompatibleTxtDateien = @() + +if ($TxtDateien.Length -gt 0) +{ + foreach ($TxtDatei in $TxtDateien) { + Write-Host "Aktuelle txt-Datei: " $TxtDatei + if (KompatibilitaetsCheck $TxtDatei) { + $KompatibleTxtDateien += $TxtDatei + Write-Host " Datei Akzeptiert" + } + else { + Write-Host " Datei nicht Akzeptiert" + } + } + if ($KompatibleTxtDateien.Length -gt 0) { + return $(Split-Path $KompatibleTxtDateien -Leaf) + } + else { + Return + } +} +else +{ + return +} +} + +TxtDateienFinden "Z:\Automatisierung\WSCAD\IMPORT-EXPORT_WSCAD\SKRIPT-KONVERTIERUNG\Dieses Verzeichnis bitte nicht als Ablage nutzen" \ No newline at end of file diff --git a/doc/Anleitung.one b/doc/Anleitung.one new file mode 100644 index 0000000000000000000000000000000000000000..ab9bb7bf5b22f3c5e8e1169a7b95b454e08449ab GIT binary patch literal 1390360 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 fI+@kM{tka2&tW!Q#5B&EPVf!+?jDG^6v`6 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