gelöst VBS - Blöcke in Array zusammenfassen - Dopplungen löschen

Mitglied: worker0815

worker0815 (Level 1)

26.02.2020 um 12:05 Uhr, 335 Aufrufe, 3 Kommentare

Hallo,

ich brauche bitte mal etwas Hilfestellung.
Ausgangslage - eine XML-Datei vom Tool WinAuthenticator.

Max Mustermann und Mira Musterfrau nutzen das Tool über eine zentrale XML-Datei. (das als Beispiel, die Personenanzahl in Real ist größer)
Die XML-Datei ist quasi bis zum Feierabend im Zugriff.

Karl Musterkind öffnet das Tool, legt sich neu an, und erzeugt damit einen neuen Block in der XML-Datei.
Er schließt das Tool. Die XML-Datei enthält seinen Block.

Schließen nun Max Mustermann oder Mira Musterfrau nach ihm das Tool, wird deren aktueller Stand in die XML-Datei zurück und damit überschrieben.
Karl Musterkind verschwindet.


1. Um dem Herr zu werden, soll alle 5 Minuten ein Skript über die XML-Datei laufen.
2. Alle Blöcke der Personen auslesen und in eine Masterdatei übergeben und dies fortlaufend schreiben.
Man erhält also in Folge nach mehrfacher Ausführung mehrere Blöcke mit doppelten Namensinhalt:
Max Mustermann, Mira Musterfrau, Max Mustermann, Mira Musterfrau, Karl Musterkind, Max Mustermann, Mira Musterfrau, Max Mustermann, Mira Musterfrau, Karl Musterkind
Insofern in Ordnung, da es mitunter sein kann, dass sich ein Person erneut hinzufügt und neue Schlüsselwerte erhält. Selbst löschen kann sie sich nicht.
Von daher wäre der aktuelle Created-Lastuser Zeitstempel wichtig.
3. Die Masterdatei wird gefiltert nach doppelten Blöcken nach Name. Der ältere Block soll gelöscht werden. (da benötige ich Hilfe)

Ich hoffe das war soweit verständlich.

Punkt 1 - mache ich per Aufgabenplanung


Ausgangs-XML:

Mit diesem Skript erledige ich Punkt 2:



Erhalte ich nun folgendes Ergebnis:


Wenn ich das Skript mehrfach ausgebe sieht das beispielsweise wie folgt aus:
(Max, Mira, Max, Mira und Karl ist nun auch dabei)


---
Nun muss noch Punkt 3 durchgeführt werden. Dabei benötige ich Unterstützung.
Die Doppelten Blöcke nach Namen erfassen und die ältesten löschen, so dass pro Person nur noch einer zurückbleibt.
Pro Block ein Array?
---
Das in eine Textdatei als Master.

Die Inhalte mit Kopf Master und Fußzeile würde ich dann Nachts zusammenfügen, so dass diese morgens als Ausgangs-XML den Personen zur Verfügung steht.

Vielen Dank für eure Hilfe!
Mitglied: 143127
26.02.2020, aktualisiert um 14:17 Uhr
Anmerkungen dazu.
  • 1. XML Dateien bearbeitet man nicht als reinen Text sondern lässt sie durch einen Parser laufen und erstellt daraus ein Objekt um ungültigen Markup zu vermeiden. Dafür gibt es in VBS/VBA das Objekt "MSXML2.DomDocument" mit dem man die XML Struktur durchlaufen und Knoten und Attribute als Ganzes auswählen kann. Man siehe https://analystcave.com/vba-xml-working-xml-files/
  • 2. Würde ich bei parallelem Zugriff auf eine Datenbank-Speicherung mit Transaktionen / Locks ausweichen.
Mitglied: worker0815
27.02.2020 um 16:28 Uhr
Vielen Dank für die Unterstützung bzw. Anmerkung.
Ich habe es nun anders gelöst. Mit PowerShell:

Aufgabe 1:
#Alle 5 Minuten (06:00 - 21:00)

Damit werden mir alle Blöcke mit eigenen Namen in das Verzeichnis Pfad\Benutzer abgelegt.
Zusätzlich habe ich 2 Textdateien mit Kopf- und Fußzeile, vor und nach den Blöcken.

Aufgabe 1:
#Alle 5 Minuten (21:00)

Damit füge ich Kopfzeile, alle Blöcke der Benutzer und die Fußzeile wieder zu einer Datei zusammen und habe meinen Master.

Das reicht mir.
Mitglied: 143127
27.02.2020, aktualisiert um 17:20 Uhr
Ich habe es nun anders gelöst. Mit PowerShell:
Naja hätte man auch gleich erwähnen können das man schon mal mit der PS mal hantiert hat, dann hätten wir hier nicht mit dem alten VBS rumschnüffeln müssen .
Noch ein Hinweis zu der Zeile
$xml = [xml](Get-Content -Path "\\localhost\APPS\Pfad\grpauth.xml")
Man sollte die XML besser so laden
Da ansonsten mit Get-Content nicht sichergestellt ist das das Encoding aus der XML korrekt verwendet wird sondern das Console Encoding bzw. das Encoding was Get-Content meint erkennen zu wollen! Wenn man das mit Get-Content lädt sollte man auch das Encoding entsprechend mit angeben.
Die Load-Methode dagegen berücksichtigt das Encoding das in der XML Declaration steht schon automatisch.
Titel: VBS - Blöcke in Array zusammenfassen - Dopplungen löschen
Content-ID: 551803
Art des Inhalts: Frage
Ausgedruckt am: 29.05.2020 um 03:03:58 Uhr
URL: https://administrator.de/contentid/551803