Alle Artikel in: Codeschnipsel

Windows-Server-Befehle aus der Nähe betrachtet: wmic

Unser Autor, der Windows-Experte, Consultant und IT-Architekt Helge Klein erläutert in loser Folge interessante Windows-Server-Befehle. Heute: wmic. Windows enthält mit WMI seit vielen Versionen eine Art interne Datenbank, die äußerst detaillierte Informationen über das jeweilige System speichert. Unglücklicherweise ist WMI nicht ganz zu Unrecht als komplex verschrien. Nicht zuletzt mangelt es an einer grafischen Oberfläche, um einfach durch den Wust an Daten navigieren zu können. Trotz dieser Mankos lohnt die Beschäftigung mit WMI, da es oft keine (einfache) andere Möglichkeit gibt, an benötigte Informationen heranzukommen. Ein schönes Beispiel dafür liefert einer meiner Blog-Artikel, in dem verschiedene Möglichkeiten gezeigt werden, das Datum einer Windows-Installation zu bestimmen. Ein weiteres Beispiel: Die Fragestellung, welche Programme denn alle auf einem bestimmten Computer installiert sind, klingt trivial. Jedoch gibt es meines Wissens keine Möglichkeit, an diese Daten vollständig (und einfach) heranzukommen – außer WMI. Die entsprechende Befehlszeile ist hier beschrieben: http://s.sepago.de/helge/2010/01/14/how-to-list-all-installed-applications-from-the-command-line/. Im zweiten Beispiel wird der Windows-Befehl wmic verwendet. Er stellt eine Art Kommandozeilenschnittstelle zu WMI dar. Die folgende Beschreibung von wmic stammt aus dem Buch Windows-Befehle für Server 2008 …

Regex-Rezept: Sektionsblöcke in INI-Dateien finden

Problem Sie müssen jeden vollständigen INI-Sektionsblock finden (also eine Sektionsüberschrift und alle Name/Wert-Paare der Sektion), um eine INI-Datei aufzuteilen oder jeden Block getrennt zu verarbeiten. Lösung In Rezept 8.12 wurde gezeigt, wie man die Sektions-Überschrift in einer INI-Datei findet. Um eine gesamte Sektion zu finden, beginnen wir mit dem gleichen Muster aus dem Rezept, suchen aber weiter, bis wir das Ende des Strings oder ein Zeichen [ finden, das am Anfang einer Zeile steht (da damit der Anfang einer neuen Sektion beginnt): Diskussion Dieser reguläre Ausdruck findet zunächst mithilfe des Musters ‹^\[[^\]\r\n]+]› eine Sektionsüberschrift in einer INI-Datei. Dann sucht er Zeile für Zeile weiter, sofern sie nicht mit [ beginnt. Schauen Sie sich den folgenden Ausgangstext an: In diesem String findet die Regex zwei Übereinstimmungen. Die erste reicht vom Anfang des Strings bis zu der leeren Zeile vor „[Sektion2]“. Die zweite Übereinstimmung reicht vom Anfang der Überschrift von Sektion2 bis zum Ende des Strings. Weitere hilfreiche reguläre Ausdrücke finden Sie im soeben erschienenen Reguläre Ausdrücke Kochbuch. Anhand von über 100 Rezepten für C#, Java, JavaScript, …

Regex-Rezept: Wie extrahiert man das Schema aus einer URL?

Problem Sie wollen das Schema aus einem String extrahieren, der eine URL enthält. So wollen Sie zum Beispiel den Wert http für die URL  http://www.regexcookbook.com erhalten. Lösung Diskussion Es ist sehr einfach, das Schema einer URL zu extrahieren, wenn Sie schon wissen, dass es sich beim Ausgangstext um eine gültige URL handelt. Das Schema steht immer ganz am Anfang der URL. Der Zirkumflex (Rezept 2.5) sorgt dafür, dass diese Anforderung in der Regex umgesetzt wird. Das Schema beginnt mit einem Buchstaben, gefolgt von weiteren Buchstaben, Ziffern, Pluszeichen, Bindestrichen und Punkten. Das finden wir mit den beiden Zeichenklassen ‹[a-z][a-z0-9+\-.]*› (Rezept 2.3). Das Schema wird vom Rest der URL durch einen Doppelpunkt begrenzt. Wir fügen der Regex diesen Doppelpunkt hinzu, um sicherzustellen, dass wir das Schema nur dann finden, wenn die URL wirklich damit beginnt. Relative URLs enthalten kein Schema. Die in RFC 3986 definierte URL-Syntax stellt sicher, dass relative URLs keine Doppelpunkte enthalten, solange es vor diesen Doppelpunkten nicht schon Zeichen gibt, die in einem Schema nicht zulässig sind. Darum mussten wir den Doppelpunkt aus einer …

PHP 5: Standard-Datenstrukturen nicht neu erfinden – Queues, Stacks und Co.

Problem Sie benötigen in Ihrem Programm Datenstrukturen, die PHP nicht out-of-the-box bietet (z.B. Stack, Linked-List oder Queue). Sie könnten diese  mithilfe von Arrays als eigene Klasse implementieren, sind sich aber nicht sicher, ob Sie dabei nicht unnötig das Rad neu erfinden. Lösung Seit PHP 5.3 bietet die Standard PHP Library (SPL) einige dieser Datenstrukturen an. Die Klasse SplStack implementiert eine LIFO-Datenstruktur (Last-In-First-Out) und somit eine Datenstruktur, die sich wie ein Stack (engl. für Stapel) verhält: $stack = new SplStack(); $stack->push(‚a‘); $stack->push(‚b‘); $stack->push(‚c‘); echo $stack->pop().“\n“; echo $stack->pop().“\n“; echo $stack->pop().“\n“; c b a Die Klassen SplHeap, SplMinHeap und SplMaxHeap implementieren eine Heap-Datenstruktur.SplHeap ist dabei eine abstrakte Klasse und kann nicht direkt instantiiert werden. In einem Heap werden die einzelnen Elemente anhand ihrer Schlüsselwerte in einer Baumstruktur abgelegt. SplMinHeap und SplMaxHeap implementieren jeweils die von SplHeap als abstrakt deklarierte Funktion compare(). SplMinHeap legt die hinzugefügten Elemente in aufsteigend sortierter Reihenfolge ab, SplMaxHeap dagegen in absteigend sortierter Reihenfolge: $heap = new SplMaxHeap(); $heap->insert(‚b‘); $heap->insert(‚a‘); $heap->insert(‚c‘); echo $heap->extract().“\n“; echo $heap->extract().“\n“; echo $heap->extract().“\n“; c b a $heap = new SplMinHeap(); $heap->insert(‚b‘); …

PHP 5: Callback-Funktionen mit einem Zustandsgedächtnis programmieren

Problem Sie benötigen eine Callback-Funktion. Eine einfache Funktion (z.B. ein Closure oder eine Lambda-Funktion) reicht aber für Ihre Zwecke nicht aus, da die Callback-Funktion einen eigenen Zustand halten – also ein Zustandsgedächtnis haben – soll. Lösung Seit PHP 5.3 haben Sie die Möglichkeit, von Funktionsobjekten Gebrauch zu machen. Dabei handelt es sich um Objekte, die wie Funktionen behandelt und demnach also auch wie Funktionen aufgerufen werden können: class Funktor { public function __invoke($wert) { print $wert . „\n“; } } $f = new Funktor; $f(‚Hallo Welt!‘); Hallo Welt! Diskussion In Rezept 6.12 haben Sie gesehen, wie Lambda-Funktionen verwendet werden können, um z.B. ein Array mit der Funktion usort() zu sortieren. Diese Funktionen werden oft als Callback-Funktionen oder kurz Callbacks bezeichnet. Ein solches Callback übergibt man an eine beliebige Funktion, und diese ruft es mit diversen Parameterwerten auf. Die usort()-Funktion ruft ein Callback beispielsweise mit zwei Werten auf, die miteinander verglichen werden sollen. Die Callback-Funktion ist dabei nicht in der Lage, einen Zustand über mehrere Aufrufe hinweg zu halten. Einfach formuliert, könnte man sagen, sie hat …