{"id":634,"date":"2025-08-20T18:35:46","date_gmt":"2025-08-20T16:35:46","guid":{"rendered":"https:\/\/davidka.net\/?p=634"},"modified":"2025-09-22T02:29:40","modified_gmt":"2025-09-22T00:29:40","slug":"powershell-philosophy-part-2","status":"publish","type":"post","link":"https:\/\/de.davidka.net\/de\/2025\/08\/20\/powershell-philosophy-part-2\/","title":{"rendered":"Teil 2: Pipeline, Variablen, Get-Member,\u00a0.ps1-Datei und Export von Ergebnissen."},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>\u2757 Wichtig:<\/strong>&nbsp;Ich schreibe \u00fcber PS7 (PowerShell 7). Es unterscheidet sich von PS5 (PowerShell 5). Ab der siebten Version wurde PowerShell plattform\u00fcbergreifend. Aus diesem Grund hat sich das Verhalten einiger Befehle ge\u00e4ndert.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Im ersten Teil haben wir das Schl\u00fcsselprinzip festgelegt: PowerShell arbeitet mit&nbsp;<strong>Objekten<\/strong>, nicht mit Text. Dieser Beitrag widmet sich einigen wichtigen PowerShell-Tools: Wir lernen, Objekte \u00fcber die&nbsp;<strong>Pipeline<\/strong>&nbsp;zu \u00fcbergeben, sie mit&nbsp;<strong><code class=\"\" data-line=\"\">Get-Member<\/code><\/strong>&nbsp;zu analysieren, Ergebnisse in&nbsp;<strong>Variablen<\/strong>&nbsp;zu speichern und all dies in&nbsp;<strong>Skriptdateien (<code class=\"\" data-line=\"\">.ps1<\/code>)<\/strong>&nbsp;mit&nbsp;<strong>Export<\/strong>&nbsp;der Ergebnisse in praktische Formate zu automatisieren.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Was ist eine Pipeline (<code class=\"\" data-line=\"\">|<\/code>)?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/02.md#1-was-ist-eine-pipeline-\"><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Pipeline in PowerShell ist ein Mechanismus zur \u00dcbergabe vollwertiger .NET-Objekte (und nicht nur einfachen Textes) von einem Befehl zum n\u00e4chsten, wobei jedes nachfolgende Cmdlet strukturierte Objekte mit all ihren Eigenschaften und Methoden erh\u00e4lt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das Symbol&nbsp;<code class=\"\" data-line=\"\">|<\/code>&nbsp;(vertikaler Strich) ist der Pipeline-Operator. Seine Aufgabe ist es, das Ergebnis (die Ausgabe) des Befehls links davon zu nehmen und es als Eingabe an den Befehl rechts davon weiterzuleiten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code class=\"\" data-line=\"\">Befehl 1 (erzeugt Objekte)<\/code>&nbsp;\u2192&nbsp;<code class=\"\" data-line=\"\">|<\/code>&nbsp;\u2192&nbsp;<code class=\"\" data-line=\"\">Befehl 2 (empf\u00e4ngt und verarbeitet Objekte)<\/code>&nbsp;\u2192&nbsp;<code class=\"\" data-line=\"\">|<\/code>&nbsp;\u2192&nbsp;<code class=\"\" data-line=\"\">Befehl 3 (empf\u00e4ngt verarbeitete Objekte)<\/code>&nbsp;\u2192 | &#8230;<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Klassische UNIX-Pipeline: Textstrom<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/02.md#klassische-unix-pipeline-textstrom\"><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In&nbsp;<code class=\"\" data-line=\"\">bash<\/code>&nbsp;wird ein&nbsp;<strong>Bytestrom<\/strong>&nbsp;\u00fcber die Pipeline geleitet, der normalerweise als Text interpretiert wird.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted line-numbers\"># Alle 'nginx'-Prozesse finden und ihre Anzahl z\u00e4hlen\nps -ef | grep 'nginx' | wc -l<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Hier gibt&nbsp;<code class=\"\" data-line=\"\">ps<\/code>&nbsp;Text aus,&nbsp;<code class=\"\" data-line=\"\">grep<\/code>&nbsp;filtert diesen Text, und&nbsp;<code class=\"\" data-line=\"\">wc<\/code>&nbsp;z\u00e4hlt die Zeilen. Jedes Dienstprogramm wei\u00df nichts \u00fcber &#8222;Prozesse&#8220;, es arbeitet nur mit Zeilen.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">PowerShell-Pipeline: Objektstrom<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/02.md#powershell-pipeline-objektstrom\"><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Beispiel:<\/strong>&nbsp;Lassen Sie uns alle Prozesse abrufen, sie nach CPU-Auslastung sortieren und die 5 &#8222;hungrigsten&#8220; ausw\u00e4hlen.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted line-numbers\">Get-Process | Sort-Object -Property CPU -Descending | Select-Object -First 5<\/pre>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/assets\/02\/1.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/raw\/master\/de\/assets\/02\/1.png\" alt=\"1\"\/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Hier erzeugt&nbsp;<code class=\"\" data-line=\"\">Get-Process<\/code>&nbsp;<strong>Prozessobjekte<\/strong>.&nbsp;<code class=\"\" data-line=\"\">Sort-Object<\/code>&nbsp;empf\u00e4ngt diese&nbsp;<strong>Objekte<\/strong>&nbsp;und sortiert sie nach der Eigenschaft&nbsp;<code class=\"\" data-line=\"\">CPU<\/code>.&nbsp;<code class=\"\" data-line=\"\">Select-Object<\/code>&nbsp;empf\u00e4ngt die sortierten&nbsp;<strong>Objekte<\/strong>&nbsp;und w\u00e4hlt die ersten 5 aus.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sie haben sicherlich in dem Befehl W\u00f6rter bemerkt, die mit einem Bindestrich (-) beginnen: -Property, -Descending, -First. Das sind Parameter. Parameter sind Einstellungen, Schalter und Anweisungen f\u00fcr ein Cmdlet. Sie erm\u00f6glichen es Ihnen, zu steuern,&nbsp;<strong>WIE<\/strong>&nbsp;ein Befehl seine Arbeit ausf\u00fchrt. Ohne Parameter arbeitet ein Befehl im Standardmodus, mit Parametern geben Sie ihm spezifische Anweisungen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Haupttypen von Parametern:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Parameter mit Wert: erfordert zus\u00e4tzliche Informationen.<code class=\"\" data-line=\"\">-Property CPU<\/code>: Wir sagen Sort-Object, nach welcher Eigenschaft sortiert werden soll. CPU ist der Wert des Parameters.<code class=\"\" data-line=\"\">-First 5<\/code>: Wir sagen Select-Object, wie viele Objekte ausgew\u00e4hlt werden sollen. 5 ist der Wert des Parameters.<\/li>\n\n\n\n<li>Schalterparameter (Flag): Ben\u00f6tigt keinen Wert. Seine blo\u00dfe Anwesenheit im Befehl schaltet ein bestimmtes Verhalten ein oder aus.<code class=\"\" data-line=\"\">-Descending<\/code>: Dieses Flag weist Sort-Object an, die Sortierreihenfolge umzukehren (vom Gr\u00f6\u00dften zum Kleinsten). Es ben\u00f6tigt keinen zus\u00e4tzlichen Wert \u2013 es ist an sich eine Anweisung.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-preformatted line-numbers\">Get-Process -Name 'svchost' | Measure-Object<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><a target=\"_blank\" rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/assets\/02\/2.png\"><\/a>&nbsp;Dieser Befehl beantwortet eine sehr einfache Frage:&nbsp;<strong>&#8222;Wie viele Prozesse mit dem Namen&nbsp;<code class=\"\" data-line=\"\">svchost.exe<\/code>&nbsp;laufen derzeit auf meinem System?&#8220;<\/strong><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Schritt-f\u00fcr-Schritt-Analyse<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/02.md#schritt-f%C3%BCr-schritt-analyse\"><\/a><\/p>\n\n\n\n<h5 class=\"wp-block-heading\"><strong>Schritt 1:&nbsp;<code class=\"\" data-line=\"\">Get-Process -Name &#039;svchost&#039;<\/code><\/strong><\/h5>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/02.md#schritt-1-get-process--name-svchost\"><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dieser Teil des Befehls wendet sich an das Betriebssystem und fordert es auf,&nbsp;<strong>alle ausnahmslos<\/strong>&nbsp;laufenden Prozesse zu finden, deren ausf\u00fchrbarer Dateiname&nbsp;<code class=\"\" data-line=\"\">svchost.exe<\/code>&nbsp;ist. Im Gegensatz zu Prozessen wie&nbsp;<code class=\"\" data-line=\"\">notepad<\/code>&nbsp;(von denen es normalerweise ein oder zwei gibt), gibt es immer&nbsp;<strong>viele<\/strong>&nbsp;<code class=\"\" data-line=\"\">svchost<\/code>-Prozesse im System. Der Befehl gibt ein&nbsp;<strong>Array (Sammlung) von Objekten<\/strong>&nbsp;zur\u00fcck, wobei jedes Objekt ein separater, vollst\u00e4ndiger&nbsp;<code class=\"\" data-line=\"\">svchost<\/code>-Prozess mit seiner eindeutigen ID, Speichernutzung usw. ist. PowerShell hat im System beispielsweise 90&nbsp;<code class=\"\" data-line=\"\">svchost<\/code>-Prozesse gefunden und h\u00e4lt nun eine Sammlung von 90 Objekten in der Hand.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\"><strong>Schritt 2:&nbsp;<code class=\"\" data-line=\"\">|<\/code>&nbsp;(Pipeline-Operator)<\/strong><\/h5>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/02.md#schritt-2--pipeline-operator\"><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dieses Symbol nimmt die Sammlung von 90&nbsp;<code class=\"\" data-line=\"\">svchost<\/code>-Objekten, die im ersten Schritt erhalten wurden, und beginnt, sie&nbsp;<strong>einzeln<\/strong>&nbsp;als Eingabe an den n\u00e4chsten Befehl zu \u00fcbergeben.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\"><strong>Schritt 3:&nbsp;<code class=\"\" data-line=\"\">Measure-Object<\/code><\/strong><\/h5>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/02.md#schritt-3-measure-object\"><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Da wir&nbsp;<code class=\"\" data-line=\"\">Measure-Object<\/code>&nbsp;ohne Parameter (wie&nbsp;<code class=\"\" data-line=\"\">-Property<\/code>,&nbsp;<code class=\"\" data-line=\"\">-Sum<\/code>&nbsp;usw.) aufgerufen haben, f\u00fchrt es seine&nbsp;<strong>Standardoperation<\/strong>&nbsp;aus \u2013 es z\u00e4hlt einfach die Anzahl der ihm \u00fcbergebenen &#8222;Elemente&#8220;. Eins, zwei, drei &#8230; Nachdem alle Objekte gez\u00e4hlt wurden, erstellt&nbsp;<code class=\"\" data-line=\"\">Measure-Object<\/code>&nbsp;<strong>sein eigenes Ergebnisobjekt<\/strong>, das eine Eigenschaft&nbsp;<code class=\"\" data-line=\"\">Count<\/code>&nbsp;enth\u00e4lt, die der Gesamtzahl entspricht.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><code class=\"\" data-line=\"\">Count: 90<\/code><\/strong>&nbsp;\u2013 das ist die Antwort auf unsere Frage. Es laufen 90&nbsp;<code class=\"\" data-line=\"\">svchost<\/code>-Prozesse. Die restlichen Felder sind leer, da wir&nbsp;<code class=\"\" data-line=\"\">Measure-Object<\/code>&nbsp;nicht aufgefordert haben, komplexere Berechnungen durchzuf\u00fchren.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Beispiel mit&nbsp;<code class=\"\" data-line=\"\">svchost<\/code>&nbsp;und Parametern<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/02.md#beispiel-mit-svchost-und-parametern\"><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lassen Sie uns unsere Aufgabe \u00e4ndern. Jetzt wollen wir nicht nur die&nbsp;<code class=\"\" data-line=\"\">svchost<\/code>-Prozesse z\u00e4hlen, sondern herausfinden,&nbsp;<strong>wie viel Arbeitsspeicher (in Megabyte) sie insgesamt verbrauchen<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Daf\u00fcr ben\u00f6tigen wir Parameter:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">-Property WorkingSet64<\/code>: Diese Anweisung sagt\u00a0<code class=\"\" data-line=\"\">Measure-Object<\/code>: &#8222;Nimm aus jedem\u00a0<code class=\"\" data-line=\"\">svchost<\/code>-Objekt, das zu dir kommt, den numerischen Wert aus der Eigenschaft\u00a0<code class=\"\" data-line=\"\">WorkingSet64<\/code>\u00a0(das ist die Speichernutzung in Bytes).&#8220;<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">-Sum<\/code>: Diese Anweisung (Flag) sagt: &#8222;Addiere alle diese Werte, die du aus der Eigenschaft\u00a0<code class=\"\" data-line=\"\">WorkingSet64<\/code>\u00a0genommen hast.&#8220;<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Unser neuer Befehl sieht so aus:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted line-numbers\">Get-Process -Name 'svchost' | Measure-Object -Property WorkingSet64 -Sum<\/pre>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/assets\/02\/3.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/raw\/master\/de\/assets\/02\/3.png\" alt=\"3\"\/><\/a><\/figure>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">Get-Process<\/code>\u00a0findet die Anzahl der\u00a0<code class=\"\" data-line=\"\">svchost<\/code>-Objekte.<\/li>\n\n\n\n<li>Die Pipeline\u00a0<code class=\"\" data-line=\"\">|<\/code>\u00a0\u00fcbergibt sie an\u00a0<code class=\"\" data-line=\"\">Measure-Object<\/code>.<\/li>\n\n\n\n<li>Aber jetzt arbeitet\u00a0<code class=\"\" data-line=\"\">Measure-Object<\/code>\u00a0anders:\n<ul class=\"wp-block-list\">\n<li>Es nimmt das erste\u00a0<code class=\"\" data-line=\"\">svchost<\/code>-Objekt, schaut sich seine Eigenschaft\u00a0<code class=\"\" data-line=\"\">.WorkingSet64<\/code>\u00a0an (z.B.\u00a0<code class=\"\" data-line=\"\">25000000<\/code>\u00a0Bytes) und merkt sich diese Zahl.<\/li>\n\n\n\n<li>Es nimmt das zweite Objekt, schaut sich sein\u00a0<code class=\"\" data-line=\"\">.WorkingSet64<\/code>\u00a0an (z.B.\u00a0<code class=\"\" data-line=\"\">15000000<\/code>\u00a0Bytes) und addiert es zum vorherigen.<\/li>\n\n\n\n<li>&#8230;und so weiter f\u00fcr alle Objekte.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Am Ende erstellt\u00a0<code class=\"\" data-line=\"\">Measure-Object<\/code>\u00a0ein Ergebnisobjekt, aber diesmal wird es anders sein.<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code class=\"\" data-line=\"\">Count: 92<\/code><\/strong>: Anzahl der Objekte.<\/li>\n\n\n\n<li><strong><code class=\"\" data-line=\"\">Sum: 1661890560<\/code><\/strong>: Dies ist die Gesamtsumme aller\u00a0<code class=\"\" data-line=\"\">WorkingSet64<\/code>-Werte in Bytes.<\/li>\n\n\n\n<li><strong><code class=\"\" data-line=\"\">Property: WorkingSet64<\/code><\/strong>: Dieses Feld ist nun ebenfalls gef\u00fcllt, es informiert uns, welche Eigenschaft f\u00fcr die Berechnungen verwendet wurde.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2. Variablen (Normale und spezielle&nbsp;<code class=\"\" data-line=\"\">$_<\/code>)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/02.md#2-variablen-normale-und-spezielle-_\"><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Eine Variable ist ein benannter Speicherort im Arbeitsspeicher, der einen Wert enth\u00e4lt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dieser Wert kann alles sein: Text, eine Zahl, ein Datum oder, was f\u00fcr PowerShell am wichtigsten ist, ein ganzes Objekt oder sogar eine Sammlung von Objekten. Der Variablenname in PowerShell beginnt immer mit einem Dollarzeichen ($). Beispiele: $name, $counter, $processList.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Spezielle Variable $_?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code class=\"\" data-line=\"\">$_<\/code>&nbsp;ist die Abk\u00fcrzung f\u00fcr &#8222;aktuelles Objekt&#8220; oder &#8222;dieses Ding&#8220;. Stellen Sie sich ein Flie\u00dfband in einer Fabrik vor. Verschiedene Teile (Objekte) fahren darauf entlang.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code class=\"\" data-line=\"\">$_<\/code>&nbsp;ist genau das Teil, das sich gerade vor Ihnen (oder vor dem Roboter-Bearbeiter) befindet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Quelle (Get-Process) \u2014 sch\u00fcttet eine ganze Kiste mit Teilen (allen Prozessen) auf das Flie\u00dfband.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pipeline (|) \u2014 l\u00e4sst diese Teile einzeln auf dem Band bewegen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bearbeiter (Where-Object oder ForEach-Object) \u2014 das ist ein Roboter, der jedes Teil betrachtet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Variable&nbsp;<code class=\"\" data-line=\"\">$_<\/code>&nbsp;\u2014 das ist genau das Teil, das sich gerade in den &#8222;H\u00e4nden&#8220; des Roboters befindet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn der Roboter mit einem Teil fertig ist, liefert das Flie\u00dfband das n\u00e4chste, und&nbsp;<code class=\"\" data-line=\"\">$_<\/code>&nbsp;wird nun auf dieses zeigen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lassen Sie uns berechnen, wie viel Speicher die&nbsp;<code class=\"\" data-line=\"\">svchost<\/code>-Prozesse insgesamt verwenden, und das Ergebnis auf dem Monitor anzeigen.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted line-numbers\"># 1. F\u00fchren Sie den Befehl aus und speichern Sie sein komplexes Ergebnisobjekt in der Variable $svchostMemory\n$svchostMemory = Get-Process -Name svchost | Measure-Object -Property WorkingSet64 -Sum\n\n# 2. Jetzt k\u00f6nnen wir mit dem gespeicherten Objekt arbeiten. Holen Sie die Sum-Eigenschaft daraus\n$memoryInMB = $svchostMemory.Sum \/ 1MB\n\n# 3. Zeigen Sie das Ergebnis auf dem Bildschirm an, indem Sie die neue Variable verwenden\nWrite-Host \"Alle svchost-Prozesse verwenden $memoryInMB MB Speicher.\"<\/pre>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/assets\/02\/4.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/raw\/master\/de\/assets\/02\/4.png\" alt=\"3\"\/><\/a><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">Write-Host<\/code>\u00a0\u2014 ist ein spezialisiertes Cmdlet, dessen einzige Aufgabe es ist,\u00a0<strong>Text direkt dem Benutzer in der Konsole anzuzeigen<\/strong>.<\/li>\n\n\n\n<li>Zeichenkette in doppelten Anf\u00fchrungszeichen:\u00a0<code class=\"\" data-line=\"\">&quot;...&quot;<\/code>\u00a0&#8211; eine Textzeichenkette, die wir dem Cmdlet\u00a0<code class=\"\" data-line=\"\">Write-Host<\/code>\u00a0als Argument \u00fcbergeben. Warum doppelte und nicht einfache Anf\u00fchrungszeichen?In PowerShell gibt es zwei Arten von Anf\u00fchrungszeichen:\n<ul class=\"wp-block-list\">\n<li><strong>Einfache (<code class=\"\" data-line=\"\">&#039;...&#039;<\/code>):<\/strong>\u00a0Erzeugen eine\u00a0<strong>buchst\u00e4bliche Zeichenkette<\/strong>. Alles, was sich darin befindet, wird als normaler Text behandelt, ohne Ausnahmen.<\/li>\n\n\n\n<li><strong>Doppelte (<code class=\"\" data-line=\"\">&quot;...&quot;<\/code>):<\/strong>\u00a0Erzeugen eine\u00a0<strong>erweiterbare (oder substituierbare) Zeichenkette<\/strong>. PowerShell &#8222;scannt&#8220; eine solche Zeichenkette nach Variablen (beginnend mit\u00a0<code class=\"\" data-line=\"\">$<\/code>) und ersetzt diese durch ihre Werte.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">$memoryInMB<\/code>. Dies ist die Variable, in die wir\u00a0<strong>im vorherigen Schritt<\/strong>\u00a0unseres Skripts das Ergebnis der Berechnungen gelegt haben. Wenn\u00a0<code class=\"\" data-line=\"\">Write-Host<\/code>\u00a0eine Zeichenkette in doppelten Anf\u00fchrungszeichen erh\u00e4lt, findet ein Prozess statt, der als\u00a0<strong>&#8222;Variablensubstitution&#8220; (String Expansion)<\/strong>\u00a0bezeichnet wird:\n<ol class=\"wp-block-list\">\n<li>PowerShell sieht den Text\u00a0<code class=\"\" data-line=\"\">&quot;Alle svchost-Prozesse verwenden &quot;<\/code>.<\/li>\n\n\n\n<li>Dann st\u00f6\u00dft es auf die Konstruktion\u00a0<code class=\"\" data-line=\"\">$memoryInMB<\/code>. Es versteht, dass dies nicht nur Text, sondern eine Variable ist.<\/li>\n\n\n\n<li>Es schaut im Speicher nach, findet den in\u00a0<code class=\"\" data-line=\"\">$memoryInMB<\/code>\u00a0gespeicherten Wert (z.B.\u00a0<code class=\"\" data-line=\"\">1585.52<\/code>).<\/li>\n\n\n\n<li>Es\u00a0<strong>ersetzt diesen Wert<\/strong>\u00a0direkt in der Zeichenkette.<\/li>\n\n\n\n<li>Dann f\u00fcgt es den restlichen Text hinzu:\u00a0<code class=\"\" data-line=\"\">&quot; MB Speicher.&quot;<\/code>.<\/li>\n\n\n\n<li>Am Ende wird an\u00a0<code class=\"\" data-line=\"\">Write-Host<\/code>\u00a0die fertige, zusammengesetzte Zeichenkette \u00fcbergeben:\u00a0<code class=\"\" data-line=\"\">&quot;Alle svchost-Prozesse verwenden 1585.52 MB Speicher.&quot;<\/code>.<\/li>\n<\/ol>\n<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Starten Sie den Editor:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Finden Sie den Editor-Prozess und speichern Sie ihn in der Variable $notepadProcess<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted line-numbers\">$notepadProcess = Get-Process -Name notepad<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Greifen Sie \u00fcber den Punkt auf die Eigenschaft &#8218;Id&#8216; dieses Objekts zu und geben Sie sie aus<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted line-numbers\">Write-Host \"Die ID des 'Editor'-Prozesses ist: $($notepadProcess.Id)\"<\/pre>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/assets\/02\/5.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/raw\/master\/de\/assets\/02\/5.png\" alt=\"5\"\/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u2757 Wichtig:<\/strong>&nbsp;Write-Host &#8222;bricht&#8220; die Pipeline. Der von ihm ausgegebene Text kann nicht zur weiteren Verarbeitung \u00fcber die Pipeline weitergeleitet werden. Er dient nur zur Anzeige.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Get-Member (Objektinspektor)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/02.md#3-get-member-objektinspektor\"><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wir wissen, dass Objekte durch die Pipeline &#8222;flie\u00dfen&#8220;. Aber wie erfahren wir, woraus sie bestehen? Welche Eigenschaften sie haben und welche Aktionen (Methoden) mit ihnen ausgef\u00fchrt werden k\u00f6nnen?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das Cmdlet&nbsp;<strong><code class=\"\" data-line=\"\">Get-Member<\/code><\/strong>&nbsp;(Alias:&nbsp;<code class=\"\" data-line=\"\">gm<\/code>) ist das Hauptwerkzeug zur Untersuchung. Bevor Sie mit einem Objekt arbeiten, leiten Sie es durch&nbsp;<code class=\"\" data-line=\"\">Get-Member<\/code>, um alle seine M\u00f6glichkeiten zu sehen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lassen Sie uns die Objekte analysieren, die&nbsp;<code class=\"\" data-line=\"\">Get-Process<\/code>&nbsp;erzeugt:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted line-numbers\">Get-Process | Get-Member<\/pre>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/assets\/02\/6.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/raw\/master\/de\/assets\/02\/6.png\" alt=\"6\"\/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Lassen Sie uns jeden Teil der Get-Member-Ausgabe aufschl\u00fcsseln.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code class=\"\" data-line=\"\">TypeName: System.Diagnostics.Process<\/code>&nbsp;&#8211; Dies ist der vollst\u00e4ndige, offizielle &#8222;Typname&#8220; des Objekts aus der .NET-Bibliothek. Es ist sein &#8222;Pass&#8220;. Diese Zeile sagt Ihnen, dass alle Objekte, die Get-Process zur\u00fcckgibt, Objekte vom Typ System.Diagnostics.Process sind. Dies garantiert, dass sie alle den gleichen Satz von Eigenschaften und Methoden haben werden. Sie k\u00f6nnen&nbsp;<a href=\"https:\/\/www.google.com\/search?q=System.Diagnostics.Process+site%3Amicrosoft.com\">googeln<\/a>&nbsp;&#8222;System.Diagnostics.Process&#8220;, um die offizielle Microsoft-Dokumentation mit noch detaillierteren Informationen zu finden.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Spalte 1:\u00a0<code class=\"\" data-line=\"\">Name<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Dies ist der einfache, menschenlesbare&nbsp;<strong>Name<\/strong>&nbsp;einer Eigenschaft, Methode oder eines anderen &#8222;Members&#8220; des Objekts. Genau diesen Namen werden Sie in Ihrem Code verwenden, um auf Daten zuzugreifen oder Aktionen auszuf\u00fchren.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Spalte 2:\u00a0<code class=\"\" data-line=\"\">MemberType<\/code>\u00a0(Objekttyp)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Dies ist die wichtigste Spalte zum Verst\u00e4ndnis. Sie klassifiziert,&nbsp;<strong>was<\/strong>&nbsp;jedes Objekt ist. Es ist seine &#8222;Rolle&#8220;, die Ihnen sagt,&nbsp;<strong>WIE<\/strong>&nbsp;es zu verwenden ist.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code class=\"\" data-line=\"\">Property<\/code>\u00a0(Eigenschaft):<\/strong><strong>Charakteristik<\/strong>\u00a0oder\u00a0<strong>Datenteil<\/strong>, der innerhalb des Objekts gespeichert ist. Sie k\u00f6nnen seinen Wert &#8222;lesen&#8220;.\n<ul class=\"wp-block-list\">\n<li><em>Beispiele im Screenshot:<\/em>\u00a0<code class=\"\" data-line=\"\">BasePriority<\/code>,\u00a0<code class=\"\" data-line=\"\">HandleCount<\/code>,\u00a0<code class=\"\" data-line=\"\">ExitCode<\/code>. Dies sind einfach Daten, die man sich ansehen kann.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong><code class=\"\" data-line=\"\">Method<\/code>\u00a0(Methode):<\/strong><strong>AKTION<\/strong>, die mit dem Objekt ausgef\u00fchrt werden kann. Methoden werden immer mit runden Klammern\u00a0<code class=\"\" data-line=\"\">()<\/code>\u00a0aufgerufen.\n<ul class=\"wp-block-list\">\n<li><em>Beispiele im Screenshot:<\/em>\u00a0<code class=\"\" data-line=\"\">Kill<\/code>,\u00a0<code class=\"\" data-line=\"\">Refresh<\/code>,\u00a0<code class=\"\" data-line=\"\">WaitForExit<\/code>. Sie w\u00fcrden\u00a0<code class=\"\" data-line=\"\">$process.Kill()<\/code>\u00a0oder\u00a0<code class=\"\" data-line=\"\">$process.Refresh()<\/code>\u00a0schreiben.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong><code class=\"\" data-line=\"\">AliasProperty<\/code>\u00a0(Alias-Eigenschaft):<\/strong><strong>freundlicher Alias<\/strong>\u00a0f\u00fcr eine andere, l\u00e4ngere Eigenschaft. PowerShell f\u00fcgt sie zur Bequemlichkeit und K\u00fcrze hinzu.\n<ul class=\"wp-block-list\">\n<li><em>Beispiele im Screenshot:<\/em>\u00a0<code class=\"\" data-line=\"\">WS<\/code>\u00a0\u2014 ist ein kurzer Alias f\u00fcr\u00a0<code class=\"\" data-line=\"\">WorkingSet64<\/code>.\u00a0<code class=\"\" data-line=\"\">Name<\/code>\u00a0\u2014 f\u00fcr\u00a0<code class=\"\" data-line=\"\">ProcessName<\/code>.\u00a0<code class=\"\" data-line=\"\">VM<\/code>\u00a0\u2014 f\u00fcr\u00a0<code class=\"\" data-line=\"\">VirtualMemorySize64<\/code>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong><code class=\"\" data-line=\"\">Event<\/code>\u00a0(Ereignis):<\/strong><strong>BENACHRICHTIGUNG<\/strong>\u00a0dar\u00fcber, dass etwas passiert ist, auf die man sich &#8222;abonnieren&#8220; kann.\n<ul class=\"wp-block-list\">\n<li><em>Beispiel im Screenshot:<\/em>\u00a0<code class=\"\" data-line=\"\">Exited<\/code>. Ihr Skript kann dieses Ereignis &#8222;abh\u00f6ren&#8220;, um eine Aktion auszuf\u00fchren, sobald der Prozess beendet ist.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong><code class=\"\" data-line=\"\">CodeProperty<\/code>\u00a0und\u00a0<code class=\"\" data-line=\"\">NoteProperty<\/code>:<\/strong>\u00a0Spezielle Eigenschaftstypen, oft hinzugef\u00fcgt von PowerShell selbst zur Bequemlichkeit.\u00a0<code class=\"\" data-line=\"\">CodeProperty<\/code>\u00a0berechnet seinen Wert &#8222;on the fly&#8220;, w\u00e4hrend\u00a0<code class=\"\" data-line=\"\">NoteProperty<\/code>\u00a0\u2014 eine einfache Notiz-Eigenschaft ist, die einem Objekt hinzugef\u00fcgt wird.<\/li>\n\n\n\n<li>Spalte 3:\u00a0<code class=\"\" data-line=\"\">Definition<\/code>\u00a0(Definition)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Dies ist die&nbsp;<strong>technische Definition<\/strong>&nbsp;oder &#8222;Signatur&#8220; des Members. Sie gibt Ihnen die genauen Details f\u00fcr seine Verwendung. Ihr Inhalt h\u00e4ngt vom&nbsp;<code class=\"\" data-line=\"\">MemberType<\/code>&nbsp;ab:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>F\u00fcr\u00a0<code class=\"\" data-line=\"\">AliasProperty<\/code>:<\/strong>\u00a0Zeigt an,\u00a0<strong>worum der Alias gleich ist<\/strong>. Das ist unglaublich n\u00fctzlich!\n<ul class=\"wp-block-list\">\n<li><em>Beispiel im Screenshot:<\/em>\u00a0<code class=\"\" data-line=\"\">WS = WorkingSet64<\/code>. Sie sehen sofort, dass\u00a0<code class=\"\" data-line=\"\">WS<\/code>\u00a0\u2014 einfach eine Kurzform f\u00fcr\u00a0<code class=\"\" data-line=\"\">WorkingSet64<\/code>\u00a0ist.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>F\u00fcr\u00a0<code class=\"\" data-line=\"\">Property<\/code>:<\/strong>\u00a0Zeigt den\u00a0<strong>Datentyp<\/strong>\u00a0an, der in der Eigenschaft gespeichert ist (z.B.\u00a0<code class=\"\" data-line=\"\">int<\/code>\u00a0f\u00fcr eine ganze Zahl,\u00a0<code class=\"\" data-line=\"\">string<\/code>\u00a0f\u00fcr Text,\u00a0<code class=\"\" data-line=\"\">datetime<\/code>\u00a0f\u00fcr Datum und Uhrzeit), und was damit gemacht werden kann (<code class=\"\" data-line=\"\">{get;}<\/code>\u00a0\u2013 nur lesen,\u00a0<code class=\"\" data-line=\"\">{get;set;}<\/code>\u00a0\u2013 lesen und \u00e4ndern).\n<ul class=\"wp-block-list\">\n<li><em>Beispiel im Screenshot:<\/em>\u00a0<code class=\"\" data-line=\"\">int BasePriority {get;}<\/code>. Dies ist eine Ganzzahleigenschaft, die nur gelesen werden kann.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>F\u00fcr\u00a0<code class=\"\" data-line=\"\">Method<\/code>:<\/strong>\u00a0Zeigt an, was die Methode zur\u00fcckgibt (z.B.\u00a0<code class=\"\" data-line=\"\">void<\/code>\u00a0\u2013 nichts,\u00a0<code class=\"\" data-line=\"\">bool<\/code>\u00a0\u2013 true\/false) und welche\u00a0<strong>Parameter<\/strong>\u00a0(Eingabedaten) sie in Klammern akzeptiert.\n<ul class=\"wp-block-list\">\n<li><em>Beispiel im Screenshot:<\/em>\u00a0<code class=\"\" data-line=\"\">void Kill()<\/code>. Das bedeutet, dass die Methode\u00a0<code class=\"\" data-line=\"\">Kill<\/code>\u00a0nichts zur\u00fcckgibt und ohne Parameter aufgerufen werden kann. Es gibt auch eine zweite Version\u00a0<code class=\"\" data-line=\"\">void Kill(bool entireProcessTree)<\/code>, die einen booleschen Wert (true\/false) akzeptiert.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">In Tabellenform<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/02.md#in-tabellenform\"><\/a><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kolumna<\/th><th>Was ist das?<\/th><th>Beispiel aus dem Screenshot<\/th><th>Wof\u00fcr?<\/th><\/tr><\/thead><tbody><tr><td><strong>Name<\/strong><\/td><td>Der Name, den Sie im Code verwenden.<\/td><td><code class=\"\" data-line=\"\">Kill<\/code>,&nbsp;<code class=\"\" data-line=\"\">WS<\/code>,&nbsp;<code class=\"\" data-line=\"\">Name<\/code><\/td><td>um auf eine Eigenschaft oder Methode zuzugreifen (<code class=\"\" data-line=\"\">$process.WS<\/code>,&nbsp;<code class=\"\" data-line=\"\">$process.Kill()<\/code>).<\/td><\/tr><tr><td><strong>MemberType<\/strong><\/td><td>Der Typ des Members (Daten, Aktion usw.).<\/td><td><code class=\"\" data-line=\"\">Method<\/code>,&nbsp;<code class=\"\" data-line=\"\">Property<\/code>,&nbsp;<code class=\"\" data-line=\"\">AliasProperty<\/code><\/td><td><strong>wie<\/strong>&nbsp;es zu verwenden ist (Wert lesen oder mit&nbsp;<code class=\"\" data-line=\"\">()<\/code>&nbsp;aufrufen).<\/td><\/tr><tr><td><strong>Definition<\/strong><\/td><td>Technische Details.<\/td><td><code class=\"\" data-line=\"\">WS = WorkingSet64<\/code>,&nbsp;<code class=\"\" data-line=\"\">void Kill()<\/code><\/td><td>was sich hinter dem Alias verbirgt und welche Parameter die Methode ben\u00f6tigt.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Beispiel: Arbeiten mit Prozessfenstern<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/02.md#beispiel-arbeiten-mit-prozessfenstern\"><\/a><\/p>\n\n\n\n<h5 class=\"wp-block-heading\">1. Problem:<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/02.md#1-problem\"><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8222;Ich habe viele Editor-Fenster ge\u00f6ffnet. Wie kann ich programmatisch alle au\u00dfer dem Hauptfenster minimieren und dann nur das schlie\u00dfen, dessen Titel das Wort &#8218;Untitled&#8216; enth\u00e4lt?&#8220;<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">2. Untersuchung mit&nbsp;<code class=\"\" data-line=\"\">Get-Member<\/code>:<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/02.md#2-untersuchung-mit-get-member\"><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wir m\u00fcssen Eigenschaften finden, die mit dem Fenster und seinem Titel zusammenh\u00e4ngen.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted line-numbers\">Get-Process -Name notepad | Get-Member<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Analyse des&nbsp;<code class=\"\" data-line=\"\">Get-Member<\/code>-Ergebnisses:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Beim Durchsuchen der Eigenschaften finden wir\u00a0<code class=\"\" data-line=\"\">MainWindowTitle<\/code>. Typ\u00a0<code class=\"\" data-line=\"\">string<\/code>. Ausgezeichnet, das ist der Titel des Hauptfensters!<\/li>\n\n\n\n<li>In den Methoden sehen wir\u00a0<code class=\"\" data-line=\"\">CloseMainWindow()<\/code>. Dies ist eine &#8222;sanftere&#8220; Methode zum Schlie\u00dfen eines Fensters als\u00a0<code class=\"\" data-line=\"\">Kill()<\/code>.<\/li>\n\n\n\n<li>Auch in den Methoden gibt es\u00a0<code class=\"\" data-line=\"\">WaitForInputIdle()<\/code>. Klingt interessant, vielleicht hilft es, zu warten, bis der Prozess zur Interaktion bereit ist.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/assets\/02\/7.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/raw\/master\/de\/assets\/02\/7.png\" alt=\"7\"\/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><code class=\"\" data-line=\"\">Get-Member<\/code>&nbsp;zeigte uns die Eigenschaft&nbsp;<code class=\"\" data-line=\"\">MainWindowTitle<\/code>, die der Schl\u00fcssel zur L\u00f6sung der Aufgabe ist und es erm\u00f6glicht, mit Prozessen basierend auf dem Zustand ihrer Fenster zu interagieren, und nicht nur nach Namen.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">3. L\u00f6sung:<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/02.md#3-l%C3%B6sung\"><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jetzt k\u00f6nnen wir eine Logik aufbauen, die auf dem Fenstertitel basiert.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted line-numbers\"># 1. Finden Sie alle Editor-Prozesse\n$notepads = Get-Process -Name notepad\n\n# 2. Gehen Sie jeden einzelnen durch und \u00fcberpr\u00fcfen Sie den Titel\nforeach ($pad in $notepads) {\n    # F\u00fcr jeden Prozess ($pad) \u00fcberpr\u00fcfen Sie seine Eigenschaft MainWindowTitle\n    if ($pad.MainWindowTitle -like '*Untitled*') {\n        Write-Host \"Unsaved Notepad gefunden (ID: $($pad.Id)). Schlie\u00dfe sein Fenster...\"\n        # $pad.CloseMainWindow() # Auskommentieren, um tats\u00e4chlich zu schlie\u00dfen\n        Write-Host \"Fenster '$($pad.MainWindowTitle)' w\u00e4re geschlossen worden.\" -ForegroundColor Yellow\n    } else {\n        Write-Host \"\u00dcberspringe Notepad mit Titel: $($pad.MainWindowTitle)\"\n    }\n}<\/pre>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/assets\/02\/8.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/raw\/master\/de\/assets\/02\/8.png\" alt=\"8\"\/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/assets\/02\/9.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/raw\/master\/de\/assets\/02\/9.png\" alt=\"9\"\/><\/a><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Beispiel: \u00dcbergeordneten Prozess finden<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/02.md#beispiel-%C3%BCbergeordneten-prozess-finden\"><\/a><\/p>\n\n\n\n<h5 class=\"wp-block-heading\">1. Problem:<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/02.md#1-problem-1\"><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8222;Manchmal sehe ich viele untergeordnete&nbsp;<code class=\"\" data-line=\"\">chrome.exe<\/code>-Prozesse im System. Wie finde ich heraus, welcher davon der Haupt-, &#8222;\u00fcbergeordnete&#8220; Prozess ist, der sie alle gestartet hat?&#8220;<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">2. Untersuchung mit&nbsp;<code class=\"\" data-line=\"\">Get-Member<\/code>:<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/02.md#2-untersuchung-mit-get-member-1\"><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wir m\u00fcssen etwas finden, das einen Prozess mit einem anderen verbindet.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted line-numbers\">Get-Process -Name chrome | Select-Object -First 1 | Get-Member<\/pre>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/assets\/02\/10.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/raw\/master\/de\/assets\/02\/10.png\" alt=\"10\"\/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Analyse des&nbsp;<code class=\"\" data-line=\"\">Get-Member<\/code>-Ergebnisses:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Beim sorgf\u00e4ltigen Durchsuchen der Liste, finden wir eine Eigenschaft vom Typ\u00a0<code class=\"\" data-line=\"\">CodeProperty<\/code>\u00a0mit dem Namen\u00a0<code class=\"\" data-line=\"\">Parent<\/code>.<\/li>\n\n\n\n<li>Ihre Definition (<code class=\"\" data-line=\"\">Definition<\/code>) \u2014\u00a0<code class=\"\" data-line=\"\">System.Diagnostics.Process Parent{get=GetParentProcess;}<\/code>. Dies ist eine berechnete Eigenschaft, die beim Zugriff ein\u00a0<strong>Objekt des \u00fcbergeordneten Prozesses<\/strong>\u00a0zur\u00fcckgibt.<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">3. L\u00f6sung:<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/02.md#3-l%C3%B6sung-1\"><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jetzt k\u00f6nnen wir ein Skript schreiben, das f\u00fcr jeden&nbsp;<code class=\"\" data-line=\"\">chrome<\/code>-Prozess Informationen \u00fcber seinen \u00fcbergeordneten Prozess ausgibt.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted line-numbers\"># 1. Alle Chrome-Prozesse abrufen\n$chromeProcesses = Get-Process -Name chrome\n\n# 2. F\u00fcr jeden von ihnen Informationen \u00fcber sich selbst und seinen \u00fcbergeordneten Prozess ausgeben\n$chromeProcesses | Select-Object -First 5 | ForEach-Object {\n    # Den \u00fcbergeordneten Prozess abrufen\n    $parent = $_.Parent\n    \n    # Sch\u00f6ne Ausgabe formatieren\n    Write-Host \"Prozess:\" -ForegroundColor Green\n    Write-Host \"  - Name: $($_.ProcessName), ID: $($_.Id)\"\n    Write-Host \"Sein \u00fcbergeordneter Prozess:\" -ForegroundColor Yellow\n    Write-Host \"  - Name: $($parent.ProcessName), ID: $($parent.Id)\"\n    Write-Host \"-----------------------------\"\n}<\/pre>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/assets\/02\/11.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/raw\/master\/de\/assets\/02\/11.png\" alt=\"11\"\/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/assets\/02\/12.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/raw\/master\/de\/assets\/02\/12.png\" alt=\"12\"\/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Wir sehen sofort, dass die Prozesse mit den IDs 4756, 7936, 8268 und 9752 vom Prozess mit der ID 14908 gestartet wurden. Auch kann man einen interessanten Fall mit dem Prozess ID: 7252 bemerken, dessen \u00fcbergeordneter Prozess nicht ermittelt werden konnte (m\u00f6glicherweise hatte sich der \u00fcbergeordnete Prozess zum Zeitpunkt der \u00dcberpr\u00fcfung bereits beendet). Eine Modifikation des Skripts mit der \u00dcberpr\u00fcfung if ($parent) behandelt diesen Fall elegant, ohne einen Fehler zu verursachen. Get-Member half uns, die &#8222;versteckte&#8220; Eigenschaft Parent zu entdecken, die leistungsstarke M\u00f6glichkeiten zur Analyse der Prozesshierarchie bietet.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">4. Datei&nbsp;<em>.ps1<\/em>&nbsp;(Skripte erstellen)<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/02.md#4-datei-ps1-skripte-erstellen\"><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn Ihre Befehlskette n\u00fctzlich wird, m\u00f6chten Sie sie zur mehrfachen Verwendung speichern. Daf\u00fcr sind&nbsp;<strong>Skripte<\/strong>&nbsp;da \u2013 Textdateien mit der Erweiterung&nbsp;<strong><code class=\"\" data-line=\"\">.ps1<\/code><\/strong>.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Berechtigung zum Ausf\u00fchren von Skripten<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/02.md#berechtigung-zum-ausf%C3%BChren-von-skripten\"><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Standardm\u00e4\u00dfig ist die Ausf\u00fchrung lokaler Skripte unter Windows verboten. Um dies&nbsp;<strong>f\u00fcr den aktuellen Benutzer<\/strong>&nbsp;zu beheben, f\u00fchren Sie einmal in PowerShell&nbsp;<strong>als Administrator<\/strong>&nbsp;aus:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted line-numbers\">Set-ExecutionPolicy RemoteSigned -Scope CurrentUser<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dies ist eine sichere Einstellung, die es Ihnen erlaubt, Ihre eigenen Skripte und Skripte, die von einem vertrauensw\u00fcrdigen Herausgeber signiert wurden, auszuf\u00fchren.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Beispielskript&nbsp;<code class=\"\" data-line=\"\">system_monitor.ps1<\/code><\/h5>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/02.md#beispielskript-system_monitorps1\"><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Erstellen Sie eine Datei mit diesem Namen und f\u00fcgen Sie den folgenden Code ein. Dieses Skript sammelt Systeminformationen und generiert Berichte.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted line-numbers\"># system_monitor.ps1\n#requires -Version 5.1\n\n<#\n.SYNOPSIS\n    Skript zur Erstellung eines Systemstatusberichts.\n.DESCRIPTION\n    Sammelt Informationen \u00fcber Prozesse, Dienste und Speicherplatz und generiert Berichte.\n.PARAMETER OutputPath\n    Pfad zum Speichern der Berichte. Standard ist 'C:\\Temp'.\n.EXAMPLE\n    .\\system_monitor.ps1 -OutputPath \"C:\\Reports\"\n#>\nparam(\n    [Parameter(Mandatory=$false)]\n    [string]$OutputPath = \"C:\\Temp\"\n)\n\n# --- Block 1: Vorbereitung ---\nWrite-Host \"Vorbereitung zur Berichterstellung...\" -ForegroundColor Cyan\nif (!(Test-Path $OutputPath)) {\n    New-Item -ItemType Directory -Path $OutputPath -Force | Out-Null\n}\n\n# --- Block 2: Datenerfassung ---\nWrite-Host \"Informationen sammeln...\" -ForegroundColor Green\n$processes = Get-Process | Sort-Object CPU -Descending\n$services = Get-Service | Group-Object Status | Select-Object Name, Count\n\n# --- Block 3: Aufruf der Exportfunktion (siehe n\u00e4chster Abschnitt) ---\nExport-Results -Processes $processes -Services $services -OutputPath $OutputPath\n\nWrite-Host \"Berichte erfolgreich im Ordner $OutputPath\" -ForegroundColor Magenta<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Hinweis: Die Funktion&nbsp;<code class=\"\" data-line=\"\">Export-Results<\/code>&nbsp;wird im n\u00e4chsten Abschnitt als Beispiel f\u00fcr bew\u00e4hrte Verfahren definiert.<\/em><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">5. Export von Ergebnissen<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/02.md#5-export-von-ergebnissen\"><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Reine Daten \u2014 das ist gut, aber oft m\u00fcssen sie in einem f\u00fcr Menschen oder andere Programme geeigneten Format pr\u00e4sentiert werden. PowerShell bietet viele Cmdlets f\u00fcr den Export.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Methode<\/th><th>Befehl<\/th><th>Beschreibung<\/th><\/tr><\/thead><tbody><tr><td><strong>Einfacher Text<\/strong><\/td><td><code class=\"\" data-line=\"\">... | Out-File C:\\Temp\\data.txt<\/code><\/td><td>Leitet die Textdarstellung in eine Datei um.<\/td><\/tr><tr><td><strong>CSV (f\u00fcr Excel)<\/strong><\/td><td><code class=\"\" data-line=\"\">... | Export-Csv C:\\Temp\\data.csv -NoTypeInfo<\/code><\/td><td>Exportiert Objekte in CSV.&nbsp;<code class=\"\" data-line=\"\">-NoTypeInfo<\/code>&nbsp;entfernt die erste Dienstzeile.<\/td><\/tr><tr><td><strong>HTML-Bericht<\/strong><\/td><td><code class=\"\" data-line=\"\">... | ConvertTo-Html -Title &quot;Bericht&quot;<\/code><\/td><td>Erstellt HTML-Code aus Objekten.<\/td><\/tr><tr><td><strong>JSON (f\u00fcr API, Web)<\/strong><\/td><td><code class=\"\" data-line=\"\">... | ConvertTo-Json<\/code><\/td><td>Konvertiert Objekte in das JSON-Format.<\/td><\/tr><tr><td><strong>XML (natives PowerShell-Format)<\/strong><\/td><td><code class=\"\" data-line=\"\">... | Export-Clixml C:\\Temp\\data.xml<\/code><\/td><td>Speichert Objekte mit allen Datentypen. Sie k\u00f6nnen perfekt \u00fcber&nbsp;<code class=\"\" data-line=\"\">Import-Clixml<\/code>&nbsp;wiederhergestellt werden.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h5 class=\"wp-block-heading\">Erg\u00e4nzung zum Skript: Exportfunktion<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/02.md#erg%C3%A4nzung-zum-skript-exportfunktion\"><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcgen wir unserem Skript&nbsp;<code class=\"\" data-line=\"\">system_monitor.ps1<\/code>&nbsp;eine Funktion hinzu, die sich um den Export k\u00fcmmert. Platzieren Sie diesen Code&nbsp;<strong>vor<\/strong>&nbsp;dem Aufruf von&nbsp;<code class=\"\" data-line=\"\">Export-Results<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted line-numbers\">function Export-Results {\n    param(\n        $Processes,\n        $Services,\n        $OutputPath\n    )\n\n    $timestamp = Get-Date -Format \"yyyy-MM-dd_HH-mm\"\n\n    # Export nach CSV\n    $Processes | Select-Object -First 20 | Export-Csv (Join-Path $OutputPath \"processes_$timestamp.csv\") -NoTypeInformation\n    $Services | Export-Csv (Join-Path $OutputPath \"services_$timestamp.csv\") -NoTypeInformation\n\n    # Erstellung eines sch\u00f6nen HTML-Berichts\n    $htmlReportPath = Join-Path $OutputPath \"report_$timestamp.html\"\n    $processesHtml = $Processes | Select-Object -First 10 Name, Id, CPU | ConvertTo-Html -Fragment -PreContent \"<h2>Top 10 Prozesse nach CPU<\/h2>\"\n    $servicesHtml = $Services | ConvertTo-Html -Fragment -PreContent \"<h2>Dienststatistik<\/h2>\"\n\n    ConvertTo-Html -Head \"<title>Systembericht<\/title>\" -Body \"<h1>Systembericht vom $(Get-Date)<\/h1> $($processesHtml) $($servicesHtml)\" | Out-File $htmlReportPath\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Jetzt sammelt unser Skript nicht nur Daten, sondern speichert sie auch sauber in zwei Formaten: CSV zur Analyse und HTML zur schnellen Ansicht.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Fazit<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/hypo69\/The-Philosophy-of-PowerShell-ru\/blob\/master\/de\/02.md#fazit\"><\/a><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Pipeline (<code class=\"\" data-line=\"\">|<\/code>)<\/strong>\u00a0\u2013 das Hauptwerkzeug zum Kombinieren von Befehlen und Verarbeiten von Objekten.<\/li>\n\n\n\n<li><strong><code class=\"\" data-line=\"\">Get-Member<\/code><\/strong>\u00a0\u2013 Objektanalyse, die zeigt, woraus sie bestehen.<\/li>\n\n\n\n<li><strong>Variablen (<code class=\"\" data-line=\"\">$var<\/code>,\u00a0<code class=\"\" data-line=\"\">$_<\/code>)<\/strong>\u00a0erm\u00f6glichen das Speichern von Daten und den Zugriff auf das aktuelle Objekt in der Pipeline.<\/li>\n\n\n\n<li><strong><code class=\"\" data-line=\"\">.ps1<\/code>-Dateien<\/strong>\u00a0verwandeln Befehle in wiederverwendbare Automatisierungswerkzeuge.<\/li>\n\n\n\n<li><strong>Export-Cmdlets<\/strong>\u00a0(<code class=\"\" data-line=\"\">Export-Csv<\/code>,\u00a0<code class=\"\" data-line=\"\">ConvertTo-Html<\/code>) exportieren Daten im entsprechenden Format.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Im n\u00e4chsten Teil werden wir dieses Wissen anwenden, um Dateisysteme zu navigieren und zu verwalten, indem wir die Objekte&nbsp;<code class=\"\" data-line=\"\">System.IO.DirectoryInfo<\/code>&nbsp;und&nbsp;<code class=\"\" data-line=\"\">System.IO.FileInfo<\/code>&nbsp;untersuchen.<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u2757 Wichtig:&nbsp;Ich schreibe \u00fcber PS7 (PowerShell 7). Es unterscheidet sich von PS5 (PowerShell 5). Ab der siebten Version wurde PowerShell plattform\u00fcbergreifend. Aus diesem Grund hat sich das Verhalten einiger Befehle ge\u00e4ndert. Im ersten Teil haben wir das Schl\u00fcsselprinzip festgelegt: PowerShell arbeitet mit&nbsp;Objekten, nicht mit Text. Dieser Beitrag widmet sich einigen wichtigen PowerShell-Tools: Wir lernen, Objekte&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":"on","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-634","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/posts\/634","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=634"}],"version-history":[{"count":0,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/posts\/634\/revisions"}],"wp:attachment":[{"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/media?parent=634"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/categories?post=634"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/tags?post=634"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}