Jump to content

In allen Dateien eines Verzeichnisses eine bestimmte Zeile der Datei ändern


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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

Link zu diesem Kommentar

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 von BOfH_666
Link zu diesem Kommentar

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?

Link zu diesem Kommentar

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 von NilsK
Link zu diesem Kommentar
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 von BOfH_666
Link zu diesem Kommentar

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? :lol3:

 

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

 

Link zu diesem Kommentar

Hi,

 

mit der PowerShell wärst du da (grob) bei:

Gruß

Jan

Link zu diesem Kommentar
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.  ;-) :D  

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? :lol3:

Jaaa.... sorry. Ich hab auch schon verschiedene Therapien versucht, aber ich werd's einfach nicht los. ;-) :ohje:

Link zu diesem Kommentar

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.

Link zu diesem Kommentar

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 = "&#x1E;06&#x1D;F01001T&#x1D;6JUN3165"
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

Link zu diesem Kommentar

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 von NilsK
Link zu diesem Kommentar
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

Link zu diesem Kommentar

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 von testperson
Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...