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
https://administrator.de/content/detail.php?id=620767&token=755#comm ...
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[0]=" 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[0] -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
}
if ($Matches[2] -gt 12){
Die Frage hatte ich hier auch ergänzt, aber die wird untergehen...Sorry fürs doppelte Lottchen
https://administrator.de/content/detail.php?id=620767&token=755#comm ...
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[0].TrimStart($part)
#if($Matches[0] - eq $part)
if ($Test -eq " "){
Write-Host "Nix da"
}else{
Write-Host $Matches[0]
}
}
}catch{
Write-Host Fehler!
}
}
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[0]=" Hausnummer". Warum?
$m.TextBody -Match "(?<=$part)(\s+)(\w+)[^\r\n]"
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
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
3 Antworten
- LÖSUNG TheUnreal schreibt am 18.01.2021 um 14:48:01 Uhr
- LÖSUNG 147323 schreibt am 18.01.2021 um 16:17:01 Uhr
- LÖSUNG TheUnreal schreibt am 19.01.2021 um 08:21:05 Uhr
- LÖSUNG 147323 schreibt am 18.01.2021 um 16:17:01 Uhr
LÖSUNG 18.01.2021, aktualisiert um 15:01 Uhr
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!
}
}
if ($Matches[2].Value -gt 12)
LÖSUNG 18.01.2021, aktualisiert um 16:30 Uhr
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.
LÖSUNG 19.01.2021 um 08:21 Uhr
Ergibt Sinn, danke auch
Das kommt davon, wenn man Variablen nicht deklarieren muss^^
@banane und Sinn, krumm passen die nicht durch das Loch im Deckel des Mixers...
@banane und Sinn, krumm passen die nicht durch das Loch im Deckel des Mixers...