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).
In der Funktion CheckSalesDate wird die if-condition 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
Powershell array.Indexof("string") will nicht
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?
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 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.
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
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){
Die Frage hatte ich hier auch ergänzt, aber die wird untergehen...Sorry fürs doppelte Lottchen
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 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)
Freue mich über eine Laterne die Licht ins Dunkel bringt, oder einer Zange, die die Nägel im Brett vorm Kopf zieht.
Gruß Sascha
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 641992
Url: https://administrator.de/contentid/641992
Ausgedruckt am: 25.11.2024 um 10:11 Uhr
3 Kommentare
Neuester Kommentar
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 .https://docs.microsoft.com/de-de/dotnet/api/system.text.regularexpressio ...
Also immer an die Typen denken. Powershell arbeitet objektorientiert und kennt diverse Typen.