Hey, Scripting Guy!Spiele, Spiele, Spiele! Und auch etwas XML

Die Scripting Guys von Microsoft

Laden Sie den Code für diesen Artikel herunter: HeyScriptingGuy2008_02.exe (151KB)

Jedes Mal, wenn über die Legenden der Sportwelt gesprochen wird, werden unausweichlich dieselben Namen erwähnt: Babe Ruth. Pele. Muhammad Ali. Walter Payton. ScooterK und MrRat. Johnny –

Wirklich witzig, Sie ... ganz im Ernst? Sie wissen tatsächlich nicht, wer ScooterK und MrRat sind? Für diejenigen unter Ihnen, die offensichtlich bezüglich der Winter Scripting Games (15. Februar bis 3. März im TechNet Script Center, siehe microsoft.com/technet/scriptcenter/funzone/games) nicht auf dem Laufenden sind: ScooterK und MrRat sind wahre Legenden, Teilnehmer, die mindestens in einer Liga der Winter Scripting Games 2007 perfekte Bewertungen erzielt haben.

Das Coole daran ist: können Sie realistisch hoffen, eine Fußballlegende wie Pele zu werden? Wahrscheinlich nicht. Können Sie sich je erhoffen, der Boxweltmeister im Schwergewicht zu werden? Also, einige der Scripting Guys sind echte Schwergewichte, aber die Sache mit dem Boxweltmeister gestaltet sich dann doch etwas schwieriger. Aber Sie – ja, Sie – können durchaus der nächste ScooterK oder der nächste MrRat werden.

Hinweis: Theoretisch könnten Sie natürlich auch der nächste Babe Ruth werden. Dazu müssen Sie nur 24 Hotdogs zwischen zwei aufeinander folgenden Baseballspielen essen können.

Keine Sorge, wir erklären Ihnen, wie Sie der nächste ScooterK oder MrRat werden können (und vielleicht sogar der nächste Bizzy oder H2Data). Sie müssen nur im Script Center erscheinen und an den Scripting Games teilnehmen. Am 15. Februar veröffentlichen wir 10 verschiedene Ereignisse und fordern Sie heraus, sich an einigen oder allen dieser 10 Skriptingherausforderungen zu beteiligen. Schreiben Sie ein Skript, das das gestellte Problem löst, und senden Sie es per E-Mail an die Scripting Guys. (Umfassende Anweisungen finden Sie auf der Scripting Guys-Homepage.) Wir testen dann Ihr Skript und weisen Ihnen, wenn es funktioniert, Punkte zu. Auch Sie können eine Legende der Sportwelt werden, wenn Sie alle 10 Ereignisse erfolgreich abschließen. Oder zumindest der Skriptingsportwelt, was praktisch dasselbe ist.

Die Scripting Games (15. Februar bis 3. März) machen Spaß und sind eine Herausforderung. Das Beste daran ist: jeder kann mitmachen. Ist die Skripterstellung in der Systemverwaltung noch ziemlich neu für Sie? Dann nehmen Sie an der Liga für Anfänger teil. Es gibt separate Wettbewerbe für Anfänger in VBScript, Windows PowerShellTM und (neu in diesem Jahr) Perl. Finden Sie die Anfängerliga ein wenig zu einfach? Dann sollten Sie es in der Liga für Fortgeschrittene versuchen, in der ebenfalls Wettbewerbe in VBScript, Windows PowerShell und Perl angeboten werden.

Die Spiele (haben wir eigentlich schon erwähnt, dass sie vom 15. Februar bis 3. März stattfinden?) sind DAS Ereignis der Skriptingsaison, das Sie wirklich nicht verpassen sollten. Besuchen Sie die Script Center-Homepage noch heute, um Tipps und Tricks für das Training für diesen Wettbewerb zu erhalten, und dann wieder am 15. Februar, wenn die Spiele offiziell eröffnet werden.

15. Februar bis 3 März. Nur, falls Sie es noch nicht wissen.

Was meinen Sie? Wir stimmen Ihnen voll zu: einen neuen „Hey, Scripting Guy!“-Artikel zusätzlich zur Ankündigung der Scripting Games zu veröffentlichen, ist wahrscheinlich zu viel Aufregung für einen Monat. Doch damit die netten Menschen beim TechNet Magazin zufrieden sind (was natürlich unser Hauptziel im Leben ist), haben wir beschlossen, die Veröffentlichung eines neuen Artikels trotzdem zu riskieren.

Vor genau einem Jahr (ist das wirklich schon so lange her?) wurde in einem Artikel erläutert, wie Sie ein Skript zum Lesen einer XML-Datei verwenden können. Doch es wurde nicht erklärt, wie ein Skript zum Erstellen, Schreiben und Ändern einer XML-Datei eingesetzt werden kann. Das wird nun in diesem Monat nachgeholt. Sie würden gerne wissen, wie Sie ein Skript schreiben können, das eine XML-Datei erstellen kann? Sie müssen einfach fragen. Also gut – fragen und dann ein Jahr warten, bis wir dazu kommen, eine Antwort zu geben. Abbildung 1 zeigt das Skript. Zugegeben – es mag kompliziert aussehen, aber hier erfahren Sie, wie es funktioniert.

Figure 1 Erstellen einer XML-Datei

Set xmlDoc = _
  CreateObject("Microsoft.XMLDOM")  
  
Set objRoot = _
  xmlDoc.createElement("ITChecklist")  
xmlDoc.appendChild objRoot  

Set objRecord = _
  xmlDoc.createElement("ComputerAudit") 
objRoot.appendChild objRecord 
  
Set objName = _
  xmlDoc.createElement("ComputerName")  
objName.Text = "atl-ws-001"
objRecord.appendChild objName  

Set objDate = _
  xmlDoc.createElement("AuditDate")  
objDate.Text = Date  
objRecord.appendChild objDate  

Set objIntro = _
  xmlDoc.createProcessingInstruction _
  ("xml","version='1.0'")  
xmlDoc.insertBefore _
  objIntro,xmlDoc.childNodes(0)  

xmlDoc.Save "C:\Scripts\Audits.xml"  

Zunächst wird eine Instanz des Microsoft. XMLDOM-Objekts erstellt. Wie Sie wahrscheinlich bereits geraten haben, ist dies das Objekt, das Ihnen die Arbeit mit XML-Dateien ermöglicht. Ihr Ziel ist das Erstellen einer einfachen XML-Datei, die wie Abbildung 2 aussieht.

Abbildung 2 Das Ziel: eine einfache XML-Datei

Abbildung 2** Das Ziel: eine einfache XML-Datei **

Zum Erstellen dieser XML-Datei muss zuerst der Stammknoten (ITChecklist) erstellt werden. Wie das gemacht wird? So:

Set objRoot = _
  xmlDoc.createElement("ITChecklist")  
xmlDoc.appendChild objRoot  

Das war ziemlich leicht, nicht wahr? Sie mussten nur die createElement-Methode aufrufen und createElement den Namen übergeben, den der Stammknoten erhalten soll. Dann rufen Sie einfach die appendChild-Methode auf und übergeben den Objektverweis als einzigen Methodenparameter an das neue Element (objRoot). Jetzt liegt ein Stammknoten vor.

Das ist aber noch nicht alles. Als Nächstes erstellen Sie den ComputerAudit-Knoten, einen untergeordneten Knoten des ITChecklist-Knotens, der die Informationen für einen einzelnen Computer darstellt. Wie Sie sehen, ähnelt der Code zum Erstellen dieses Knotens dem Code, der zum Erstellen des Stammknotens verwendet wurde:

Set objRecord = _
  xmlDoc.createElement("ComputerAudit") 
objRoot.appendChild objRecord 

Der einzige Unterschied: beim Erstellen des Stammknotens wurde appendChild im XML-Dokument selbst aufgerufen. (Beachten Sie den Objektverweis xmlDoc.) Um dem Stamm einen neuen, untergeordneten Knoten hinzuzufügen, wird appendChild im Stammknoten (objRoot) anstelle im XML-Dokument aufgerufen. So einfach ist das.

Genauso einfach ist es, den ComputerName- und den AuditDate-Knoten als untergeordnete Knoten von ComputerAudit hinzuzufügen. Dazu wird ein ähnlicher Prozess durchgeführt: Rufen Sie createElement auf, um einen neuen Knoten zu erstellen, und appendChild, um diesen neuen Knoten an die Datei anzufügen.

(Schnelle Quizfrage: Wo wird appendChild dieses Mal aufgerufen? Richtig: in objRecord, dem übergeordneten Knoten (ComputerAudit), der gerade erst erstellt wurde.)

Da der ComputerName- und der AuditDate-Knoten aber Werte enthalten müssen, muss unbedingt auch ein Wert für die Text-Eigenschaft für beide Knoten angegeben werden, bevor sie dem Dokument hinzugefügt werden.

Klarer wird dies, wenn Sie sich den Code ansehen, der den ComputerName-Knoten eigentlich erstellt:

Set objName = _
  xmlDoc.createElement("ComputerName")  
objName.Text = "atl-ws-001"
objRecord.appendChild objName  

Wie zu erwarten, ist der Code zum Erstellen von AuditDate fast identisch. Sie müssen beim Aufrufen von createElement lediglich einen anderen Knotennamen angeben und der Text-Eigenschaft einen anderen Wert zuweisen.

Eigentlich machen wir es den Leuten viel zu einfach, finden Sie nicht?

Nach Erstellen der Knoten für den ersten (und in diesem Fall einzigen) Datensatz wird dieser nette kleine Codeblock ausgeführt:

Set objIntro = _
 xmlDoc.createProcessingInstruction _
  ("xml","version='1.0'")  
xmlDoc.insertBefore _
  objIntro,xmlDoc.childNodes(0)  

Damit wird einfach das <?xml version="1.0" ?>-Tag am Anfang der Datei eingefügt, was sicherstellt, dass ein gut strukturiertes XML-Dokument vorliegt.

An dieser Stelle müssen Sie nur noch die Save-Methode aufrufen und die neue Datei als C:\Scripts\Audits.xml speichern:

xmlDoc.Save "C:\Scripts\Audits.xml"  

Jetzt liegt Ihnen ein ganz neues XML-Dokument vor.

Das ist wirklich ungemein nützlich: Sie wissen jetzt, wie eine völlig neue XML-Datei mithilfe eines Skripts erstellt wird. Natürlich werden Sie in den meisten Fällen wahrscheinlich keine ganz neue XML-Datei erstellen müssen. Stattdessen fügen Sie einfach neue Daten an eine vorhandene Datei an. Führen die Scripting Guys nun wohl vor, wie das gemacht wird?

Zuerst hatten wir beschlossen, dass die Antwort auf diese Frage nein lautet und wir einfach nicht vorführen würden, wie Daten an eine vorhandene XML-Datei angefügt werden. Doch da wir wirklich nette und selbstlose Menschen sind, beschlossen wir, mit den Lesern des TechNet Magazins eine Abmachung zu treffen: wenn alle Leser des Magazins bereit sind, an den Scripting Games 2008 teilzunehmen, zeigen wir Ihnen, wie ein Skript zum Anhängen von Daten an eine XML-Datei verwendet wird. Also – sind Sie alle bereit, an den Scripting Games teilzunehmen?

Hallo! Wir warten auf Ihre Antwort. Ja, Sie – der Typ in Rochester, MN.

Na also, das ist schon besser. Sie können es uns wirklich glauben: Bei den Scripting Games werden Sie jede Menge Spaß haben, denn da kommen alle auf ihre Kosten. Das versprechen wir Ihnen.

Also, abgemacht ist abgemacht, und jetzt zeigen wir Ihnen ein Skript, mit dem Daten an eine vorhandene XML-Datei angefügt werden können. Sehen Sie sich Abbildung 3 an.

Figure 3 Hinzufügungen an eine XML-Datei

Set xmlDoc = _
  CreateObject("Microsoft.XMLDOM")

xmlDoc.Async = "False"
xmlDoc.Load("C:\Scripts\Audits.xml")

Set objRoot = xmlDoc.documentElement
  
Set objRecord = _
  xmlDoc.createElement("ComputerAudit")
objRoot.appendChild objRecord

Set objFieldValue = _
  xmlDoc.createElement("ComputerName")
objFieldValue.Text = "atl-ws-100"
objRecord.appendChild objFieldValue

Set objFieldValue = _
  xmlDoc.createElement("AuditDate")
objFieldValue.Text = Date
objRecord.appendChild objFieldValue
  
xmlDoc.Save "C:\Scripts\Audits.xml"  

Sie unterscheidet sich nicht allzu sehr von dem Skript, mit dem die XML-Datei erstellt wurde. Erstellen Sie zunächst eine Instanz des Microsoft.XMLDOM-Objekts, und setzen Sie die Async-Eigenschaft dann auf „False“, wodurch dem Skript mitgeteilt wird, dass das Dokument synchron statt asynchron geladen werden soll. Welchen Unterschied macht das? Nun, wenn das Dokument asynchron geladen würde, könnte das Skript fortfahren, obwohl das Dokument nicht vollständig geladen wurde. Es würde schnell Probleme verursachen, wenn Sie versuchen, eine Aufgabe an einem Dokument durchzuführen, das noch nicht existiert. Indem gewährleistet wird, dass die XML-Datei synchron geladen wird, wird ebenfalls sichergestellt, dass die Datei vollständig geladen ist, bevor das Skript fortfährt.

Apropos vollständig geladen ... aber lassen wir das lieber. Stattdessen rufen Sie die Load-Methode auf, um die Datei C:\Scripts\Audits.xml zu öffnen. Sobald die Datei geöffnet ist, verwenden Sie diese Codezeile zum Erstellen einer Instanz der documentElement-Klasse, wodurch im Endeffekt eine Anbindung an den Dokumentstamm erfolgt. In diesem Fall ist das natürlich der ITChecklist-Knoten:

Set objRoot = xmlDoc.documentElement

Jetzt bleibt nicht mehr viel zu tun. Erstellen Sie eine neue Instanz des ComputerAudit-Knotens, indem Sie die appendChild-Methode zum Hinzufügen dieses neuen Knotens zur Datei verwenden. Dann erstellen Sie neue Instanzen des ComputerName- und des AuditDate-Knotens und geben die entsprechenden Werte (atl-ws-100 beziehungsweise das aktuelle Datum) für jeden neuen Knoten an. Stellen Sie diese beiden Elemente in den neuen, gerade erstellten ComputerAudit-Knoten, und rufen Sie die Save-Methode zum Speichern der Datei auf. Wir konnten danach erfreulicherweise bereits an den Skripts für die bevorstehenden Scripting Games weiterarbeiten.

Die finden, falls wir es noch nicht erwähnt haben, vom 15. Februar bis zum 3. März im TechNet Script Center statt.

So weit so gut. Sie können eine neue XML-Datei erstellen, und Sie können dieser Datei neue Datensätze hinzufügen. Das ist schon ziemlich gut, aber es gibt noch mehr zu tun. Wie werden beispielsweise vorhandene Datensätze in der Datei geändert? Abbildung 4 zeigt zumindest eine Möglichkeit dazu.

Figure 4 Ändern der XML-Datei

Set xmlDoc = _
  CreateObject("Microsoft.XMLDOM")

xmlDoc.Async = "False"
xmlDoc.Load("C:\Scripts\Audits.xml")

Set colNodes=xmlDoc.selectNodes _
  ("/ITChecklist/ComputerAudit " & _
   "[ComputerName = 'atl-ws-100']/AuditDate")

For Each objNode in colNodes
   objNode.Text = Date
Next
  
xmlDoc.Save "C:\Scripts\Audits.xml"  

Der wichtige Teil dieses Skripts läuft ab, wenn die selectNodes-Methode aufgerufen wird, eine Methode, die bestimmt, welche Datensätze von der Abfrage zurückgegeben werden. Wie Sie sehen können, wurden beim Aufrufen von selectNodes sorgfältig zwei Kriterien angegeben: es sind nur Datensätze erwünscht, bei denen das ComputerName-Attribut atl-ws-100 entspricht, und es soll nur das AuditDate-Attribut zurückgegeben werden.

Hinweis: Sie meinen, das funktioniert nicht? Sehen Sie sich unseren ersten Artikel zur Arbeit mit XML-Dateien an (technetmagazine.com/issues/2007/02/HeyScriptingGuy). Dort wird die selectNodes-Abfragesyntax näher erklärt.

Wie es gewöhnlich der Fall ist, gibt selectNodes eine Sammlung aller XML-Datensätze zurück, die die angegebenen Kriterien erfüllen. Das wiederum bedeutet, dass der Wert des AuditDate-Attributs (des einzigen Attributs, nach dem gefragt wurde) aktualisiert werden kann, indem Sie einfach eine „For Each“-Schleife einrichten, die alle Elemente in der Sammlung durchläuft, und AuditDate dann in dieser Schleife einen neuen Wert zuweisen:

For Each objNode in colNodes
   objNode.Text = Date
Next

Was meinen Sie? Sie fragen sich, ob mehr als ein Attribut auf einmal geändert werden kann? Ja, das ist möglich. Aber leider nicht heute. Das ist ein Thema, das in einem zukünftigen Artikel behandelt werden muss.

Sie sagen, dass Sie noch eine Frage haben: Wie könnten Sie das Überwachungsdatum für alle Computer in der Datei aktualisieren? Das ist leicht. Sie verwenden dazu das Skript in Abbildung 5.

Figure 5 Ändern des Überwachungsdatums

Set xmlDoc = _
  CreateObject("Microsoft.XMLDOM")

xmlDoc.Async = "False"
xmlDoc.Load("C:\Scripts\Audits.xml")

Set colNodes=xmlDoc.selectNodes _
  ("/ITChecklist/ComputerAudit/AuditDate")

For Each objNode in colNodes
   objNode.Text = Date
Next
  
xmlDoc.Save "C:\Scripts\Audits.xml"

Der einzige Unterschied zwischen diesem Skript und dem vorherigen Skript, das zum Ändern der XML-Datei verwendet wurde? Bei diesem Skript wurde nicht angegeben, dass nur die Datensätze angezeigt werden sollten, bei denen ComputerName gleich atl-ws-100 war. Durch Auslassen dieses Kriteriums erhalten Sie standardmäßig alle Datensätze.

Zum Schluss soll noch ein Skript näher betrachtet werden. Angenommen, unser alter Freund atl-ws-100 hat zum letzten Mal Solitär gespielt und befindet sich nun im großen Computerfriedhof im Himmel.

Theologischer Hinweis: Wo enden Computer, wenn sie sterben? Wie sich gezeigt hat, landen sie gewöhnlich bei einem der Scripting Guys. Der Scripting Guy, der diesen Artikel schreibt, erhielt beispielsweise einmal einen Laptop mit dem Hinweis: „Dafür, dass Du so viel für Microsoft tust, solltest Du wirklich einen Laptop haben.“ Der einzige Nachteil dieses großzügigen Angebots? Der Computer war kaputt und ließ sich nicht einschalten. Was wahrscheinlich gut so war. Wie sich nämlich herausstellte, hatte er auch keine Festplatte.

Um den großen Siliziumlebenskreis zu schließen, müssen Sie atl-ws-100 aus der XML-Datei löschen. Wie gehen Sie dabei vor? Sehen Sie sich Abbildung 6 an.

Figure 6 Löschen aus der XML-Datei

Set xmlDoc = _
  CreateObject("Microsoft.XMLDOM")

xmlDoc.Async = "False"
xmlDoc.Load("C:\Scripts\Audits.xml")

Set colNodes=xmlDoc.selectNodes _
  ("/ITChecklist/ComputerAudit " & _
   "[ComputerName = 'atl-ws-100']")

For Each objNode in colNodes
  xmlDoc.documentElement.removeChild _
    (objNode)
Next
  
xmlDoc.Save "C:\Scripts\Audits.xml"  

Sie werden bemerken, dass sie dem vorherigen Skript ähnelt, mit dem die AuditDate-Eigenschaft geändert wurde. Es gibt eigentlich nur zwei Unterschiede. Zum einen wurden in der selectNodes-Abfrage keine Eigenschaftswerte angegeben, denn dann würde der ganze XML-Datensatz für atl-ws-100 zurückgegeben:

Set colNodes=xmlDoc.selectNodes _
  ("/ITChecklist/ComputerAudit " & _
   "[ComputerName = 'atl-ws-100']")

Außerdem rufen Sie in der „For Each“-Schleife einfach die removeChild-Methode auf, um alle Datensätze zu löschen, bei denen ComputerName gleich atl-ws-100 ist:

xmlDoc.documentElement.removeChild _
  (objNode)

Das ist schon alles. Lebe wohl, atl-ws-100. Wir hatten kaum Zeit, Dich kennenzulernen.

OK, liest irgendein TechNet Magazin-Redakteur noch den Artikel dieses Monats? Sie sagen, dass alle damit beschäftigt sind, das monatliche Skriptingpuzzle zu lösen? Hervorragend. Jetzt, da uns niemand über die Schulter schaut, können wir Ihnen Folgendes verraten: Lassen Sie alles stehen und liegen (auch wenn Sie gerade dieses Magazin lesen), und begeben Sie sich ins Script Center, um sich auf die Scripting Games vorzubereiten. Schließlich wird es das TechNet Magazin noch lange geben. Doch die Scripting Games finden nur einmal im Jahr und zudem nur für begrenzte Zeit statt (speziell vom 15. Februar bis zum 3. März, nur damit Sie es wissen). Verpassen Sie sie nicht!

Hinweis: Jetzt, da Sie es erwähnen ... Wir haben gewartet, bis Sie den ganzen Artikel gelesen haben, bevor wir Sie aufgefordert haben, das TechNet Magazin wegzulegen. Wie das wohl passiert ist ...

Der Scripting Perplexer von Dr. Scripto

Die monatliche Herausforderung, die nicht nur Ihre Fähigkeiten beim Lösen von Rätseln, sondern auch bei der Skripterstellung testet.

Februar 2008: Geheimnisvolle Symbole

Auf der Computertastatur befinden sich alle möglichen verrückten Zeichen. Noch verrückter ist die Tatsache, dass die meisten dieser Zeichen eine bestimmte Verwendung in den Skriptsprachen VBScript oder Windows PowerShell haben. Finden Sie heraus, ob Sie jedes Symbol seiner Verwendung in Skripts zuordnen können. Beim ersten ist dies bereits geschehen.

ANSWER:

Der Scripting Perplexer von Dr. Scripto

Antwort: Geheimnisvolle Symbole, Februar 2008

  

Die Scripting Guys von Microsoft arbeiten für Microsoft (oder sind zumindest dort angestellt). Wenn sie nicht gerade ihrem Hobby, dem Baseball (oder verschiedenen anderen Aktivitäten) nachgehen, betreiben sie das TechNet Skript Center. Besuchen Sie es unter www.scriptingguys.com.

© 2008 Microsoft Corporation und CMP Media, LLC. Alle Rechte vorbehalten. Die nicht genehmigte teilweise oder vollständige Vervielfältigung ist nicht zulässig.