theunreal
Goto Top

PS- array springt, if condition greift immer

Hallo zusammen,

mal wieder geht es um mein famous Emailskript. Ich habe 2 Funktionen eingebaut, die aber beide Ihre Eigenheiten haben.
Da ich mich mit Regex und Powershell noch immer anfreunde, bitte ich um Hilfe (mal wieder).

function CheckSalesDate(){
 
    #$modTXT -Match 'Kaufdatum(\s+)(\d+).(\d+).(\d+)' | Out-Null 
    $modTXT -Match 'Kaufdatum(\s+)(\d+).(\d+).(\d+)' | Out-Null                              
    #Da manche im Mailtemplate verschlimmbessern prüfen wir das Trennzeichen des Datums (. oder /)
       if ($Matches -like "*/*"){  
                 #Ok...hier sollte also US Datum kommen, aber falls nicht, dann Brechstange...
                 #Wenn Matches.2 größer als 12 ist, wird es wohl doch europäisch sein...
                if ($Matches[2] -gt 12){
                    $Kaufdatum = Get-Date -Day $Matches[2] -Month $Matches[3] -Year $Matches[4] -Format "yyyy-MM-dd"  
                }else{
                    $Kaufdatum = Get-Date -Day $Matches[3] -Month $Matches[2] -Year $Matches[4] -Format "yyyy-MM-dd"  
                }
       }else{
        #Wenn Punkte, dann klar Europäisch
        $Kaufdatum = Get-Date -Day $Matches[2] -Month $Matches[3] -Year $Matches[4] -Format "yyyy-MM-dd"  
       }
       #$modTXT = $modTXT -Replace '(?<=Kaufdatum(\s+))\d+.\d+.\d+', $Kaufdatum 

       $modTXT = $modTXT -Replace '(?<=Kaufdatum(\s+))\d+.\d+.\d+', $Kaufdatum  
}

In der Funktion CheckSalesDate wird die if-condition
if ($Matches[2] -gt 12){
immer ausgelöst, auch wenn Matches[2] nur 6 ist - Warum?

Die Frage hatte ich hier auch ergänzt, aber die wird untergehen...Sorry fürs doppelte Lottchen face-sad
Powershell array.Indexof("string") will nicht

function CheckTextBody{
    # Wir prüfen, ob die Daten plausibel sind an   
    $CheckStrings =@("Nachname","Straße","Hausnummer","PLZ","Wohnort","Land")     
    try{
           Foreach ($part in $CheckStrings){
                     $m.TextBody -Match "(?<=$part)(\s+)(\w+)[^\r\n]"  
                        $Test = $Matches.TrimStart($part)
                        
#if($Matches - eq $part)
                        if ($Test -eq "  "){  
                                Write-Host "Nix da"  
                        }else{
                                Write-Host $Matches
                    }  
            }                    
    }catch{
            Write-Host Fehler!         
        }
}

Hier möchte ich eigentlich nachsehen, ob in der Zeile mit "Nachname" etwas steht oder nicht - denn wenn diese Daten fehlen, kann ich keinen Abholauftrag auslösen wollen.
Unabhängig von meinem (hier) nichtssagenden If wandert der Match nach einem Treffer.
In meiner Testmail ist Nachname gefüllt, der Rest nicht. Nun wird mir im Match auch der Nachname gezeigt, aber im nächsten $part ist der Match dann plötzlich im übernachsten $part.
Also $part = Straße und §Matches=" Hausnummer". Warum?

    $m.TextBody -Match "(?<=$part)(\s+)(\w+)[^\r\n]"  

Da ich Regex noch verinnerliche, hier meine Denkweise beim zusammensetzen :
Matche, wo der Anfang gleich $part ist, gefolgt von einem Sonderzeichen, das einmal vorkommt, sich beliebig wiederholen darf, gefolgt von einem Wortzeichen, mindestens einmal, beliebig oft wiederholen darf und nicht ein CarriageReturn oder Linefeed ist.

Edit:
Regex-Debugger, da werden Sie geholfen face-smile Ein Regexdebugger - ziemlich genial. Somit hab ich erneut eine Lernkurve.
Damit mein Plan funktioniert, darf ich kein "\s+" im ersten Streich verwenden (ich suche ja eigentlich Leerzeichen). Sonst frisst er bei einem "Leerstring" das CR und landet bei Hausnummer. Darauf muss man erstmal kommen.

(?<=$part)( +)(\b)(\w+)(?=\s) 
Liefert das Ergebnis, dass ich wünsche...fehlt noch die IF-Laterne, bitte


Freue mich über eine Laterne die Licht ins Dunkel bringt, oder einer Zange, die die Nägel im Brett vorm Kopf zieht.
Gruß Sascha

Content-ID: 641992

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

Ausgedruckt am: 25.11.2024 um 10:11 Uhr

TheUnreal
TheUnreal 18.01.2021 aktualisiert um 15:01:23 Uhr
Goto Top
function CheckTextBody{
    # Wir prüfen, ob die Daten plausibel sind an   
    $CheckStrings = @("Nachname","Straße","Hausnummer","PLZ","Wohnort","Land")  
   
    try{
           Foreach ($part in $CheckStrings){
                  if ($m.TextBody -Match "(?<=$part)( +)(\b)(\w+)(?=\s)" -eq $true){  
                        
                                Write-Host "Vorhanden"   
                }else{
                                Write-Host "Nicht da"  
                }
            }           
    }catch{
            Write-Host Fehler!         
        }

}

So, der CheckTextBody steht und läuft. Das Spiel zwischen Matches und der Regexanordnung hab ich denn nun auch verstanden face-smile

if ($Matches[2].Value -gt 12)

Dann klappts auch mit dem Vergleich...Nur warum?
147323
Lösung 147323 18.01.2021 aktualisiert um 16:30:50 Uhr
Goto Top
Dann klappts auch mit dem Vergleich...Nur warum?
Weil ein Object mit einem Integer zu vergleichen macht hier so viel Sinn wie eine Banane gerade zu biegen face-smile.
https://docs.microsoft.com/de-de/dotnet/api/system.text.regularexpressio ...
Also immer an die Typen denken. Powershell arbeitet objektorientiert und kennt diverse Typen.
TheUnreal
TheUnreal 19.01.2021 um 08:21:05 Uhr
Goto Top
Ergibt Sinn, danke auch face-smile Das kommt davon, wenn man Variablen nicht deklarieren muss^^

@banane und Sinn, krumm passen die nicht durch das Loch im Deckel des Mixers...