kame-hame-ha

Routine zum suchen von von Dateien und speichern deren Namen sowie Werte als Variablen für die weitere Verwendung

Hallo allerseits,
habe mich heue extra registriert, weil ich einfach nicht schnell genug weiterkomme.  Bis jetzt konnte ich mit Hilfe der geposteten Beiträge mich sehr gut voran bewegen. Nun stehe ich vor einem Problem. Ich benötige ein VBS oder Batch Script für die folgende Aufgabe, am besten an einem Beispiel zu erläutern:
es gibt einen Verzeichnis D:\TXT. Hier liegen fünf txt-files
000111_D.txt
000113_C.txt
000234_A.txt
000456_B.txt
000832_A.txt
Der Inhalt dieser Dateien ist ein Wert, z.B. i.O oder n.i.O

In einem anderen Verzeichnis D:\XML liegen fünf xml-files:
000111_A_Part1.xml
000113_C_Part2.xml
000234_A_Product1.xml
000456_B_Product2.xml
000832_A_Part1.xml

Diese XML-Dateien beinhalten irgendwo einen Eintrag
<UserValue value="n.d." title="test_result"></UserValue>

Ich habe als Einstieg einen VBScript geschrieben, der eine festgelegte XML nach diesem Eintrag druchsucht und den Wert bei value=”n.d“ durch einen festgelegten Wert ersetzt.

'Variablen initialisieren  
Dim oldvalue 
Dim newvalue 
Dim newcontent
Dim content

'Variablen setzen  
oldvalue = "value=" & _  
		Chr(34) & "n.d." & Chr(34) & _   
		" " & _  
		"title=" & _  
		Chr(34) & "test_result" & Chr(34)  

newvalue = "value=" & _  
		Chr(34) & "i.o." & Chr(34) & _   
		" " & _  
		"title=" & _  
		Chr(34) & "test_result" & Chr(34)  

'Datei öffnen und auslesen  
Set FSO = CreateObject("Scripting.FileSystemObject")  
Set File = FSO.OpenTextFile("D:\XML\000093_A_Part1.xml", 1)  
content = File.ReadAll
File.Close

'String finden und ersetzen  
newcontent= Replace(content, oldvalue , newvalue)


'In Datei schreiben  
Set File = FSO.OpenTextFile("D:\XML\000093_A_Part1.xml", 2)  
File.Write newcontent 
File.Close

Das Ziel ist es aber, dass ein Script in das Verzeichnis D:\TXT geht, die erste Datei öffnet und sich den Namen der Datei und den Inhalt (also als Variablen) merkt . Dann geht er in das D:\XML Verzeichnis, sucht eine XML, die den gleichen Namen (bzw. die ersten 8 Stellen sind identisch) hat wie die entsprechende txt-datei, und schreibt den gespeicherten Wert in das value=““ .
Das Script wird solange ausgeführt, bis er alle txt-dateien abgearbeitet hat.
Vielleicht hat einer von euch eine Idee, bin für jede Lösung dankbar.
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 183565

Url: https://administrator.de/forum/routine-zum-suchen-von-von-dateien-und-speichern-deren-namen-sowie-werte-als-variablen-fuer-die-weitere-183565.html

Ausgedruckt am: 16.05.2025 um 19:05 Uhr

Kame-hame-ha
Kame-hame-ha 17.04.2012 um 14:09:43 Uhr
Goto Top
Hmm, schade, dass sich niemand gemeldet hat...
Biber
Biber 17.04.2012 um 14:14:27 Uhr
Goto Top
Zitat von @Kame-hame-ha:
Hmm, schade, dass sich niemand gemeldet hat...
Hmmm, warte doch noch einen Moment - heute war doch wieder bis 13:30h Streiktag bei der ver.di und es sind bestimmt noch nicht alle zurück vom Marktplatz.
bastla
bastla 17.04.2012 um 16:45:25 Uhr
Goto Top
Hallo Kame-hame-ha und ein etwas verspätetes Willkommen im Forum, hallo Biber!

Vor lauter Arbeit war ich noch nicht mal zum Streiken gekommen ... face-wink
Verstehe ich das richtig, dass die XML-Dateien nach dem sich aus der Textdatei ergebenden Beginn des Namens noch einen nicht bekannte Zusatz (wie "_Part1") enthalten?

Grüße
bastla
Kame-hame-ha
Kame-hame-ha 17.04.2012 um 16:54:54 Uhr
Goto Top
Hallo Biber und bastla,

freut mich, dass ihr euch gemeldet habt. Bei uns auf Arbeit hat nur das Internet gestreikt, das würde ich aber nicht auf ver.di schieben face-smile

Ja, das stimmt. Die XML-Datein sind exportierte Objekte aus der Datenbank, ihre Benennung kann man nicht ändern. Aber die Namen der korrespondierenden Dateien wären, wie hier im Beispiel, bei den ersten 8 Zeichen identisch.
bastla
bastla 17.04.2012 um 17:28:47 Uhr
Goto Top
Hallo Kame-hame-ha!

Dann brauchst Du 2 Schleifen - die erste, um alle Textdateien durchzuackern, und die zweite, um aus allen XML-Dateien die richtige herauszusuchen - ungetestet etwa so:
TXTOrdner = "D:\TXT"  
XMLOrdner = "D:\XML"  
Alt = "<UserValue value=""n.d."" title=""test_result""></UserValue>"  

Set fso = CreateObject("Scripting.FileSystemObject")  

For Each TXT In fso.GetFolder(TXTOrdner).Files 'alle Textdateien durchgehen  
    TXTInhalt = TXT.OpenAsTextStream.ReadLine 'erste Zeile der Datei einlesen  
    Neu = Replace(Alt, "n.d.", TXTInhalt) 'gelesenen Wert in den Ersatz-String einbauen  
    TXTName = LCase(fso.GetBaseName(TXT.Name)) 'Dateinamen ohne Typ in Kleinbuchstaben erzeugen  
    LName = Len(TXTName) 'Länge des Namens nur einmal, daher vor der Schleife, ermitteln  
    For Each XML In fso.GetFolder(XMLDateien).Files 'alle XML-Dateien durchgehen  
        If LCase(Left(XML.Name, LName)) = TXTName Then 'Wenn der Anfang des Dateinamens mit dem Namen der Textdatei übereinstimmt ...  
            XMLInhalt = XML.OpenAsTextStream.ReadAll '... Dateiinhalt auslesen und ...  
            fso.CreateTextFile(XML.Path).Write Replace(XMLInhalt, Alt, Neu) '... mit ersetztem Text neue Datei erzeugen  
            Exit For 'Fertig - übrige XML-Dateien interessieren nicht mehr  
        End If
    Next
Next
Grüße
bastla

[Edit] Zeile 13 - hoffentlich - richtig gestellt [/Edit]
Kame-hame-ha
Kame-hame-ha 17.04.2012 um 18:00:10 Uhr
Goto Top
danke bastla!

Hab's getestet, läuft noch nicht face-smile. Aber das ist erstmal kein Problem. Jetzt habe ich einen Ansatz und kann darin basteln! Wenn ich es hinbekommen habe, dann poste ich das fertige Script hier rein, ansonsten werde mich hilferufend nochmal melden !

Schöne Grüße


Kame-hame-ha
Kame-hame-ha
Kame-hame-ha 17.04.2012 um 18:03:36 Uhr
Goto Top
Achso, was ich noch sagen wollte, das Script siehr so einfach aus...genial!
Kame-hame-ha
Kame-hame-ha 17.04.2012 um 18:32:21 Uhr
Goto Top
Geil! Funktioniert!

An der Zeile 13 lag's und an der Zeile 12 statt XMLDateien, muss "XMLOrdner" stehen also hier nochmal das Script:

TXTOrdner = "D:\TXT"  
XMLOrdner = "D:\XML"  
Alt = "<UserValue value=""n.d."" title=""test_result""></UserValue>"  

Set fso = CreateObject("Scripting.FileSystemObject")  

For Each TXT In fso.GetFolder(TXTOrdner).Files 'alle Textdateien durchgehen  
    TXTInhalt = TXT.OpenAsTextStream.ReadLine 'erste Zeile der Datei einlesen  
    Neu = Replace(Alt, "n.d.", TXTInhalt) 'gelesenen Wert in den Ersatz-String einbauen  
	MsgBox Neu
    TXTName = LCase(fso.GetBaseName(TXT.Name)) 'Dateinamen ohne Typ in Kleinbuchstaben erzeugen  
    LName = Len(TXTName) 'Länge des Namens nur einmal, daher vor der Schleife, ermitteln  
    For Each XML In fso.GetFolder(XMLOrdner).Files 'alle XML-Dateien durchgehen  
        If LCase(Left(XML.Name, LName)) = TXTName Then 'Wenn der Anfang des Dateinamens mit dem Namen der Textdatei übereinstimmt ...  
            XMLInhalt = XML.OpenAsTextStream.ReadAll '... Dateiinhalt auslesen und ...  
            fso.CreateTextFile(XML.Path).Write Replace(XMLInhalt, Alt, Neu) '... mit ersetztem Text neue Datei erzeugen  
            Exit For 'Fertig - übrige XML-Dateien interessieren nicht mehr  
        End If
    Next
Next

Danke nochmal vielmals! Super gelöst!
bastla
bastla 17.04.2012 um 19:13:53 Uhr
Goto Top
Hallo Kame-hame-ha!

Sorry - hab' das nur so auf die Schnelle hingeschrieben (Zeile 13 war mir dann aber wenigstens selbst noch aufgefallen) ...
Noch ein Tipp: Anstelle von
MsgBox Neu
kannst Du auch
WScript.Echo Neu
verwenden - Vorteil: Wenn Du aus einer CMD-Shell mit
cscript Script.vbs
testest, brauchst Du nicht jede Ausgbae mit OK zu bestätigen (und bei defaultmäßiger Ausführung über "wscript" wird trotzdem eine MsgBox verwendet) ...

Grüße
bastla