Eagle71 0 Geschrieben 8. Oktober 2020 Melden Teilen Geschrieben 8. Oktober 2020 Hallo ! ich bin noch vollkommen neu und suche eine Möglichkeit eine bestimmte Zeile aller xml Dateien eines Verzeichnisses zu ändern. Also: - Öffne die erste Datei in Verzeichnis C:\Test - Ersetzte Zeile 12 durch "abcdef" - Speichere die Datei (die vorhandene Datei überschreiben, oder die Datei neu in einem Unterverzeichnis speichern) - Schleife solange weitere Dateien im Verzeichnis sind: - Öffne dir nächste Datei - Ersetzte Zeile 12 durch "abcdef" Ende Ist das auch überhaupt so möglich? Vielen Dank für eure Hilfe! Markus Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 8. Oktober 2020 Melden Teilen Geschrieben 8. Oktober 2020 (bearbeitet) Markus, Willkommen im MCSEBoard. vor 12 Minuten schrieb Eagle71: Ist das auch überhaupt so möglich? Klar. Für einen erfahrenen Scripter ist das eine Fingerübung. Welche Art von Hilfe erwartest Du denn? Wir schreiben keinen gebrauchsfertigen Code auf Anfrage. ... und nur noch aus Neugier: warum brauchst Du denn so ein Script? bearbeitet 8. Oktober 2020 von BOfH_666 Zitieren Link zu diesem Kommentar
Eagle71 0 Geschrieben 8. Oktober 2020 Autor Melden Teilen Geschrieben 8. Oktober 2020 Ich habe gerade einen neuen Job bekommen und sitze vor einigen Tausend Dateien mit falschen Chargen Nummern :( Nun muss ich mich darum kümmern diese zu korrigieren... Mein Aktueller Ansatz war nun erstmal eine spezielle Datei mit suchen und ersetzen zu ändern: Set MyFiles = CreateObject("Scripting.FileSystemObject") varDatei="E:\VBScript\Test\04706237.xml" Set f = MyFiles.OpenTextFile(varDatei, 1) Text = f.ReadAll varSearch="06F01001T6JUN3165" varReplace="20201008" Set f = MyFiles.OpenTextFile(varDatei, 2, True) f.Write Replace(Text, varSearch, varReplace,1,-1,1) MsgBox "Durchlauf beendet" Wie kann ich nun als nächsten Schritt von einer Datei zu allen Dateien im Verzeichnis kommen? Zitieren Link zu diesem Kommentar
NilsK 2.934 Geschrieben 8. Oktober 2020 Melden Teilen Geschrieben 8. Oktober 2020 (bearbeitet) Moin, du ersetzt deine Variablenzuweisung für varDatei durch eine Schleife, die alle Dateien des Ordners durchgeht. Beispiele dafür findest du zuhauf im Web. Anmerkungen: sowas macht man heute in PowerShell (nur damit ich der erste bin, der das sagt) dein Code ist unordentlich - es lohnt auch bei so kleinen Skripten, etwas mehr Ordnung reinzubringen. So würde man z.B. alle Variablen in einem Block definieren, das macht es schon viel übersichtlicher (und leichter zu ändern). Und wenn du schon mit Präfixen arbeitest, dann sollten diese Aufschluss über den Typ der Variablen geben (obj, str ...). Gerade bei schwach typisierten Sprachen hilft das, um festzulegen, was man denn für Werte erwartet. Meldungen lieber per WScript.Echo, nicht per MsgBox. Eine Messagebox öffnet immer eine Box, ein Echo funktioniert auch auf der Kommandozeile ohne Bruch. Dein Ansatz funktioniert, wenn der Suchtext genau einmal vorkommt. Falls er mehrfach auftaucht, ersetzt er jedes Mal - das kann unerwünscht sein. Möglicherweise passt dieser simple Ansatz für die Aufgabe - dann ist er okay. Da du XML-Dateien verarbeitest, könnte man hier auch sauberer arbeiten, was aber auch mit mehr Aufwand verbunden ist. Ich bin da auch Anhänger von "nimm die einfachste Methode, wenn es nur einmalig nötig ist" - aber für den Hinterkopf mag der Hinweis auf XML-Verarbeitung nützlich sein. Gruß, Nils bearbeitet 8. Oktober 2020 von NilsK 1 Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 8. Oktober 2020 Melden Teilen Geschrieben 8. Oktober 2020 (bearbeitet) vor 15 Minuten schrieb Eagle71: Ich habe gerade einen neuen Job bekommen und sitze vor einigen Tausend Dateien mit falschen Chargen Nummern :( OK. Da wäre meine nächste Frage normalerweise "Wo kommen denn diese 1000 Dateien mit falschen Chargen Nummern her?", Kann man die vielleicht mit der ursprünglichen Methode nur eben mit richtigen Chargen-Nummern neu erzeugen?". Zitat Nun muss ich mich darum kümmern diese zu korrigieren... Bitte nicht falsch verstehen - Musst Du das wirklich? Wenn ich eine Aufgabe übergeholfen bekomme, die nicht zu meinen normalen Tätigkeiten gehört, versuche ich kurz zu hinterfragen, ob das wirklich meine Baustelle ist. Zitat Mein Aktueller Ansatz war nun erstmal eine spezielle Datei mit suchen und ersetzen zu ändern: Mit VBScript kann ich Dir leider nicht helfen - es gibt aber Kollegen hier im Forum, die das drauf haben. Was ich Dir aber sagen kann ist, wenn Du vorhast, Dich noch ne Weile in Windows-System-Umgebungen runzutreiben, solltest Du dringend darüber nachdenken, Dir Powershell anzueignen. Es ist die modernere Sprache und Du findest deutlich mehr Hilfe im Netz als für VBScript. Achja ... und bitte Code als Code formatieren! Danke. bearbeitet 8. Oktober 2020 von BOfH_666 Zitieren Link zu diesem Kommentar
Eagle71 0 Geschrieben 8. Oktober 2020 Autor Melden Teilen Geschrieben 8. Oktober 2020 Mir geht es darum mich darin einzuarbeiten und auch zu verstehen, was ich da tue... Wahrscheinlich werde ich Zukunft öfter Dateien ändern müssen und da möchte ich mich dann auskennen wie ich das tue. Wenn PowerShell ein besseres Werkzeug dafür ist, ist das auch schon ein Hinweis für mich und ich kann versuchen mich dort einzuarbeiten ;) Zitieren Link zu diesem Kommentar
NilsK 2.934 Geschrieben 8. Oktober 2020 Melden Teilen Geschrieben 8. Oktober 2020 Moin, vor 22 Minuten schrieb BOfH_666: Kann man die vielleicht mit der ursprünglichen Methode nur eben mit richtigen Chargen-Nummern neu erzeugen? Himmel, musst du immer so pragmatisch sein? vor 11 Minuten schrieb Eagle71: Mir geht es darum mich darin einzuarbeiten und auch zu verstehen, was ich da tue... [...] Wenn PowerShell ein besseres Werkzeug dafür ist, ist das auch schon ein Hinweis für mich und ich kann versuchen mich dort einzuarbeiten ;) Auf jeden Fall. VBScript ist zwar nicht tot, müffelt aber schon ziemlich. Nix für die Zukunft. Die Grundidee des Skripts bleibt in PowerShell dieselbe. Ist nur insgesamt dort einfacher. Gruß, Nils Zitieren Link zu diesem Kommentar
testperson 1.677 Geschrieben 8. Oktober 2020 Melden Teilen Geschrieben 8. Oktober 2020 Hi, mit der PowerShell wärst du da (grob) bei: Get-ChildItem (https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem?view=powershell-7), einem "-Filter" und ggfs. "-Recurse" Dann müsstest du die gefundenen Dateien mit foreach (https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_foreach?view=powershell-7) durchlaufen Jetzt wären zwei Wege denkbar Die jeweilige Datei mit Get-Content (https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-content?view=powershell-7) öffnen und zeilenweise bis Zeile 12 einlesen/ändern, speichern und weiter machen Im Falle von XML (auf die Schnelle gefunden): https://powershell.org/forums/topic/replace-text-in-xml-files-with-powershell/ Gruß Jan Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 8. Oktober 2020 Melden Teilen Geschrieben 8. Oktober 2020 vor 43 Minuten schrieb Eagle71: Mir geht es darum mich darin einzuarbeiten und auch zu verstehen, was ich da tue... Das Argument schlägt alle anderen. Dafür ist alles erlaubt. vor 43 Minuten schrieb Eagle71: Wenn PowerShell ein besseres Werkzeug dafür ist, ist das auch schon ein Hinweis für mich und ich kann versuchen mich dort einzuarbeiten ;) Es ist immer das Werkzeug das Beste, womit Du Dich am besten auskennst. Ich habe schon Anwender Texte in Excel schreiben sehen und Tabellen in Word, nur weil sie gerade einen Excel oder Word - Kurs absolviert hatten. Da aber Powershell auf Windows-Systemen das jüngste/universellste/<subjectiv>einfachste</subjectiv> System-Verwaltungs-Tool ist, bist Du schon gut beraten, Dich damit gut auszukennen. Du brauchst aber das Rad nicht immer wieder neu erfinden. Für 99,9% aller Fälle hat sich schon mal jemand einen Kopf drüber gemacht. Du musst nur die Schnipsel zusammen suchen und clever kombinieren. Dafür solltest Du natürlich trotzdem wissen, was der gefundene Code wirklich tut. Du solltest keinen Code auf produktiven System ausführen, den Du nicht verstehst. z.B. findet man SEHR viel Code-Schnipsel auf Stack-Overflow. Mit den richtigen Such-Begriffen macht man sich das Leben schon sehr viel einfacher. https://stackoverflow.com/search?q=[powershell]+replace+string+in+multiple+files https://stackoverflow.com/search?q=[Powershell]+replace+string+in+xml+file ... und wenn Du an einer Stelle mit Deinem Code nicht weiterkommst, kannst Du immernoch hier (oder überall im Internet) fragen und Dir wird geholfen. vor 36 Minuten schrieb NilsK: Himmel, musst du immer so pragmatisch sein? Jaaa.... sorry. Ich hab auch schon verschiedene Therapien versucht, aber ich werd's einfach nicht los. 1 Zitieren Link zu diesem Kommentar
daabm 1.354 Geschrieben 8. Oktober 2020 Melden Teilen Geschrieben 8. Oktober 2020 Stand oben schon mal: Wenn das XML ist, gibt es keinen Grund für "Zeile 12 ändern". Wenn Du diese Dateien als XML lädst, kannst Du relativ komfortabel darin navigieren und Eigenschaften (= Properties) sowie Inhalte (= Nodes) ändern. Dazu müßtest Du aber mal zeigen, was Du schon hast und wie so ein XML aussieht. Ansonsten bin ich bei Olaf: Wer's falsch angeliefert hat, könnte es doch auch richtig anliefern? Und "mehrere tausend" hat ja sicher ein Automatismus erstellt, der könnte das ja ein zweites Mal "korrekt tun" PS: VBS spreche ich zwar noch, habe damit aber schon seit ca. 5 Jahren kaum noch etwas gemacht. Powershell wäre wirklich die bessere Alternative. Zitieren Link zu diesem Kommentar
Eagle71 0 Geschrieben 9. Oktober 2020 Autor Melden Teilen Geschrieben 9. Oktober 2020 So, neuer Tag, neuer Versuch :) Vielen Dank erstmal für die ganze Hilfe! Ich werde dann mal weiter probieren und mich bei den nächsten Fehlversuchen wieder melden ;) Zitieren Link zu diesem Kommentar
Eagle71 0 Geschrieben 9. Oktober 2020 Autor Melden Teilen Geschrieben 9. Oktober 2020 Ich glaube PowerShell wäre jetzt erstmal aufwendiger mich einzuarbeiten und mit einer Datei die ich aufrufen kann, komme ich irgendwie besser klar... Hier wäre meine Lösung in jeder Datei eines Verzeichnisses einen String auszutauschen. Könnte man bestimmt noch hübscher machen, aber es funktioniert ;) Jetzt versuche ich mal eine Lösung für "blinde" Änderungen an einer bestimmten Stelle zu machen. Hätte da jemand evtl. eine Idee für mich? Dim VarOld 'Alter Text' Dim VarNew 'Neuer Text' Dim VarLoc 'Pfad des Verzeichnisses' VarOld = "06F01001T6JUN3165" VarNew = "20201008" VarLoc = "J:\VBScript\Test\" Call allctlFiles(VarLoc) MsgBox "Durchlauf beendet" Function allctlFiles(Pfad) 'aufzurufen mit Call allctlFiles("DEIN ORDNER PFAD")' Set fso = CreateObject("Scripting.FilesystemObject") Set Folder = fso.GetFolder(Pfad) For Each File In folder.Files 'Hier können nun Funktionen aufgerufen werden' Set MyFiles = CreateObject("Scripting.FileSystemObject") Set f = MyFiles.OpenTextFile(varLoc&File.name, 1) Text = f.ReadAll Set f = MyFiles.OpenTextFile(varLoc&File.name, 2, True) f.Write Replace(Text, VarOld, VarNew,1,-1,1) Next End Function Zitieren Link zu diesem Kommentar
NilsK 2.934 Geschrieben 9. Oktober 2020 Melden Teilen Geschrieben 9. Oktober 2020 (bearbeitet) Moin, vor einer Stunde schrieb Eagle71: Jetzt versuche ich mal eine Lösung für "blinde" Änderungen an einer bestimmten Stelle zu machen. Hätte da jemand evtl. eine Idee für mich? das hinge stark davon ab, was du damit meinst. Das müsstest du bitte noch mal erklären. Ich hab deinen Code mal noch etwas aufgeräumt. Du solltest dir aber fürs nächste Mal wirklich die PowerShell ansehen. VBS kann mittlerweile kaum noch jemand unterstützen. Option Explicit ' das "Dim" ergibt eigentlich nur mit dieser Direktive Sinn Dim strOld 'Alter Text Dim strNew 'Neuer Text Dim strPath 'Pfad des Verzeichnisses strOld = "06F01001T6JUN3165" strNew = "20201008" strPath = "J:\VBScript\Test\" Call ProcessFiles(strPath) WScript.Echo "Durchlauf beendet" Sub ProcessFiles(strFolder) ' da du keinen Rückgabewert hast, ist eine Sub klarer Set objFSO = CreateObject("Scripting.FilesystemObject") Set objFolder = objFSO.GetFolder(strFolder) For Each objFile In objFolder.Files Set objReadFile = objFile.OpenTextFile(strFolder & objFile.Name, 1) strText = objReadFile.ReadAll objReadFile.Close strText = Replace(strText, strOld, strNew,1,-1,1) 'dies ist die eigentliche Aktion, daher separat ausgewiesen Set objWriteFile = objFile.OpenTextFile(strFolder & objFile.Name, 2, True) objWriteFile.Write strText objWriteFile.Close Next End Sub Ich hab das jetzt nicht getestet, wollte aber auf ein paar Dinge aufmerksam machen. Vor allem solltest du dir angewöhnen, genauer zu planen, mit was für Variablen du zu tun hast (String, Objekt, Integer ...). Außerdem ist der Ansatz, dieselbe Datei zweimal zu öffnen (geschuldet der Methode - das hab ich jetzt mal so gelassen) immer schwierig - mach sowas ordentlich mit ausdrücklichen Bezeichnungen und schließe das Objekt (= die Datei) zwischendurch wieder. Hingegen ist es unnötig/unsinnig, zwei FSO-Objekte zu haben, daher habe ich eins mal rausgenommen. Zudem ist dein Umgang mit Variablen hier generell problematisch: Deine Prozedur erwartet nur den Ordner als Argument. Den Inhalt der anderen beiden wichtigen Variablen - alter und neuer Text - übernimmt es aus dem globalen Kontext, weil sie außerhalb der Prozedur definiert wurden. Das funktioniert in VBS, kann in anderen Sprachen aber bös auf die Nase fallen. Eigentlich müsste deine Prozedur alle drei Werte übergeben bekommen. (In VBS kommt dann noch hinzu, dass Variablen eigentlich keinen Scope haben, sondern sich nur anhand des Namens unterscheiden - eine lokale Variable kann also eine globale überschreiben, ganz schwer zu findender Fehler ...) Gruß, Nils bearbeitet 9. Oktober 2020 von NilsK Zitieren Link zu diesem Kommentar
Sunny61 806 Geschrieben 9. Oktober 2020 Melden Teilen Geschrieben 9. Oktober 2020 vor 1 Stunde schrieb Eagle71: Ich glaube PowerShell wäre jetzt erstmal aufwendiger mich einzuarbeiten und mit einer Datei die ich aufrufen kann, komme ich irgendwie besser klar... In Powershell gibt es natürlich auch Scriptdateien, .ps1 ist dort die Endung. Und es gibt in PS eine super kostenlose Entwicklungsumgebung: Visual Studio Code Zitieren Link zu diesem Kommentar
testperson 1.677 Geschrieben 9. Oktober 2020 Melden Teilen Geschrieben 9. Oktober 2020 (bearbeitet) Ich habe mich grade von der PowerShell überraschen lassen. Für eine Datei, "hardcoded" Zeile 12 und Quick'n'Dirty: $File = Get-Content "C:\XML\Pfad\Test.xml" $File[11] = $File[11].Replace("Zeile 12", "geändete Zeile 12") Set-Content -Path "C:\XML\Pfad\Test_neu.xml" -Value $File bearbeitet 9. Oktober 2020 von testperson Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.