daemmerung
Goto Top

Leere Array-Werte aus einem Array entfernen

Hallo zusammen,

ich bin dabei ein Powershell-Script zu schreiben, welches diverse Reports generieren kann. Für die Eingabe von SamAccountNames bzw. E-Mail-Adressen, habe ich dem Skript ein RitchText-Element (System.Windows.Forms.RichtText) hinzugefügt.
Damit der User möglichst flexibel bei der Eingabe ist, ersetze ich alle "," und ";" durch Leerzeichen, um am Ende ein $array.split(" ") durchzuführen, um an Hand der Leerzeichen ein Array mit sämtlichen Eingaben zu generieren.

Soweit funktioniert das auch prima. Das Problem ist, dass dadurch auch leere Array-Werte entstehen, wenn der User z.B. pro Eingabe einen Zeilenumbruch macht. Um bei der späteren Verarbeitung also keine Probleme zu bekommen, möchte ich gerne die leeren Array-Werte entfernen.

Mein Ansatz bisher sieht wie folgt aus:
Hallo zusammen,

ich bin dabei ein Powershell-Script zu schreiben, welches diverse Reports generieren kann. Für die Eingabe von SamAccountNames bzw. E-Mail-Adressen, habe ich dem Skript ein RitchText-Element  (System.Windows.Forms.RichtText) hinzugefügt. 
Damit der User möglichst flexibel bei der Eingabe ist, ersetze ich alle "," und ";" durch Leerzeichen, um am Ende ein  $array.split(" ") durchzuführen, um an Hand der Leerzeichen ein Array mit sämtlichen Eingaben zu generieren.   

Soweit funktioniert das auch prima. Das Problem ist, dass dadurch auch leere Array-Werte entstehen, wenn der User z.B. pro Eingabe einen Zeilenumbruch macht. Um bei der späteren Verarbeitung also keine Probleme zu bekommen, möchte ich gerne die leeren Array-Werte entfernen. 

Mein Ansatz bisher sieht wie folgt aus:
[code]
$on_AcceptBtn_click = 
    {
        if($notempty)
        {
            if($textbox.Text -eq "")   
            {
                return [System.Windows.Forms.MessageBox]::Show('Es wurden keine Accounts eingetragen', 'Fehler: Keine Eingaben')  
            }
        }

        $form.close()
        $text = $textbox.Text
        $text =  $text.replace(',', ' ')  
        $text = $text.replace(';', ' ')  
        
        $text = $text.split("[ ]")  
        
        $array_tmp = @()
        Foreach ($value IN $text )
        {
            
            if($value  -notlike " ")  
            {
                $array_tmp += $value.trim(" ")  
            }
        }
        $global:textArray =  $array_tmp | WHERE { $_ -ne " " }  
        return $global:textArray
    }
[/code]

In $value erwarte ich also die leeren Werte, die ich gerne herausfiltern möchte. 
Ich habe sowohl -ne "", als auch diverse RegEx-Paterns ausprobiert, aber die leeren Werte bleiben immer drin.  

Auch ein 
-not ($value -match '.*[\s]+')   
funktioniert nicht. 

An sich habe ich sogut wie jede Möglichkeit, die mir eingefallen ist, ausprobiert, aber die leeren Array-Werte bleiben drin... 

Kann mir hier jemand helfen und mir ggf. einen Tipp geben?

Viele Grüße
Toni

In $value erwarte ich also die leeren Werte, die ich gerne herausfiltern möchte.
Ich habe sowohl -ne "", als auch diverse RegEx-Paterns ausprobiert, aber die leeren Werte bleiben immer drin.

Auch ein
-not ($value -match '.*[\s]+')
funktioniert nicht.

An sich habe ich sogut wie jede Möglichkeit, die mir eingefallen ist, ausprobiert, aber die leeren Array-Werte bleiben drin...

Kann mir hier jemand helfen und mir ggf. einen Tipp geben?

Viele Grüße
Toni

Content-ID: 316247

Url: https://administrator.de/contentid/316247

Ausgedruckt am: 23.11.2024 um 13:11 Uhr

colinardo
Lösung colinardo 25.09.2016 aktualisiert um 22:32:45 Uhr
Goto Top
Hallo Toni,
erstens warum nutzt du überhaupt ein Richtextfeld für sowas??? Das wäre eher was für ein DataGridView in dem jede Adresse ein eigenes Feld bekommt, da entfällt diese etwas komische Herangehensweise.

Das Splitten würde ich eher mit Regex direkt auf einen Schlag so machen:
$array = $text -split "[,;\[\]]|\s+"  
Und wenn dann immer noch was unsichtbares übrig sein sollte wird das mit
$array = $array | ?{$_ -notmatch '^\s*$'}  
aus dem Array getilgt face-wink

Grüße Uwe
Daemmerung
Daemmerung 25.09.2016 um 23:03:28 Uhr
Goto Top
Hallo Uwe,

vielen Dank für deinen Beitrag. Der hat mir sehr geholfen. Bei dem RegEx-Ausdruck habe ich noch das \. entfernt, da auch E-Mail Adresse eingegeben werden können, welche auch ein Punkt enthalten.

Jetzt bekomme ich ein sauberes Array und bin zufrieden.

Hintergrund, warum ein RichText und (noch) keine DataGrid-View:
Es soll ein freistehendes Text-Feld sein, mit dessen Hilfe man mittels Copy-n-Paste eine größere Menge an Accounts/E-Mail Adressen posten kann, ohne, dass diese einzeln in die DataGrid hinzugefügt werden müssen. Es ist sicherlich möglich, dass ich durch Drücken der STRG+V-Taste die DataGrid reagiert und aus der Zwischenablage die Werte einfügt, aber fürs Erste reicht mir diese Lösung vollkommen aus. Ich werde aber auf langer Sicht überlegen, das ein wenig schöner zu gestalten.

Danke, dass du meinen kranken Ansatz etwas aufgeräumt hast. So sieht das Ganze deutlich schöner aus.

Liebe Grüße
Toni

PS: Sorry, dass ich im Start-Post i.wie den Beitrag doppelt geschrieben habe. Das waren meine Anfänge in diesem FOrum und als ich es gemerkt habe, war es zu spät. face-sad
colinardo
colinardo 26.09.2016 um 00:06:30 Uhr
Goto Top
habe ich noch das \. entfernt
Uups das sollte ein Semikolon werden, sorry.