Archiv der Kategorie: Tipps

Kleine Tipps für Zwischendurch: Hex-Zahlen als Dezimalzahlen ausgeben

Das Umwandeln eines Hex-Wertes in einen Dezimalwert ist wirklich sehr einfach:

„Hex“ ist aber keine „magische Zutat“, sondern die wie immer sehr praktische Eigenschaft der PowerShell, das die Felder einer Konstantenliste nicht nur nicht vollständig qualifiziert werden müssen, sondern auch abgekürzt werden können. Offiziell wäre der Name System.Globalization.NumberStyles.HexNumber.

Kleine Tipps für Zwischendurch: Textabfragen mit Sls (Select-String)

Der Umstand, dass bei der PowerShell alles auf Objekten basiert, bietet nicht nur Vorteile. Ein Ausnahme von der Regel ist das Durchsuchen der History.

Wer

eintippt erwartet, dass alle Befehlszeilen ausgeben, die das Wort „startapp“ enthalten. Dem ist aber nicht so, da für das gewünschte Resultat explizit die CommandLine-Eigenschaft abgefragt werden müsste.

Auch ein

bringt nicht. Wer es mit ? alias Where-Object

eingeben. Das ist für das mal eben-Abfragen der History natürlich keine Option. Zum Glück gibt es mit Select-String und seinem Alias sls eine einfache Alternative:

Dieser Befehl durchsucht den Output von Get-History unabhängig von den Namen einzelner Eigenschaften nach dem Wort „startapp“.

Dass bei dieser Abfrage MatchInfo-Objekte resultieren, was eventuell eine Weiterverarbeitung etwas erschweren könnte, wollen wir großzügig übersehen.

Kleine Tipps für Zwischendurch: C#-Code testen

Wer lediglich ein paar Zeilen C#-Code testen möchte, muss dafür nicht Visual Studio starten, um dort ein Projekt anlegen zu müssen, wenngleich dies natürlich kein allzu großer Aufwand ist und es mit Visual Studio Code einen Editor gibt, der vielsprachig ist. Es geht auch per PowerShell und dem vielseitigen Add-Type-Cmdlet. Über den MemberDefinition-Parameter wird der C#-Code für eine Membermethode übergeben. Name der Klasse und eventuell auch ein Namespace werden per Parameter festgelegt.

Das folgende Beispiel veranschauhlicht die einfache Vorgehensweise. Eventuell wäre eine statische Methode noch etwas kürzer.

Kleine Tipps für Zwischendurch: Regexe mit Umlauten und anderen Zeichen und die Fehlermeldung „[x-y]-Bereich in umgekehrter Reihenfolge“

Regexe praktisch und alles andere als kompliziert, wenn man sich auf einfache Anwendungsfälle beschränkt. Etwa, das Zerlegen von Zeilen, die aus einem Tag in spitzen Klammern und einem Rest bestehen. Zum Beispiel:

Der Regex soll „slide“ und den Text liefern, der auf die schließende spitze Klammer folgt. Grundsätzlich kein allzu großes Problem, allerdings liefert der folgende Regex die Fehlermeldung [x-y]-Bereich in umgekehrter Reihenfolge:

Die Erklärung ist ebenfalls ganz einfach (vor allem, wenn man es weiß;). Da ich neben vielen Sonderzeichen auch den Bindestrich prüfe, kommt dieser in der Gruppe ebenfalls vor. Er muss dabei aber am Anfang der Gruppe stehen, da er ansonsten als Metazeichen interpretiert wird. Ich hatte ja erwähnt, dass die Fehlermeldung eine ganz einfache Ursache hat.

Der richtige Regex ist daher:

PoshConf Europe 2018 – es gibt noch freie Plätze und wer speakt wie oft und über was

In knapp 3 Wochen startet in Hannover die PowerShell Conference Europe 2018 – vom 17. bis 20. April. Aktuell gibt es noch freie Plätze. Wer sich immer schon einmal mit dem Erfinder der PowerShell Jeffrey Snover oder dem „Brain“ hinter der PowerShell-Sprache Bruce Payette unterhalten möchte (oder falls vom Gespräch auf der letzten Konferenz noch Fragen offen geblieben sind) hat dazu die Gelegenheit. Alle Infos unter http://www.psconf.eu/.

Ich werde dieses Mal nicht dabei sein, aber mich interessiert natürlich trotzdem wer welche Vorträge hält.

Unter http://powershell.beer steht die gesamte Agenda im JSON-Format zur Verfügung.

Der folgende Befehl gibt sie übersichtlich aus:

(Das $ sollte eigentlich nicht erforderlich sein)

Mich interesiert natürlich welche Sprecher die meisten Vorträge halten und natürlich auch welche das sind. Das kleine „Problem“ ist, dass es bei einigen Vorträgen mehrere Sprecher gibt und die Speaker-Eigenschaft daher auch mehrere Namen enthält.

Der folgende Befehl gibt die Sprecher gruppiert nach ihrem Namen und sortiert nach der Anzahl ihrer Vorträge aus.

Das Problem mit dieser Ausgabe ist nur, dass die Sprecher nicht einzeln aufgelistet werden, da es zu einem Vortrag auch mehrere Sprecher geben kann. Die Speaker-Eigenschaft enthält dann mehrere (zwei oder drei) per Komma getrennte Namen.

Wer das Problem selber lösen möchte, sollte jetzt nicht weiterlesen, sondern sich ca. 1 Stunde Zeit nehmen. Es hat mich nicht ganz so viel Zeit gekostet, aber es war schon ein wenig Hin- und Herprobieren erforderlich bis endlich das gewünschte Ergebnis herauskam.

Der Knackpunkt an der Geschichte war, dass ich zuerst auf Invoke-WebRequest umschalten musste, um den JSON-Text direkt zu erhalten (eventuell ist das auch nicht erforderlich) und dann darauf kommen musste, dass die Rückgabe aus einem einzelnen Objekt-Array besteht und nicht aus vielen Objekten – was die Ausgabe suggeriert (darauf bin ich in den letzten Jahren schon einige Male hereingefallen;) – der entscheidende Test ist für mich immer. ob Measure-Object ein Objekt zurückgibt oder mehrere. Ausgehend von einem einzigen Objekt habe ich dessen Content-Eigenschaft expandiert und aus dem resultierenden JSON-Text Objekte gemacht, die per ForEach durchlaufen werden. Da sich hinter der Speaker-Eigenschaft mehrere Namen verbergen können, werden diese per -split-Operator alle einzeln fein säuberlich getrennt und mit der zuvor gespeicherten Title-Eigenschaft zu einem neuen Objekt kombiniert. Dieses besitzt erneut eine Speaker-Eigenschaft mit dem Namen eines Speakers, nach der gruppiert werden kann.

Alles klar? Egal, hier ist ein möglicher Versuch:

Wer ist der Top-Speaker auf der PowerShell Conference Europe 2018?

Netzwerktools und ihre PowerShell-Pendants

Beim Vorbereiten auf einen MOC-Kurs zu Windows 10 ging es auch um die Netzwerkkonfiguration. Es ist erfreulich, dass in den aktuelleren MOC-Unterlagen auch die PowerShell inzwischen erwähnt wird und Gegenstand einiger Demos und Labs ist.

Da auch für mich als PowerShell-Kenner nicht immer auf Anhieb einfällt was z.B. das Pendant zu Nslookup oder ipconfig /flushdns ist, bin ich froh den folgenden Blog-Eintrag gefunden zu haben, in dem der Autor die klassischen Netzwerkkommandos den PowerShell-Befehlen gegenüberstellt:

https://blogs.technet.microsoft.com/josebda/2015/04/18/windows-powershell-equivalents-for-common-networking-commands-ipconfig-ping-nslookup/

Ein wenig kurios ist allerdings, dass dem Autor nicht klar war, dass PowerShell 5.0 zu verwenden nicht automatisch bedeutet, dass Befehle wie Get-NetIPAddress zur Verfügung stehen, da diese Teil des Betriebssystems und nicht der PowerShell sind. Das Ergebnis waren daher auch ein paar „bei mir läuft es nicht, obwohl ich Version 5.0 verwende“-Kommentare.

Was ich noch suche ist ein Pendant zu dem sehr praktischen Portqry.exe, das aber zuerst von einer Microsoft-Seite heruntergeladen werden muss.

Kleine Tipps für Zwischendurch: Alle Dienstnamen pro Svchost-Prozess ausgeben

Vor kurzem habe ich in einem Blog-Eintrag eine PowerShell-Befehlsfolge gefunden, die zu jedem Svchost-Prozess die Namen der Dienste ausgibt, die von diesem Prozess ausgeführt werden. Die Lösung war gut, aber leider sehr umständlich. Vermutlich war der Autor Entwickler und hat ein wenig zu sehr die Entwicklerdenkweise bei der Umsetzung der eigentlich einfachen Aufgabenstellung angewendet. Bei mir hat es auch ein paar Jahre gedauert bis ich mir diese Denkweise bei der PowerShell abgewöhnt hatte.

Mein Vorschlag für eine Unmsetzung sieht wie folgt aus.

Es kann lediglich eine Weile dauern bis eine Ausgabe erscheint.

Kleine Tipps für Zwischendurch: Eine IP-Adresse als Binärzahl ausgeben

Vielleicht gibt es eine einfachere Variante, aber bei der Folgenden gefällt mit die Unmsetzung gut:

So sieht die Adresse als Binärzahl aus:

Chocolatey mit Chocolatey installieren

Laut „Der Postillon“ ist das Henne oder Ei-Problem endlich gelöst: Das Ei war zuerst da.

Ein wenig erinnert mich diese humorvolle Meldung an die Installation der Package Managers Chocolatey per Install-Package und dem Chocolatey-Provider, der aber nachträglich installiert werden muss. Dank des ForceBootstrap-Parameters ist das kein Problem.

Der Pfad von Choco.exe muss allerdings zu Fuß zur Path-Umgebungsvariablen hinzugefügt werden: