Ersetzen von Zahlenfolgen in Dateien - CMD

Hallo,
ich bräuchte ein wenig Hilfe.
Ich müsste mittels CMD-Batch eine Zahlenfolge in einer XML (bzw. währendessen ist es eine ".error"-Datei) ersetzen.
Bisher habe ich nur die String mit findstr gefunden und bearbeiten können, aber wie kann ich an der Stelle die neue Zahlenfolge einfügen?

Mein bisheriger Code:


Wahrscheinlich ist dies wieder leichter mit Powershell umzusetzen, aber da hab ich noch fast keine Erfahung damit (CMD wär mir lieber, wenn möglich)

Meine Überlegung wäre, wenn es nicht an der gleichen Stelle ersetzt werden kann, dann könnte man den Teil davor und danach in ein Temp-File speichern, genau so wie die Zeile die ersetzt wird und nachher alle zusammenfügen.

Content-Key: 1094386490

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

Ausgedruckt am: 21.09.2021 um 07:09 Uhr

Mitglied: erikro
erikro 27.07.2021 um 17:16:24 Uhr
Goto Top
Moin,

bitte, bitte, bitte, mach das in Powershell. Das ist wirklich nicht schwer und viel eleganter als dieses Batchgewurschtel. Ich bin krank und schreibe vom Tablet aus. Deshalb habe ich keinen Zugriff auf meine Linksammlung. Aber Google hilft bei dem Problem gut weiter "Powershell XML".

hth

Erik
Mitglied: Haberl92
Haberl92 27.07.2021 um 18:19:09 Uhr
Goto Top
ein weiteres Problem ist der Dateiname.
Der Name ist immer ein andererer. Das Script soll am besten alle .error-Dateien durchsuchen nach der eingegebenen IRN.
Bei Batch kann ich mit Platzhalter ("?") arbeiten, aber wie ist das bei Powershell
Mitglied: Haberl92
Haberl92 27.07.2021 um 18:27:31 Uhr
Goto Top
Ich habe hier einen Ausschnitt aus einer XML.
Ich möchte, dass mich das Script nach einer Eingabe fragt.
In dem Fall gebe ich die Nummer "120741591110" ein und er sucht diese in der XML.
Desweiteren soll er nach einer weiteren Eingabe fragen, in diesem Fall gebe ich dann die Nummer "4" ein.
Am Ende soll die letzte Ziffer der ersten Eingabe durch die Ziffer in der zweiten Eingabe ersetzt werden



Mitglied: erikro
erikro 27.07.2021 um 19:51:42 Uhr
Goto Top
Zitat von @Haberl92:

ein weiteres Problem ist der Dateiname.
Der Name ist immer ein andererer. Das Script soll am besten alle .error-Dateien durchsuchen nach der eingegebenen IRN.
Bei Batch kann ich mit Platzhalter ("?") arbeiten, aber wie ist das bei Powershell

Da kannst Du mit regulären Ausdrücken arbeiten. Viel besser. Viel flexibler. Und sexy. ;-) face-wink

Bei Deinem XML fehlt leider die Hälfte oder mehr. Lies Dir mal verschiedene Seiten durch, die sich mit dem Thema PS und XML beschäftigen. Das ist mehr als sexy. Kurz beschrieben: Du liest ein XML-Dokument als XML-Objekt ein und hast somit über die Objekteigenschaften Zugriff auf jedes einzelne Element des XML. Guck z. B. mal hier (so auf die Schnelle ergoogelt): https://www.windowspro.de/script/xml-powershell-elemente-attribute-ausle .... Dann änderst Du den Wert und schreibst ihn zurück. Alles ist gut.
Mitglied: Haberl92
Haberl92 27.07.2021 um 20:57:16 Uhr
Goto Top
ich habe folgendes versucht, aber erfolglos.
zumindest konnte ich die Variable schon richtig bearbeiten



bin ich da schon auf den richtigen Weg?
Und wie schaffe ich es, dass die Zieldatei die Ursprungsdatei ersetzt mit gleichen Namen?
Mitglied: TK1987
TK1987 28.07.2021 aktualisiert um 12:43:30 Uhr
Goto Top
Moin,

Zitat von @Haberl92:

hier kommst du mit dem replace-Operator und regulären Ausdrücken leichter und sauberer ans Ziel.
Der Punkt steht für "beliebiges Zeichen", das Dollarzeichen für "am Ende der Zeichenkette".
Regex Tutorial
Regex Legende

Get-Content gibt nur den Inhalt einer Textdatei wieder. Du musst also in der Foreach-Schleife die einzelnen Dateien abarbeiten.

In deinem Fall wäre es am besten, die Dateien mit Select-String auf die Zeichenkette durchsuchen. So erhälst du auch wirklich nur die Dateien, die die Zeichenkette enthalten.

Gruß Thomas
Mitglied: erikro
erikro 28.07.2021 um 11:23:24 Uhr
Goto Top
Moin,

Zitat von @Haberl92:
> bin ich da schon auf den richtigen Weg?

IMHO nicht. Ich würde Dir empfehlen, dass mit den XML-Funktionen zu machen und nicht mit blindem Durchsuchen der Datei nach der Ziffernfolge und dem blinden Ersetzen. Ich weiß ja nicht, wie die Namen da so entstehen. Aber ich würde befürchten, dass die Ziffernfolge auch mal zufällig an anderer Stelle z. B. in der Image-ID auftaucht. Die würde beim blinden Ersetzen auch mit geändert und dann ist alles kaputt. ;-) face-wink Mit den XML-Funktionen kannst Du sicher sein, dass Du auch wirklich nur Daten des Knoten veränderst, den Du auch wirklich manipulieren willst.

Und wie schaffe ich es, dass die Zieldatei die Ursprungsdatei ersetzt mit gleichen Namen?

Na indem Du am Ende das Ergebnis in die Datei schreibst.

Liebe Grüße

Eriki
Mitglied: Haberl92
Haberl92 28.07.2021 um 11:27:55 Uhr
Goto Top
Das klingt schon mal gut. Muss ich nachher gleich testen.
Eine Frage noch:
Die Dateien sind vorher als "Dateiname.xml.error" gespeichert. Ist es möglich die Dateien dann ohne ".error" zu speichern, also als "Dateiname.xml" und die Originaldatei dann löschen? (aber nur bei erfolgreichem ersetzen des Strings)

Und wie sieht es aus, wenn in dem Ordner mehrere ".error"-Dateien sind. Nimmt er dann nur die Datei in der der String steht?
Mitglied: erikro
erikro 28.07.2021 um 11:43:24 Uhr
Goto Top
Moin,

Zitat von @Haberl92:

Das klingt schon mal gut. Muss ich nachher gleich testen.
Eine Frage noch:
Die Dateien sind vorher als "Dateiname.xml.error" gespeichert. Ist es möglich die Dateien dann ohne ".error" zu speichern, also als "Dateiname.xml" und die Originaldatei dann löschen? (aber nur bei erfolgreichem ersetzen des Strings)

Und wie sieht es aus, wenn in dem Ordner mehrere ".error"-Dateien sind. Nimmt er dann nur die Datei in der der String steht?

Ein kleiner Codeschnippsel, um Dich auf die richtige Bahn zu setzen:


Noch ein Hinweis zum Speichern ohne .error:
Die PS ist bekanntlich streng objektorientiert. Das macht die Sache gerade bei solchen Aktionen viel einfacher. In der Schleife steht Dir mit $file ein Objekt zur Verfügung, das alle Eigenschaften der Datei enthält. In der Eigenschaft $file.basename steht der Name ohne Extension. In $file.name steht der Name mit Extension. In $file.fullname steht der ganze Pfad auf die Datei. Und in $file.extension steht die Erweiterung nach dem letzten Punkt. Vielleicht noch $file.parent. Das ist das übergeordnete Verzeichnis. Damit solltest Du das hinkriegen, zum Schluss ohne .error zu speichern. ;-) face-wink

Liebe Grüße

Erik
Mitglied: erikro
erikro 28.07.2021 um 11:45:12 Uhr
Goto Top
Zitat von @erikro:

Moin,

Zitat von @Haberl92:

Das klingt schon mal gut. Muss ich nachher gleich testen.
Eine Frage noch:
Die Dateien sind vorher als "Dateiname.xml.error" gespeichert. Ist es möglich die Dateien dann ohne ".error" zu speichern, also als "Dateiname.xml" und die Originaldatei dann löschen? (aber nur bei erfolgreichem ersetzen des Strings)

Und wie sieht es aus, wenn in dem Ordner mehrere ".error"-Dateien sind. Nimmt er dann nur die Datei in der der String steht?

Ein kleiner Codeschnippsel, um Dich auf die richtige Bahn zu setzen:

>
Noch ein Hinweis zum Speichern ohne .error:
Die PS ist bekanntlich streng objektorientiert. Das macht die Sache gerade bei solchen Aktionen viel einfacher. In der Schleife steht Dir mit $file ein Objekt zur Verfügung, das alle Eigenschaften der Datei enthält. In der Eigenschaft $file.basename steht der Name ohne Extension. In $file.name steht der Name mit Extension. In $file.fullname steht der ganze Pfad auf die Datei. Und in $file.extension steht die Erweiterung nach dem letzten Punkt. Vielleicht noch $file.parent. Das ist das übergeordnete Verzeichnis. Damit solltest Du das hinkriegen, zum Schluss ohne .error zu speichern. ;-) face-wink

<edit>Das [xml] vor der Variablen ist wichtig. Das weißt die PS an, nicht ein Objekt "textdatei", sondern ein Objekt "xml-Dokument" anzulegen.</edit>

Liebe Grüße

Erik
Mitglied: Haberl92
Haberl92 28.07.2021 aktualisiert um 21:20:08 Uhr
Goto Top
Ich habe es bis jetzt so:



Es funktioniert so eigentlich perfekt.
Nun versteh ich das mit dem $File.Path noch nicht.
Wie schaffe ich es, dass es ohne die Endung ".error" gespeichert wird?
Und gibt es einen Befehl, nach Beendigung das Script von vorne startet?(wenn ich mehr Dateien bearbeiten muss)


Dann hätte ich noch ein Problem:
Ich habe die Datei mit der Endung ".xml.error" und noch eine weitere Datei mit gleichen Namen aber nur der Endung ".error". In dieser Datei würden die Werte für die Variablen $IRN und §PZ stehen.
bild 1
Der Inhalt sieht so aus:
Fehler in BelegRefernzNummer 120941414400 : Pruefziffer 0 falsch, richtig wäre 4! BAB: 0117192841

Die 12-stellige Ziffer wär $IRN und die "4" wäre $PZ.

Wäre es möglich die Variablen aus der anderen Datei auslesen zu lassen?
Mitglied: TK1987
TK1987 29.07.2021 aktualisiert um 09:51:15 Uhr
Goto Top
Zitat von @Haberl92:
Es funktioniert so eigentlich perfekt.
Nun versteh ich das mit dem $File.Path noch nicht.
Mit Powershell arbeitet man Objektorieniert, sprich mit Objekten, die verschiedene Eigenschaften besitzen.

Stell dir zum Beispiel ein Adressbuch vor. Jeder einzelne Eintrag in dem Adressbuch hat verschiedene Eigenschaften, wie etwa: Name, Vorname, PLZ, Ort, Straße, Hausnummer, ...
Genauso verhält es sich auch bei Powershell.

In diesem Fall gibt der Befehl Select-String immer Objekte der Klasse MatchInfo zurück. Dieses enthält unter anderem die Eigenschaften:
PathDer Dateipfad, in dem die Zeichenkette vorkommt
FilenameDer Dateiname
LineDie komplette Zeile, in der die gesuchte Zeichenkette vorkommt
LinenumberDie Zeilennummer, in der die Zeichenkette gefunden wurde
es gibt noch ein paar andere, wie du dem Link entnehmen kannst.

Nachdem du also den Select-String Befehl ausgeführt hast, hast du in der Variable $Result Objekte dieser Klasse; und kannst zum Beispiel mit
Alle Dateinamen auflisten, in denen die Zeichenkette gefunden wird.

Ebenso kannst du dir die Objekte und ein paar Eigenschaften auch als Tabelle anzeigen lassen:

in unser Foreach-Schleife bearbeiten wir alle diese Objekte einzeln in der Variable $File. Wenn wir den Inhalt einer Datei laden wollen, brauchen wir den Dateipfad, der in der Path-Eigenschaft steht - daher $File.Path

Noch genauer wird das alles in dem Powershell Leitfaden für Anfänger erläutert.

Wie schaffe ich es, dass es ohne die Endung ".error" gespeichert wird?
Beachte jedoch, dass du dann 2 XML-Dateien hast, die alte Fehlerhafte und die korrigierte. Besser wäre daher, die Datei wieder inklusive der .error-Endung abzuspeichern und dann umzubenennen.

Dann hätte ich noch ein Problem:
Ich habe die Datei mit der Endung ".xml.error" und noch eine weitere Datei mit gleichen Namen aber nur der Endung ".error".
[...]
Wäre es möglich die Variablen aus der anderen Datei auslesen zu lassen?

Das Ganze enthält bislang natürlich noch keine Fehlerbehandlung, falls etwa eine Datei oder ein Wert nicht gefunden werden konnten - aber ich dachte mir fürs erste reicht das auch mal.
Mitglied: Haberl92
Haberl92 29.07.2021 aktualisiert um 20:45:11 Uhr
Goto Top
Zitat von @TK1987:

.xml.error-Datei umbenennen in .xml
Rename-Item -Path $Xml_Pfad -NewName ($Xml_Pfad.Name -replace '\.error$')


Das Ganze enthält bislang natürlich noch keine Fehlerbehandlung, falls etwa eine Datei oder ein Wert nicht gefunden werden konnten - aber ich dachte mir fürs erste reicht das auch mal.

Alles bis auf das Umbenennen funktioniert wunderbar.
Beim Umbennen kommt folgende Meldung:

Rename-Item : Das Argument kann nicht an den Parameter "NewName" gebunden werden, da es sich um eine leere Zeichenfolge handelt.
In C:\Temp\PruefzifferBatch\Pruefziffer2.0.ps1:33 Zeichen:40
+ ... me-Item -Path $Xml_Pfad -NewName ($Xml_Pfad.Name -replace '\.error$')

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : InvalidData: (: ) [Rename-Item], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft.PowerShell.Commands.RenameItemCommand


ist es nicht einfacher, die Endung .error (6 Zeichen) irgendwie weg zu kürzen?

Zur Fehlerbehandlung:
Wäre es möglich prüfen zu lassen, dass er als $PZ eine Zahl zwischen 0 und 9 einliest?
Falls es was anderes sein sollte, dann soll er nichts machen?
Mitglied: TK1987
Lösung TK1987 30.07.2021, aktualisiert am 02.08.2021 um 17:18:44 Uhr
Goto Top
Zitat von @Haberl92:
Alles bis auf das Umbenennen funktioniert wunderbar.
Mein Fehler, sorry.
Der Pfad in $XML_Path ist eine Zeichenkette und kein FileSystemObject, hat daher auch keine Eigenschaft "Name" - diese einfach weglassen, dann passt es.

Wäre es möglich prüfen zu lassen, dass er als $PZ eine Zahl zwischen 0 und 9 einliest?
Etwas anderes kann er ohnehin nicht einlesen.

\d steht für "digit" (also Ziffer) und gilt immer genau für eine Stelle.
Bei der IRN ist {12} eine Mengenangabe, sorgt also dafür, das die IRN immer eine Zahl von exakt 12 Ziffern sein muss.

Falls es was anderes sein sollte, dann soll er nichts machen?
Geht alles. Sinnvoller ist es hier, den Select-String-Befehl vor die Foreach-Schleife zu legen und dann die Ergebnisse mit Foreach zu bearbeiten. So werden Dateien, bei denen die IRN keine 12-stellige Zahl oder die Prüfziffer keine 1-stellige Zahl ist erst gar nicht abgearbeitet.
Darüber hinaus hab ich dir noch eine Fehlerüberprüfung eingebaut, falls die XML-Datei nicht gefunden werden konnte.

Mitglied: Haberl92
Haberl92 30.07.2021 um 12:10:45 Uhr
Goto Top
Vielen Dank.
Werde ich am Montag gleich testen.
Komme bis dahin nicht mehr an dem Rechner mit den Dateien
Mitglied: Haberl92
Haberl92 02.08.2021 um 15:10:30 Uhr
Goto Top
Das Script funktioniert wunderbar. Vielen Dank
Jetzt nur noch eine Frage:
Kann ich nach erfolgreichen Ersetzen und Umbenennen die ".error"-Datei (nicht die ".xml.error") gleich löschen lassen?
Mitglied: TK1987
TK1987 02.08.2021 um 15:49:01 Uhr
Goto Top
Zitat von @Haberl92:
Kann ich nach erfolgreichen Ersetzen und Umbenennen die ".error"-Datei (nicht die ".xml.error") gleich löschen lassen?
Kein Problem. Habe es oben noch ergänzt.
Mitglied: Haberl92
Haberl92 02.08.2021 um 17:01:04 Uhr
Goto Top
es scheint noch, als würde eine geschweifte Klammer fehlen.

Die schließende "}" fehlt im Anweisungsblock oder der Typdefinition.
+ CategoryInfo : ParserError: (:) face-smile [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MissingEndCurlyBrace
Mitglied: TK1987
TK1987 02.08.2021 um 17:19:19 Uhr
Goto Top
Stimmt, ist korrigiert.
Mitglied: C.Caveman
C.Caveman 02.08.2021 um 17:29:44 Uhr
Goto Top
Zitat von @Haberl92:

es scheint noch, als würde eine geschweifte Klammer fehlen.

Die schließende "}" fehlt im Anweisungsblock oder der Typdefinition.
+ CategoryInfo : ParserError: (:) face-smile [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MissingEndCurlyBrace

Bei allem nötigen Respekt. Aber so eine Klammer selbständig zu setzen, sollte jetzt nicht zum Showstopper werden.
Mitglied: Haberl92
Haberl92 02.08.2021 um 17:58:22 Uhr
Goto Top
Zitat von @C.Caveman:

Zitat von @Haberl92:

es scheint noch, als würde eine geschweifte Klammer fehlen.

Die schließende "}" fehlt im Anweisungsblock oder der Typdefinition.
+ CategoryInfo : ParserError: (:) face-smile [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MissingEndCurlyBrace

Bei allem nötigen Respekt. Aber so eine Klammer selbständig zu setzen, sollte jetzt nicht zum Showstopper werden.


Bei den Klammern in einer Schleife, weiß ich nicht genau, wo die hin gehört. (bin ja Powershell Neuling)
Lieber frag ich nochmal nach, als dass alles schief läuft.
Und wenn später jemand, das gleiche Problem hat und diesen Thread liest, dann ist derjenige froh, wenn alles so läuft, wie es laufen soll
Mitglied: Haberl92
Haberl92 02.08.2021 um 18:04:03 Uhr
Goto Top
Jetzt funktioniert es perfekt.
Vielen Dank an TK1987 und alle anderen die mir geholfen haben.
Heiß diskutierte Beiträge
question
Windows PrintServer 2016 - KB5005573 macht Drucken unmöglich Fehler 0x11bbeidermachtvongreyscullVor 1 TagFrageWindows Server22 Kommentare

Moin Kollegen, verdammt den hatte ich nicht auf dem Schirm. Ich hab gestern Sicherheitsupdates auf unseren 2016ern ausgerollt und heute morgen kann keiner mehr drucken, ...

question
Rechner im Netzwerk frieren nach Neustart einCZF-MarkusVor 1 TagFrageWindows Netzwerk15 Kommentare

Seit einer Woche frieren unsere Rechner (Windows 10) im Firmennetzwerk nach einem Neustart ein, mal ist es die Outlook.exe, mal die Explorer.exe, mal die .exe ...

question
Macadresse fest auf dem Board ändernDippsVor 1 TagFrageHardware12 Kommentare

Hallo ich habe ein Mainboard was defekt ist. Nun habe ich das Typgleiche geholt und ausgetauscht. Es läuft ein Linux drauf mit einer Software die ...

question
Kauftipp für einfaches KabelmodemTheEPOCHVor 1 TagFrageHardware5 Kommentare

Hallo zusammen, ich bräuchte eine kleine Kaufberatung. Ich suche ein ganz einfaches Kabelmodem. Das Gerät soll vor eine OPNsense und das Internet bereitstellen. DOCSIS 3.0 ...

question
Clonen einer SSD Platte auf eine grösserejensgebkenVor 21 StundenFrageFestplatten, SSD, Raid9 Kommentare

Hallo Gemeinschaft habe in meinem Rechner eine alte SSD 128 und eine neu installierte mit Windows 10 drauf 512 GB nun möchte ich gerne die ...

question
Aufbau Netzstruktur für CARP mit OPNsense gelöst screemyVor 1 TagFrageLinux Netzwerk6 Kommentare

Guten Abend, wir betreiben auf 2 ProxmoxVE Hosts jeweils eine OPNsense. Diese möchten wir mittels CARP hochverfügbar konfigurieren für die LAN/WAN Schnittstelle. Folgender Aufbau ist ...

info
Druckprobleme an PrintServern nach Sept. 2021 UpdatekgbornVor 1 TagInformationWindows Server

FYI: Seit die Sicherheitsupdates vom Patchday 14. September 2021 ausgerollt wurden, stehen Administratoren vor dem Problem, dass Clients eventuell nicht mehr an einem Terminalsever oder ...

question
Fritzbox als VPNClientproton34Vor 1 TagFrageRouter & Routing7 Kommentare

Hallo, ich habe dem letzt gelesen, dass es nicht möglich sein soll eine FritzBox 7490 als VPNClient zu verwenden. Den Beitrag findet ihr hier:. Jetzt ...