Powershell Skript erweitern
Hallo zusammen,
ich brauch bitte eure Hilfe.
Ein User hier im Board hatte mit dieses Skript geschrieben:
das dient dazu an einer Bestimmten Stelle etwas rein zu schreiben wenn eine Zeichenfolge eintritt.
Die komplette zeile sieht so aus:
Config Datei sieht immer so aus:
Nun geht es in dem Skript darum, wenn zb an der stelle 112 - 125 9007019001586 auftaucht, er an der Stelle 54 in dieser Datei einen wert eintragen soll. Das läuft soweit auch super.
Nun ist es aber so, das ich das Skript erweitern muss.... Wenn er an der Stelle 112-125 nichts erkennt, somit auch nicht an die Stelle 55 etwas geschrieben hat, muss er an der stelle 273 - 286 danach suchen und ggf. an der 55 die zahl rein schreiben.
Es handelt sich hierbei um eine EDI Datei. Diese Datei hat IMMER das selbe Format. Alle Leerzeichen sind immer an der selben stelle. und der gesamte Aufbau ist der gleiche. Nur die werte ändern sich darin.
Ich bin nicht sehr gut im Skripten da ich nicht immer genau verstehe wieso das so sein muss. Natürlich kann ich mich da jetzt rein lesen (was ich bereits getan habe) und versuchen das selbst zu lösen. Allerdings fehlt mir hierzu die Zeit. Vor etwa 4 Wochen ist unsere Firmen Zentrale abgebrannt... (Google: Großbrand Köln Lind) Nun gibt es logischerweise extrem viel zu tun um einiges in den neuen Büros und Lägern wieder lauffähig zu bekommen.
Wenn mir also jemand helfen kann, würde ich auch gern eine kleine Spende über Paypal senden.
ich brauch bitte eure Hilfe.
Ein User hier im Board hatte mit dieses Skript geschrieben:
$configfile = "D:\config.txt"
$quelle = "D:\quelle"
$ziel = 'D:\ziel'
# ---------------
$config = gc $configfile -raw | ConvertFrom-StringData
ls $quelle -File -PipelineVariable file | %{
[regex]::Replace((gc $_.FullName -raw),'(?ism)^5002[^\s]*\s*\d+\s*\d+\s*(\d+)[^\r\n]*'',{
param($m)
if ($config.ContainsKey($m.Groups[1].Value)){
$rahmenNr = $config.($m.Groups[1].Value)
$m.Value -replace "(?<=^.{55}).{$($rahmenNr.length)}",$rahmenNr
}else{$m.Value}
}) | sc "$ziel\$($file.Name)"
}
das dient dazu an einer Bestimmten Stelle etwas rein zu schreiben wenn eine Zeichenfolge eintritt.
Die komplette zeile sieht so aus:
500220BX0ML 2020122920210129 4003529000007 9007019001586 90070190000089007019001586 XXXXXX
Config Datei sieht immer so aus:
9007019001586 = 12345
9007045685586 = 67890
Nun ist es aber so, das ich das Skript erweitern muss.... Wenn er an der Stelle 112-125 nichts erkennt, somit auch nicht an die Stelle 55 etwas geschrieben hat, muss er an der stelle 273 - 286 danach suchen und ggf. an der 55 die zahl rein schreiben.
Es handelt sich hierbei um eine EDI Datei. Diese Datei hat IMMER das selbe Format. Alle Leerzeichen sind immer an der selben stelle. und der gesamte Aufbau ist der gleiche. Nur die werte ändern sich darin.
Ich bin nicht sehr gut im Skripten da ich nicht immer genau verstehe wieso das so sein muss. Natürlich kann ich mich da jetzt rein lesen (was ich bereits getan habe) und versuchen das selbst zu lösen. Allerdings fehlt mir hierzu die Zeit. Vor etwa 4 Wochen ist unsere Firmen Zentrale abgebrannt... (Google: Großbrand Köln Lind) Nun gibt es logischerweise extrem viel zu tun um einiges in den neuen Büros und Lägern wieder lauffähig zu bekommen.
Wenn mir also jemand helfen kann, würde ich auch gern eine kleine Spende über Paypal senden.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 636529
Url: https://administrator.de/contentid/636529
Ausgedruckt am: 21.11.2024 um 19:11 Uhr
7 Kommentare
Neuester Kommentar
Hi! Ok!
Nun geht es in dem Skript darum, wenn zb an der stelle 112 - 125 9007019001586 auftaucht, er an der Stelle 54 in dieser Datei einen wert eintragen soll. Das läuft soweit auch super.
Mit Stelle ist eine Zeile gemeint oder eine Spalte (jedes Zeichen repräsentiert eine Spalte)?
Nun ist es aber so, das ich das Skript erweitern muss.... Wenn er an der Stelle 112-125 nichts erkennt, somit auch nicht an die Stelle 55 etwas geschrieben hat, muss er an der stelle 273 - 286 danach suchen und ggf. an der 55 die zahl rein schreiben.
Wenn ich also davon ausgehe, dass du Zeilen meinst, dann soll in 2 Bereichen der Config nach einem Vorkommen gesucht und in einer anderen Zeile dieses Vorkommen geschrieben werden?
Es handelt sich hierbei um eine EDI Datei. Diese Datei hat IMMER das selbe Format. Alle Leerzeichen sind immer an der selben stelle. und der gesamte Aufbau ist der gleiche. Nur die werte ändern sich darin.
Kannst du mal eine dieser EDI-Dateien (vollständig) posten oder ist die geheim?
Ich bin nicht sehr gut im Skripten
Kein Problem! Aber wir wurden schon genaue Angaben brauchen um helfen zu können.
Grüße!
$configfile = "D:\config.txt"
$quelle = "D:\quelle"
$ziel = 'D:\ziel'
# ---------------
$config = gc $configfile -raw | ConvertFrom-StringData
ls $quelle -File -PipelineVariable file | %{
[regex]::Replace((gc $_.FullName -raw),'(?ism)^5002[^\s]*\s*\d+\s*\d+\s*(\d+)\s*\d{13}(\d+)[^\r\n]*',{
param($m)
if ($config.ContainsKey($m.Groups[1].Value)){
$rahmenNr = $config.($m.Groups[1].Value)
$m.Value -replace "(?<=^.{55}).{$($rahmenNr.length)}",$rahmenNr
}elseif($config.ContainsKey($m.Groups[2].Value)){
$rahmenNr = $config.($m.Groups[2].Value)
$m.Value -replace "(?<=^.{55}).{$($rahmenNr.length)}",$rahmenNr
}else{$m.Value}
}) | sc "$ziel\$($file.Name)"
}
n' guts 🎆 2021
Regular Expressions hier jetzt im einzelnen zu erklären würde Tage dauern ...
Belies dich einfach hier, dann verstehst du auch was da passiert -> Reguläre Ausdrücke
Viel Erfolg beim Neuaufbau!
Belies dich einfach hier, dann verstehst du auch was da passiert -> Reguläre Ausdrücke
Viel Erfolg beim Neuaufbau!
Zitat von @Springstil:
Die Regular Expressions versteh ich. zumindest was diese machen. Nur Verstehe ich nicht, warum er erst "vorne" schaut und wenn er da nichts findet weiter hinten noch einmal. Das ist doch quasi alles in einer zeile geschrieben die Regular Expressions.
Also wie kann er 2 mal darauf zugreifen obwohl es ein befehl ist
Der Regex verweist auf zwei Submatches (1 und 2, die mit Klammern im Regex versehen sind). Dieser Regex wird dann durch die Funktion in den geschweiften Klammern {} des Regex-Replace-Itterators verarbeitet. Dieser wird für jede Zeile die auf den der Regex zutrifft aufgerufen Dort ist der Match in der Variablen $m enthalten. Auf die Submatches greift man so zu: $m.Groups[n].ValueDie Regular Expressions versteh ich. zumindest was diese machen. Nur Verstehe ich nicht, warum er erst "vorne" schaut und wenn er da nichts findet weiter hinten noch einmal. Das ist doch quasi alles in einer zeile geschrieben die Regular Expressions.
Also wie kann er 2 mal darauf zugreifen obwohl es ein befehl ist
Innerhalb der Funktion gibt es nun eine IF-ELSE Abfrage welche prüft ob es ein Match mit dem ersten und wenn nicht (elseif Teil) mit dem zweiten Submatch gibt, wenn ja dann wird in der Zeile jeweils die Info aus der config Datei eingesetzt und ausgegeben. Gibt es für beide kein Match wird die Zeile so wie sie ist übernommen.