XML Datei überprüfen, ob Knoten schon vorhanden, wenn nicht erstellen

  • VBScript

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von dieserDings.

    XML Datei überprüfen, ob Knoten schon vorhanden, wenn nicht erstellen

    Hallo,

    ich stehe vor folgender Aufgabe:
    Ich schreibe ein Script welches den Festplattenspeicher eines Servers ausliest und auch den noch freien Speicher. Das ganze wird in eine XML Datei gepackt. Hinbekommen habe ich bisher das, vorrausgesetzt ich habe die Server und deren Festplatten schon in die XML Dateigeschrieben, die Daten beim ausführen des Scripts aktualisiert werden. Jetzt möchte ich das ganze etwas generischer gestalten, da es ja sein kann das ein neuer Server, oder eine neue Festplatte(Partition) hinzukommt. Ich scheitere an der Abfrage, ob ein neuer Server oder Partition hinzugekommen ist. Wie stelle ich das am besten an?

    Etwas Code:

    XML-Quellcode

    1. <?xml version="1.0"?>
    2. <ALLESERVER>
    3. <SERVER name="SERVER01">
    4. <FESTPLATTE id="1" disk="C:">
    5. <SPEICHER>450,6 GB</SPEICHER>
    6. <FREIERSPEICHER>358,0 GB</FREIERSPEICHER>
    7. </FESTPLATTE>
    8. <FESTPLATTE id="2" disk="D:">
    9. <SPEICHER>13,7 GB</SPEICHER>
    10. <FREIERSPEICHER>3,4 GB</FREIERSPEICHER>
    11. </FESTPLATTE>
    12. </SERVER>
    13. </ALLESERVER>


    Visual Basic-Quellcode

    1. on Error Resume Next
    2. Dim xmlDoc, nNode, objNodeList, plot
    3. dim serverNodeItem
    4. dim diskNodeItem
    5. dim diskID
    6. y = 1
    7. id = 1
    8. set objNetwork = CreateObject("WScript.Network") ' Den Servernamen holen
    9. strComputerName = objNetwork.Computername
    10. Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!" & strComputerName)
    11. Set colDiskSettings = objWMIService.ExecQuery("Select * from Win32_LogicalDisk Where DriveType=3") ' Festplattendaten
    12. Set xmlDOc = CreateObject("Microsoft.XMLDOM")
    13. xmlDoc.setProperty "SelectionLanguage", "XPath"
    14. xmlDoc.load "Pfad zur XML\server.xml" ' XML-Datei mit Infos zu allen Servern
    15. If Err.Number = 0 Then
    16. Set nNode = xmlDoc.selectsinglenode("//SERVER") ' Servernamen in die XML-Datei eintragen
    17. Set nameAttribute = xmlDoc.createAttribute("name")
    18. nameAttribute.Value = strComputerName
    19. nNode.attributes.setNamedItem(nameAttribute)
    20. For Each objDisk In colDiskSettings
    21. strDiskDeviceID = objDisk.DeviceID
    22. strDiskSize = FormatNumber((objDisk.Size / (1024 * 1024 * 1024)),1,0,0,0) ' Speicher in GB anzeigen und zwei Kommastellen
    23. strDiskFreeSpace = FormatNumber((objDisk.FreeSpace / (1024 * 1024 * 1024)),1,0,0,0) ' Freien Speicher in GB anzeigen und zwei Kommastellen
    24. If y = id Then ' Festplatten Informationen in der XML-Datei aktualisieren
    25. Set nNode = xmlDoc.selectsinglenode("//FESTPLATTE[@id='"& id &"']") ' Festplatte in disk Attribut eintragen
    26. Set nameAttribute = xmlDoc.createAttribute("disk")
    27. nameAttribute.Value = strDiskDeviceID
    28. nNode.attributes.setNamedItem(nameAttribute)
    29. Set nNode = xmlDoc.selectsinglenode("//FESTPLATTE[@id='"& id &"']/SPEICHER")
    30. nNode.text = strDiskSize & " GB"
    31. Set nNode = xmlDoc.selectsinglenode("//FESTPLATTE[@id='"& id &"']/FREIERSPEICHER")
    32. nNode.text = strDiskFreeSpace & " GB"
    33. End If
    34. id = id + 1
    35. y = y + 1
    36. Next
    37. Else
    38. Err.clear
    39. End If
    40. strResult = xmldoc.save("Pfad zur XML\server.xml") ' Aktualisierte XML-Datei speichern



    Bei meinem derzeitigen Script müsste ich, wenn ein neuer Server, oder eine neue Festplatte hinzukommt, diesen erstmal in die XML Datei eintragen.

    Vielen Dank schonmal im Vorraus!

    Gruß

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „dieserDings“ ()

    Wenn die DeviceID (Seriennummer?) eindeutig ist, würde ich eher diese speichern. So erkennt man auch den Austausch eines Datenträgers.

    Für den Fall, dass eine ausgebaut wurde, müssen eh irgendwie die IDs geprüft oder mindestens vorher die Gesamtzahl ausgelesen und hinterher mit dem "IST" abgeglichen werden.

    Das mit dem "y" und "id" habe ich jetzt noch nicht so richtig verstanden. Beide starten bei 1 und beide werden zusammen erhöht um dann auf Gleichheit geprüft zu werden.?. Oder habe ich da was übersehen?
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    @Edit:
    Also, ich habe folgendes geändert: Wenn das Script ausgeführt wird, wird ein Kompletter Server Knoten mit all seinen Festplatten in die XML eingefügt. Natürlich passiert das bei jedem ausführen. Was mir jetzt als letzten entscheidenden Schritt fehlt ist, wie ich eine If Abfrage gestalten kann die guckt ob es den Knoten mit dem Namen schon gibt und falls ja nur die aktualisierungs Routine durchführt. Hat da Jemand einen Lösungsvorschlag? Mit .HasAttribute("name") funktioniert es nicht. Auch andere Lösungen aus dem Internet brachten bisher keinen Erfolg...

    Gruß

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „dieserDings“ ()