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