{"id":1084,"date":"2025-09-06T14:46:49","date_gmt":"2025-09-06T14:46:49","guid":{"rendered":"https:\/\/davidka.net\/?p=1084"},"modified":"2025-09-21T04:47:04","modified_gmt":"2025-09-21T02:47:04","slug":"powershell-philosophy-part-4","status":"publish","type":"post","link":"https:\/\/de.davidka.net\/de\/2025\/09\/06\/powershell-philosophy-part-4\/","title":{"rendered":"PowerShell-Philosophie. Teil 4: Interaktives Arbeiten: Out-ConsoleGridView, Benachrichtigungen."},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Im <a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/01.md\">ersten Teil<\/a> haben wir zwei Schl\u00fcsselkonzepte von PowerShell definiert: Pipeline und Objekt. Im <a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/02.md\">zweiten Teil<\/a> habe ich erkl\u00e4rt, was Objekte und die Pipeline sind. Im <a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/03.md\">dritten Teil<\/a> haben wir das Dateisystem und die Provider kennengelernt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Heute werden wir die interaktive Arbeit mit Daten in der Konsole betrachten und uns mit Benachrichtigungen und Hinweisen vertraut machen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Interaktives Arbeiten mit Daten in der Konsole.<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><code class=\"\" data-line=\"\">Out-ConsoleGridView<\/code>. GUI in der PowerShell-Konsole.<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u2757 Wichtig:<\/strong> Alle unten beschriebenen Tools erfordern <strong>PowerShell 7.2 oder neuer<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Out-ConsoleGridView ist eine interaktive Tabelle direkt in der PowerShell-Konsole, die Folgendes erm\u00f6glicht:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Daten in Tabellenform anzeigen;<\/li>\n\n\n\n<li>Spalten filtern und sortieren;<\/li>\n\n\n\n<li>Zeilen mit dem Cursor ausw\u00e4hlen \u2013 um sie weiter durch die Pipeline zu leiten.<\/li>\n\n\n\n<li>und vieles mehr.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><code class=\"\" data-line=\"\">Out-ConsoleGridView<\/code> ist Teil des Moduls <code class=\"\" data-line=\"\">Microsoft.PowerShell.ConsoleGuiTools<\/code>.<br>Um es zu verwenden, m\u00fcssen Sie dieses Modul zuerst installieren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fchren Sie zur Installation des Moduls den folgenden Befehl in PowerShell aus:<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">Install-Module Microsoft.PowerShell.ConsoleGuiTools -Scope CurrentUser<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"assets\/04\/1.png\" alt=\"Install-Module Microsoft.PowerShell.ConsoleGuiTools -Scope CurrentUser\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Install-Module<\/em> l\u00e4dt und installiert das angegebene Modul aus dem Repository in das System.<br>Analoga: <code class=\"\" data-line=\"\">pip install<\/code> in <code class=\"\" data-line=\"\">Python<\/code> oder <code class=\"\" data-line=\"\">npm install<\/code> in <code class=\"\" data-line=\"\">Node.js<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udcce Schl\u00fcsselparameter von <em>Install-Module<\/em><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Parameter<\/th><th>Beschreibung<\/th><\/tr><\/thead><tbody><tr><td><code class=\"\" data-line=\"\">-Name<\/code><\/td><td>Name des zu installierenden Moduls.<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">-Scope<\/code><\/td><td>Installationsbereich: <code class=\"\" data-line=\"\">AllUsers<\/code> (Standard, erfordert Administratorrechte) oder <code class=\"\" data-line=\"\">CurrentUser<\/code> (erfordert keine Administratorrechte).<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">-Repository<\/code><\/td><td>Gibt das Repository an, z.B. <code class=\"\" data-line=\"\">PSGallery<\/code>.<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">-Force<\/code><\/td><td>Erzwingt die Installation ohne Best\u00e4tigung.<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">-AllowClobber<\/code><\/td><td>Erlaubt das \u00dcberschreiben bereits existierender Befehle.<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">-AcceptLicense<\/code><\/td><td>Akzeptiert automatisch die Modullizenz.<\/td><\/tr><tr><td><code class=\"\" data-line=\"\">-RequiredVersion<\/code><\/td><td>Installiert eine bestimmte Modulversion.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Nach der Installation k\u00f6nnen Sie jede Ausgabe an <code class=\"\" data-line=\"\">Out-ConsoleGridView<\/code> zur interaktiven Arbeit weiterleiten.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\"># Klassisches Beispiel: Anzeige einer Prozessliste in einer interaktiven Tabelle\nGet-Process | Out-ConsoleGridView<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">(https:\/\/github.com\/user-attachments\/assets\/5828dd51-cfb8-4904-87be-796ccc8395be)<video width=\"600\" controls=\"\"><\/video><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Benutzeroberfl\u00e4che:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Filtern:<\/strong> Beginnen Sie einfach mit der Eingabe von Text, und die Liste wird sofort gefiltert.<\/li>\n\n\n\n<li><strong>Navigation:<\/strong> Verwenden Sie die Pfeiltasten, um sich in der Liste zu bewegen.<\/li>\n\n\n\n<li><strong>Auswahl:<\/strong> Dr\u00fccken Sie <code class=\"\" data-line=\"\">Space<\/code>, um ein Element auszuw\u00e4hlen\/abzuw\u00e4hlen.<\/li>\n\n\n\n<li><strong>Mehrfachauswahl:<\/strong> <code class=\"\" data-line=\"\">Strg+A<\/code> zum Ausw\u00e4hlen aller Elemente, <code class=\"\" data-line=\"\">Strg+D<\/code> zum Aufheben der Auswahl aller Elemente.<\/li>\n\n\n\n<li><strong>Best\u00e4tigung:<\/strong> Dr\u00fccken Sie <code class=\"\" data-line=\"\">Enter<\/code>, um die ausgew\u00e4hlten Objekte zur\u00fcckzugeben.<\/li>\n\n\n\n<li><strong>Abbrechen:<\/strong> Dr\u00fccken Sie <code class=\"\" data-line=\"\">ESC<\/code>, um das Fenster zu schlie\u00dfen, ohne Daten zur\u00fcckzugeben.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Was <code class=\"\" data-line=\"\">Out-ConsoleGridView<\/code> kann:<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tabellarische Daten direkt in der Konsole als interaktive Tabelle mit Zeilen- und Spaltennavigation anzeigen.<\/li>\n\n\n\n<li>Spalten durch Tastendruck sortieren.<\/li>\n\n\n\n<li>Daten mithilfe der Suche filtern.<\/li>\n\n\n\n<li>Eine oder mehrere Zeilen ausw\u00e4hlen und das Ergebnis zur\u00fcckgeben.<\/li>\n\n\n\n<li>In einer reinen Konsole ohne GUI-Fenster arbeiten.<\/li>\n\n\n\n<li>Eine gro\u00dfe Anzahl von Zeilen mit Scrollen unterst\u00fctzen.<\/li>\n\n\n\n<li>Verschiedene Datentypen (Zeichenketten, Zahlen, Daten usw.) unterst\u00fctzen.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Anwendungsbeispiele f\u00fcr <code class=\"\" data-line=\"\">Out-ConsoleGridView<\/code><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Grundlegende Verwendung \u2013 Tabelle mit interaktiver Auswahl anzeigen. (Checkbox)<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">Import-Module Microsoft.PowerShell.ConsoleGuiTools\n\n$data = Get-Process | Select-Object -First 30 -Property Id, ProcessName, CPU, WorkingSet\n\n# Tabelle mit Filter-, Sortier- und Auswahlm\u00f6glichkeiten anzeigen\n$selected = $data | Out-ConsoleGridView -Title &quot;Prozess(e) ausw\u00e4hlen&quot; -OutputMode Multiple\n\n$selected | Format-Table -AutoSize<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">(https:\/\/github.com\/user-attachments\/assets\/3f1a2a62-066f-4dbb-947a-9b26095da356)<video><\/video><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Eine Liste von Prozessen wird in einer interaktiven Konsolentabelle angezeigt.<br>Sie k\u00f6nnen nach Namen filtern, Spalten sortieren und Prozesse ausw\u00e4hlen.<br>Die ausgew\u00e4hlten Prozesse werden in der Variable <code class=\"\" data-line=\"\">$selected<\/code> zur\u00fcckgegeben.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Auswahl einer einzelnen Zeile mit obligatorischer Ergebnisr\u00fcckgabe. (Radio)<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">$choice = Get-Service | Select-Object -First 20 | Out-ConsoleGridView -Title &quot;Dienst ausw\u00e4hlen&quot; -OutputMode Single\n\nWrite-Host &quot;Sie haben den Dienst ausgew\u00e4hlt: $($choice.Name)&quot;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/user-attachments\/assets\/5ee8fb92-8e18-496a-9db7-2d86b243742e\"><\/a><video><\/video><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der Benutzer w\u00e4hlt eine einzelne Zeile (Dienst). <code class=\"\" data-line=\"\">-OutputMode Single<\/code> verhindert die Auswahl mehrerer.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Filtern und Sortieren gro\u00dfer Arrays<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">$data = 1..1000 | ForEach-Object {\n    &#091;PSCustomObject]@{\n        Number = $_\n        Square = $_ * $_\n        Cube   = $_ * $_ * $_\n    }\n}\n\n$data | Out-ConsoleGridView -Title &quot;Zahlen und Potenzen&quot;  -OutputMode Multiple<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Zeigt eine Tabelle mit 1000 Zeilen mit Zahlen und ihren Potenzen an.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Interaktive Prozessverwaltung:<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Sie k\u00f6nnen mehrere Prozesse zum Beenden ausw\u00e4hlen. Der Parameter <code class=\"\" data-line=\"\">-OutputMode Multiple<\/code> gibt an, dass wir alle ausgew\u00e4hlten Elemente zur\u00fcckgeben m\u00f6chten.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\"># Ergebnisse \u00fcber die Pipeline weiterleiten.\n# Ausgew\u00e4hlte Prozesse mit dem Parameter -WhatIf zur Vorschau beenden.\n# Dazu definieren wir die Variable $procsToStop\n$procsToStop = Get-Process | Out-ConsoleGridView -OutputMode Multiple\n\n# Wenn etwas ausgew\u00e4hlt wurde, Objekte weiter \u00fcber die Pipeline leiten\nif ($procsToStop) {\n    $procsToStop | Stop-Process -WhatIf\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Dateien zur Archivierung ausw\u00e4hlen:<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Wir finden alle <code class=\"\" data-line=\"\">.log<\/code>-Dateien in einem Ordner, w\u00e4hlen die ben\u00f6tigten aus und erstellen ein Archiv daraus.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">$filesToArchive = Get-ChildItem -Path C:\\Logs -Filter &quot;*.log&quot; -Recurse | Out-ConsoleGridView -OutputMode Multiple<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u2757Seien Sie vorsichtig mit Rekursion<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">if ($filesToArchive) {\n    Compress-Archive -Path $filesToArchive.FullName -DestinationPath C:\\Temp\\LogArchive.zip\n\n    # Erfolgsmeldung hinzuf\u00fcgen\n    Write-Host &quot;\u2705 Archivierung erfolgreich abgeschlossen!&quot; -ForegroundColor Green\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Auswahl eines Elements zur detaillierten Analyse:<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Das &#8222;Drill-Down&#8220;-Muster \u2013 von der allgemeinen Liste zu Details mit <code class=\"\" data-line=\"\">Out-ConsoleGridView<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Oft stehen wir bei der Arbeit mit Systemobjekten vor einem Dilemma:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Wenn wir <strong>alle Eigenschaften<\/strong> f\u00fcr <strong>alle Objekte<\/strong> anfordern (<code class=\"\" data-line=\"\">Get-NetAdapter | Format-List *<\/code>), wird die Ausgabe riesig und unleserlich.<\/li>\n\n\n\n<li>Wenn wir eine <strong>kurze Tabelle<\/strong> anzeigen, verlieren wir wichtige Details.<\/li>\n\n\n\n<li>Manchmal kann der Versuch, alle Daten auf einmal abzurufen, zu einem Fehler f\u00fchren, wenn eines der Objekte ung\u00fcltige Werte enth\u00e4lt.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Die L\u00f6sung dieses Problems ist das <strong>&#8222;Drill-Down&#8220;<\/strong>-Muster (Detaillierung oder &#8222;Eintauchen&#8220;). Sein Kern ist einfach:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Schritt 1 (\u00dcbersicht):<\/strong> Dem Benutzer eine saubere, kurze und sichere Liste von Elementen zur <strong>Auswahl<\/strong> anzeigen.<\/li>\n\n\n\n<li><strong>Schritt 2 (Detaillierung):<\/strong> Nachdem der Benutzer ein bestimmtes Element ausgew\u00e4hlt hat, ihm <strong>alle verf\u00fcgbaren Informationen<\/strong> genau zu diesem Element anzeigen.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Praktisches Beispiel: Erstellen eines Netzwerkadapter-Browsers<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Wir implementieren dieses Muster am Beispiel des Befehls <code class=\"\" data-line=\"\">Get-NetAdapter<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Aufgabe:<\/strong> Zuerst eine kurze Liste der Netzwerkadapter anzeigen. Nach Auswahl eines Adapters ein zweites Fenster mit all seinen Eigenschaften \u00f6ffnen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Fertiger Code:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\"># --- Phase 1: Adapter aus der Kurzliste ausw\u00e4hlen ---\n$adapterList = Get-NetAdapter | Select-Object Name, InterfaceDescription, Status, LinkSpeed\n$selectedAdapter = $adapterList | Out-ConsoleGridView -Title &quot;PHASE 1: Netzwerkadapter ausw\u00e4hlen&quot;\n\n# --- Phase 2: Detaillierte Informationen oder Abbruchmeldung anzeigen ---\nif ($null -ne $selectedAdapter) {\n    # ALLE Eigenschaften f\u00fcr den AUSGEW\u00c4HLTEN Adapter abrufen\n    $detailedInfoObject = Get-NetAdapter -Name $selectedAdapter.Name | Select-Object *\n\n    # Unser Trick mit .psobject.Properties verwenden, um das Objekt in eine praktische &quot;Name-Wert&quot;-Tabelle umzuwandeln\n    $detailedInfoForGrid = $detailedInfoObject.psobject.Properties | Select-Object Name, Value\n\n    # ZWEITES GridView-Fenster mit vollst\u00e4ndigen Informationen \u00f6ffnen\n    $detailedInfoForGrid | Out-ConsoleGridView -Title &quot;PHASE 2: Vollst\u00e4ndige Informationen zu &#039;$($selectedAdapter.Name)&#039;&quot;\n} else {\n    Write-Host &quot;Vorgang abgebrochen. Es wurde kein Adapter ausgew\u00e4hlt.&quot; -ForegroundColor Yellow\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Schritt-f\u00fcr-Schritt-Analyse<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Erstellen einer &#8222;sicheren&#8220; Liste:<\/strong><br><code class=\"\" data-line=\"\">$adapterList = Get-NetAdapter | Select-Object Name, InterfaceDescription, Status, LinkSpeed<\/code><br>Wir leiten die Ausgabe von <code class=\"\" data-line=\"\">Get-NetAdapter<\/code> nicht direkt weiter. Stattdessen erstellen wir neue, &#8222;saubere&#8220; Objekte mit <code class=\"\" data-line=\"\">Select-Object<\/code>, die nur die Eigenschaften enthalten, die wir f\u00fcr die \u00dcbersicht ben\u00f6tigen. Dies stellt sicher, dass problematische Daten, die einen Fehler verursachen k\u00f6nnten, verworfen werden.<\/li>\n\n\n\n<li><strong>Erstes interaktives Fenster:<\/strong><br><code class=\"\" data-line=\"\">$selectedAdapter = $adapterList | Out-ConsoleGridView ...<\/code><br>Das Skript zeigt das erste Fenster an und <strong>h\u00e4lt seine Ausf\u00fchrung an<\/strong>, w\u00e4hrend es auf Ihre Auswahl wartet. Sobald Sie eine Zeile ausw\u00e4hlen und <code class=\"\" data-line=\"\">Enter<\/code> dr\u00fccken, wird das dieser Zeile entsprechende Objekt in die Variable <code class=\"\" data-line=\"\">$selectedAdapter<\/code> geschrieben.<\/li>\n\n\n\n<li><strong>\u00dcberpr\u00fcfung der Auswahl:<\/strong><br><code class=\"\" data-line=\"\">if ($null -ne $selectedAdapter)<\/code><br>Dies ist eine entscheidende \u00dcberpr\u00fcfung. Wenn der Benutzer <code class=\"\" data-line=\"\">Esc<\/code> dr\u00fcckt oder das Fenster schlie\u00dft, ist die Variable <code class=\"\" data-line=\"\">$selectedAdapter<\/code> leer (<code class=\"\" data-line=\"\">$null<\/code>). Diese \u00dcberpr\u00fcfung verhindert die Ausf\u00fchrung des restlichen Codes und das Auftreten von Fehlern.<\/li>\n\n\n\n<li><strong>Abrufen vollst\u00e4ndiger Informationen:<\/strong><br><code class=\"\" data-line=\"\">$detailedInfoObject = Get-NetAdapter -Name $selectedAdapter.Name<\/code><br>Hier ist der Schl\u00fcsselmoment des Musters. Wir greifen erneut auf <code class=\"\" data-line=\"\">Get-NetAdapter<\/code> zu, fordern aber diesmal <strong>nur ein<\/strong> Objekt anhand seines Namens an, den wir aus dem im ersten Schritt ausgew\u00e4hlten Element entnommen haben. Jetzt erhalten wir das vollst\u00e4ndige Objekt mit all seinen Eigenschaften.<\/li>\n\n\n\n<li><strong>Transformation f\u00fcr das zweite Fenster:<\/strong><br><code class=\"\" data-line=\"\">$detailedInfoForGrid = $detailedInfoObject.psobject.Properties | ...<\/code><br>Wir verwenden den Ihnen bereits bekannten leistungsstarken Trick, um dieses eine komplexe Objekt in eine lange Liste von &#8222;Eigenschaftsname&#8220; | &#8222;Wert&#8220;-Paaren &#8222;aufzul\u00f6sen&#8220;, die sich ideal f\u00fcr die Anzeige in einer Tabelle eignet.<\/li>\n\n\n\n<li><strong>Zweites interaktives Fenster:<\/strong><br><code class=\"\" data-line=\"\">$detailedInfoForGrid | Out-ConsoleGridView ...<\/code><br>Auf dem Bildschirm erscheint ein zweites Fenster, diesmal mit umfassenden Informationen zu genau dem Adapter, den Sie ausgew\u00e4hlt haben.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Beispiel mit benutzerdefiniertem Titel und Hinweisen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Anzeige des Windows-Ereignisprotokolls in einer interaktiven Tabelle mit dem Titel &#8222;System Events&#8220;.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">Get-EventLog -LogName System -Newest 50 |\n    Select-Object TimeGenerated, EntryType, Source, Message |\n    Out-ConsoleGridView -Title &quot;System Events&quot;  -OutputMode Multiple<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dieser Code ruft die 50 neuesten Ereignisse aus dem Windows-Systemprotokoll ab, w\u00e4hlt von jedem Ereignis nur vier Schl\u00fcsselattribute aus<br>(Zeit, Typ, Quelle und Nachricht) und zeigt sie im Out-ConsoleGridView-Fenster an.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Systeminformationen.<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">(https:\/\/github.com\/user-attachments\/assets\/1e53a339-56f9-4add-8053-86d94dbc8e06)<video width=\"600\" controls=\"\"><\/video><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Skriptcode zum Abrufen von Systeminformationen:<br><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/code\/04\/Get-SystemMonitor.ps1\">Get-SystemMonitor.ps1<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Erstellen des Cmdlets &#8218;Get-SystemMonitor&#8216;<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Schritt 1: Konfigurieren der <code class=\"\" data-line=\"\">PATH<\/code>-Variable<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Erstellen Sie einen permanenten Ordner f\u00fcr Ihre Tools,<\/strong> falls Sie dies noch nicht getan haben. Zum Beispiel:<br><code class=\"\" data-line=\"\">C:\\PowerShell\\Scripts<\/code><\/li>\n\n\n\n<li><strong>Legen Sie Ihre Datei<\/strong> <code class=\"\" data-line=\"\">Get-SystemMonitor.ps1<\/code> in diesen Ordner.<\/li>\n\n\n\n<li><strong>F\u00fcgen Sie diesen Ordner zur Systemvariablen <code class=\"\" data-line=\"\">PATH<\/code> hinzu<\/strong>,<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">Schritt 2: Konfigurieren des Alias im PowerShell-Profil<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Nachdem das System nun wei\u00df, wo Ihr Skript unter seinem vollst\u00e4ndigen Namen zu finden ist, k\u00f6nnen wir einen kurzen Alias daf\u00fcr erstellen.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u00d6ffnen Sie Ihre PowerShell-Profildatei<\/strong>: <code class=\"\" data-line=\"\">notepad $PROFILE<\/code><\/li>\n\n\n\n<li><strong>F\u00fcgen Sie die folgende Zeile hinzu:<\/strong> <code class=\"\" data-line=\"\"># Alias f\u00fcr den Systemmonitor Set-Alias -Name sysmon -Value &quot;Get-SystemMonitor.ps1&quot;<\/code> <strong>Beachten Sie den entscheidenden Punkt:<\/strong> Da sich der Ordner mit dem Skript bereits im <code class=\"\" data-line=\"\">PATH<\/code> befindet, m\u00fcssen wir <strong>nicht mehr den vollst\u00e4ndigen Pfad<\/strong> zur Datei angeben! Wir verweisen einfach auf ihren Namen. Dies macht Ihr Profil sauberer und zuverl\u00e4ssiger. Wenn Sie den Ordner <code class=\"\" data-line=\"\">C:\\PowerShell\\Scripts<\/code> jemals verschieben, m\u00fcssen Sie nur die <code class=\"\" data-line=\"\">PATH<\/code>-Variable aktualisieren, und Ihre Profildatei bleibt unver\u00e4ndert.<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">PowerShell neu starten<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Schlie\u00dfen Sie <strong>alle<\/strong> ge\u00f6ffneten PowerShell-Fenster und \u00f6ffnen Sie ein neues. Dies ist notwendig, damit das System die \u00c4nderungen sowohl in der <code class=\"\" data-line=\"\">PATH<\/code>-Variablen als auch in Ihrem Profil anwendet.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Ergebnis: Was Sie erhalten<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nachdem Sie diese Schritte ausgef\u00fchrt haben, k\u00f6nnen Sie Ihr Skript <strong>auf zwei Arten von jedem Ort im System aus aufrufen<\/strong>:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Mit dem vollst\u00e4ndigen Namen (zuverl\u00e4ssig, zur Verwendung in anderen Skripten):<\/strong> <code class=\"\" data-line=\"\">Get-SystemMonitor.ps1 Get-SystemMonitor.ps1 -Resource storage<\/code><\/li>\n\n\n\n<li><strong>Mit dem kurzen Alias (praktisch, f\u00fcr interaktives Arbeiten):<\/strong><br><code class=\"\" data-line=\"\">powershell sysmon sysmon -Resource memory<\/code><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Sie haben Ihr Skript erfolgreich auf die professionellste und flexibelste Weise im System &#8222;registriert&#8220;.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">N\u00fctzlich? Abonnieren Sie.<br>Gef\u00e4llt es Ihnen \u2013 geben Sie ein \u201e+\u201c<br>Viel Gl\u00fcck! \ud83d\ude80<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Weitere Artikel \u00fcber PowerShell:<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im ersten Teil haben wir zwei Schl\u00fcsselkonzepte von PowerShell definiert: Pipeline und Objekt. Im zweiten Teil habe ich erkl\u00e4rt, was Objekte und die Pipeline sind. Im dritten Teil haben wir das Dateisystem und die Provider kennengelernt. Heute werden wir die interaktive Arbeit mit Daten in der Konsole betrachten und uns mit Benachrichtigungen und Hinweisen vertraut&hellip;&nbsp;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"left","neve_meta_author_avatar":"","neve_post_elements_order":"[\"content\",\"tags\",\"comments\"]","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","_themeisle_gutenberg_block_has_review":false,"footnotes":""},"categories":[],"tags":[],"class_list":["post-1084","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/posts\/1084","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/comments?post=1084"}],"version-history":[{"count":0,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/posts\/1084\/revisions"}],"wp:attachment":[{"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/media?parent=1084"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/categories?post=1084"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/tags?post=1084"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}