rdklieli
Goto Top

Mit Vbs eine Stelle einer Datei auslesen und in ein anderes File einfügen

Hallo zusammen

Da ich wirklich sehr schwach bin in vbs -scripting, bzw. gar nichts kann, wende ich mich nun an euch.

So das Ziel ist eigentlich, eine Zeile aus einem .xml dokument, in ein anderes zu kopieren.
hört sich vllt einfach an aber:

Ich möchte gerne das via script der dateiname angegeben werden kann (ohne .xml zu schrieben), danach wird aus dieser .xml datei die Zeile, startend mit "<Device" und endend mit "/>" (ohne " " ...) in eine Datei kopiert , bzw nach einem "/>" in der Datei mit absatz geschrieben wird.

Weiss einer von euch weiter?


wäre sehr nett

Liebe Grüsse

edit: das kopierte sollte ebenfalls in ein XML File kopiert werden, dessen name aber konstant ist.

Content-Key: 113400

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

Printed on: April 19, 2024 at 19:04 o'clock

Member: bastla
bastla Apr 07, 2009 at 12:43:26 (UTC)
Goto Top
Hallo rdklieli und willkommen im Forum!

die Zeile, startend mit "<Device" und endend mit "/>"
Es gibt genau eine Zeile, für welche diese Voraussetzungen zutreffen?

in eine Datei kopiert , bzw nach einem "/>" in der Datei mit absatz geschrieben
Könntest Du kurz mit einem "Vorher"-"Nachher"-Vergleich der letzten paar Zeilen der Zieldatei (vorzugsweise in passender - "plain" bietet sich an) demonstrieren, wie das Ergebnis genau aussehen soll?

Grüße
bastla
Member: rdklieli
rdklieli Apr 07, 2009 at 12:58:13 (UTC)
Goto Top
Hallo bastla ..

natürlich, mach ich gerne.

Wichtig ist noch zu sagen: es können auch mehrer Zeilen sein die mit "<Device" beginnen und "/>" enden.
So sieht die Datei aus:

1:
 <?xml version="1.0"?>
<NetworkInfo version="X">
	<Computer Name="local" Username="User" Status="Not Protected">
		**<Device** text texttext" **/>**
	</Computer>
</NetworkInfo>

 

Nun sollte aus die Zeile Kopiert werden.. Start und ende sind fett. (Mit sternen markiert face-smile )

Merke: es können auch mehrere Zeilen vorkommen und müssen auch kopiert werden.

Dies wird dann in ein gleiches Dokument eingefügt, welches gleich aussieht, einfach mehr "<Device" zeilen drinn hat:

 <?xml version="1.0"?>
<NetworkInfo version="X">
	<Computer Name="local" Username="User" Status="Not Protected">
		<Device text texttext" />
                <Device text texttext" />
               <Device text texttext" **/>**
	</Computer>
</NetworkInfo>

 

Fett: wichtig das hier nach dem "/>" ein absatz für die neue, einzutragende Zeile kommt.

liebe Grüsse
Member: bastla
bastla Apr 07, 2009 at 13:13:17 (UTC)
Goto Top
Zusatzfrage: Belegt jeder "<Device"-Eintrag nur eine Zeile (also bis zum Zeilenende CR/LF)?

Grüße
bastla
Member: rdklieli
rdklieli Apr 07, 2009 at 13:15:51 (UTC)
Goto Top
hallo

Ja, es wird jeweils nur eine Zeile beanspruch,. bis zum Zeilenende jedoch nicht.

Gruss
Member: bastla
bastla Apr 07, 2009 at 13:47:44 (UTC)
Goto Top
Hallo rdklieli!

Unter der Annahme, dass die Zeilen in der Zieldatei vor der Zeile
</Computer>
eingefügt werden sollen, etwa so:
Basis = "D:\XML_Files"  
Beginn = "<Device"  
Ende = "/>"  

Ziel = "D:\Sammel.xml"  
VorZeile = "</Computer>"  

Set fso = CreateObject("Scripting.FileSystemObject")  
Datei = InputBox("Bitte den Dateinamen (ohne .xml) eingeben!", "Dateiname")  

Do While Right(Basis, 1) = "\" And Len(Basis) > 1  
    Basis = Left(Basis, Len(Basis) - 1)
Loop
Pfad = Basis & "\" & Datei & ".xml"  

If Not fso.FileExists(Pfad) Then
    WScript.Echo "Die Datei " & Pfad & " konnte nicht gefunden werden!"  
    WScript.Quit 1
End If

LBeginn = Len(Beginn)
Ausgabe = ""  
Zeilen = Split(fso.OpenTextFile(Pfad).ReadAll, vbCrLF)
For Each Zeile In Zeilen
    Von = InStr(Zeile, Beginn)
    Bis = InStr(Zeile, Ende)
    If Von * Bis > 0 And Bis - Von > LBeginn Then
        Ausgabe = Ausgabe & vbTab & vbTab & Mid(Zeile, Von, Bis - Von + 2) & vbCrLF
    End If
Next

T = Split(fso.OpenTextFile(Ziel).ReadAll, vbCrLF)

For i = 0 To UBound(T)
    If InStr(T(i), VorZeile) > 0 Then
        If i > 0 Then
            Set Z = fso.CreateTextFile(Ziel)
            For j = 0 To i - 1
                Z.WriteLine T(j)
            Next
            Z.Write Ausgabe
            For j = i To UBound(T)
                Z.WriteLine T(j)
            Next
            Z.Close
            Exit For
        End If
    End If
Next
Wie die Angabe der Quelldatei erfolgen soll, konnte ich aus Deiner Beschreibung nicht ganz genau herauslesen - daher in dieser Version als Kombination von vorgegebenem Basis-Pfad und Eingabe nur des Dateinamens ...

Die Zieldatei wird (ohne Erstellung einer Sicherungskopie) um die gefundenen Zeilen ergänzt (wobei vor jeder dieser Zeilen 2 TAB eingefügt sind - siehe Zeile 28).

Grüße
bastla
Member: rdklieli
rdklieli Apr 07, 2009 at 14:17:40 (UTC)
Goto Top
Hallo

Erstmal herzlichen dank für die Mühe!
Jedoch funktionierts nicht.. das Einlesen und die Dateiangabe (Pfade wurden angepasst!) funktioniert soweit, jedoch ändert sich nichts an der "ziel" datei.
Berechtigung hab ich genug, mach dis als domänenadministrator... Leider kann ich nicht weiter hilfreich sein da ich keine ahnung davon habe.

Gruss
Member: bastla
bastla Apr 07, 2009 at 15:15:12 (UTC)
Goto Top
Hallo rdklieli!

Vorweg: Mit Deinen beiden Testdateien klappt das bei mir ...
Es könnte an der Zeile 6 liegen - wenn in der Zieldatei die Schreibweise (auch Groß-/Kleinschreibung) nicht exakt übereinstimmt, wird aus Sicherheitsgründen auch nichts verändert.

Das Auslesen kannst Du durch Einfügen von
WScript.Echo Ausgabe
als Zeile 31 prüfen - es sollten alle gefundenen Zeilen (durch die 2 TAB eingerückt) ausgegeben werden.

Grüße
bastla
Member: rdklieli
rdklieli Apr 07, 2009 at 15:22:23 (UTC)
Goto Top
Hallo bastla!

Mit dem einfügen von WScript.Echo Ausgabe kommt immer ein leeres WSH Fenster.
Auch habe ich Gross/Kleinschreibung, 2 Tab eingerückt angeschaut und keine Fehler gefunden..

Gruss
Member: bastla
bastla Apr 07, 2009 at 16:51:02 (UTC)
Goto Top
Hallo rdklieli!

Könnten Deine Dateien im Unicode-Format vorliegen?

Falls dem so wäre, müsstest Du die Zeilen 23, 32 und 37 wie folgt abändern:
Zeilen = Split(fso.OpenTextFile(Pfad,1,True,True).ReadAll, vbCrLF)

T = Split(fso.OpenTextFile(Ziel,1,True,True).ReadAll, vbCrLF)

Set Z = fso.CreateTextFile(Ziel,True,True)
Ansonsten könntest Du noch
WScript.Echo Von,Bis,Zeile
zwischen den Zeilen 26 und 27 einfügen und das Script von der Kommandozeile ("Start / Ausführen / CMD") durch die Eingabe
cscript //nologo "D:\DasScript.vbs"
starten. Das Ergebnis sieht bei Deinen geposteten Testdaten (die Sterne habe ich entfernt, obwohl es damit auch ginge) so aus:
0 0 <?xml version="1.0"?>
0 0 <NetworkInfo version="X">
0 0     <Computer Name="local" Username="User" Status="Not Protected">
3 26            <Device text texttext" />
0 0     </Computer>
0 0 </NetworkInfo>
An der Zeile
3 26            <Device text texttext" />
ist zu erkennen, dass der erste Suchbegriff an Position 3 (davor sind nur 2 TAB) beginnt und der zweite Suchbegriff ("/>") an Position 26 zu finden ist. Nur wenn beide in einer Zeile enthalten sind (und "/>" hinter "<Device" liegt), wird diese Zeile verarbeitet.

Grüße
bastla
Member: rdklieli
rdklieli Apr 08, 2009 at 06:20:28 (UTC)
Goto Top
Hallo Bastla!

Es lag wohl wirklich am Unicode Format! es funktioniert nun bestens! Dankeschön!!

Liebe Grüsse