Peter Gyger online

"Gring ache u seckle" (Quelle: A. Weyermann)

NAVIGATION - SEARCH

Visual Studio Code Ver 1.13

Dank dem Hinweis eines Profi Entwicklers wurde ich vor einiger Zeit auf den Editor "Visual Studio Code" aufmerksam. Gestertn auf die Version 1.13 upgedatet. Heute Abend - sofern eine Zeitscheibe von 30 Min frei sein wird - werde ich die Änderungen näher anschauen. Nach dem Einstieg mit diesem Microsoft Tutorial bin ich von diesem Editor begeistert.   Swisscom Internet-Box und die weisse Led. Wenn auf der Internet-Box die Led weiss leuchtet, dann sollte der WAN Teil des Routers verbunden sein. Wenn nun jemand "kein Internet" hat und sieht das das weisse Led nicht leuchtet, dann ist klar das das Internet ausgefallen ist. Falsch. Ein Test mit dem Browser mit dem Zugriff auf den Router (192.168.1.1) ergab, dass der LAN Zugriff nicht funktionierte. Auf die Nachfrage und Test ergab sich, dass das Gerät über WLAN verbunden ist. Und das andere Geräte (Smartphone / Tablet) im LAN / WLAN Zugriff erfolgreich sind. Die dunkle Led auf der Internet-Box war ein Geschenk des Partners. Dieser hatte entdeckt, dass in der Internet-Box - Rubrik Internet - dieses Licht abgeschaltet werden kann. Es störte in der Nacht...   Wenn man einen VOIP geschalteten Anschluss hat und es treten Probleme (entgangene Anrufe werden auf den Telefonen nicht optisch signalisiert, etc.), dann kann folgender Sachverhalt die Ursache sein. In der analogen Telefonie (POTS) hatten angeschlossene Telefone keine Rückwirkungsmöglichkeit auf die andren Geräte. Das hat sich geändert. Z.B. sind bei der Swisscom Internet-Box die Festnetz Telefone über ATA - Schnittstelle (analoge Telefone) DECT Ethernet angeschlossen Jedes Gerät kommunizier direkt mit der VOIP SW im Router und kann den Status der Software ändern. Und das betrifft dann alle Geräte. Speziell Geräte die über das Protokoll Cat-Iq Version 1 angemeldet sind. Das habe ich wiederholt erlebt.   Die C'T Uplink 16.4 hat mir einiges zum Thema Tintenstrahldrucker erzählt, was ich nicht wusste. Farblaser scheinen ein generelles Sicherheitsproblem zu sein, da sie die gedruckten Blätter mit Farbpunkten markieren.   Semper Video hat ein Videotutorial zur Installation der Software OpenVPN Server auf Linux online gestellt. Gewohnt professionell und sauber recherchiert.

Powershell Skript über ein anderes Skript starten

In einer Batch Datei (.CMD unter Windows) kann ich eine andere Batchdatei direkt über den Befehl "Call" aufrufen. In den "Windows Basic Script" ("VBS"), definiere ich ein Objekt vom Typ  "Wscript.Shell" und nutzte die Methode "run" Dim Obj_WshShellSet Obj_WShell = CreateObject("WScript.Shell")Obj_WShell.Run "wscript.exe C:\temp\2esSkript.vbs" , 1, True   Wie sieht das nun in Powershell aus? Wie funktioniert es genau, wenn ich aus einer .ps1 Datei eine andere .ps1 Datei aufrufen will? In meinem Test liegt in einem Verzeichnis "C:\Temp\ps-run-ps" zwei Dateien: "eins.ps1" und "zwei.ps". "eins.ps1" ruft "zwei.ps1" auf. "zwei.ps1" zeigt eine Meldung ("Hello World") auf dem Bildschirm an. Code: ******* #Datei eins.ps1. C:\Temp\ps-run-ps\zwei.ps1 *********** *********** #Datei zwei.ps1write-host "Hello Wordl" ************  Das funktioniert. Das aufrufende Skript bricht nicht ab. D.h. das zweite Skript "erbt" somit auch die Variabeln. Vergleichbar mit dem guten alten "CALL" Befehl in der Batch Sprache. Wenn man nicht mit Sicherheit bestimmen kann, in welche Verzeichnis ein Powershellskript läuft, muss der Aufruf des zweiten "dynamisch" erfolgen. Das erste wird durch einen Auslöser (Mensch, Dienst, Scheduler) ausserhalb des Skriptes erfolgen. Das Verzeichnis in dem das aktuell laufende Skript sich befindet, kann mit dem CMDLET "Get-Location" ermittelt werden. D.h. der Code des Skriptes eins sieht so aus: ******* #Datei eins.ps1 #Datei eins$where_am_i = $(Get-Location).Path$where_am_i = $where_am_i + "\zwei.ps1". $where_am_i *********** Der Punkt und Leerschlag ist zwingend, wenn man in Powershell ein anderes PS Skript ausführen will. Den Hinweis fand ich auf der Website von Kai Yorch. Weiterführende Informationen zum starten von Programmen in PS Skripten hat das deutsche PS Urgestein Peter Kriegel in einem Artikel vollständig und gut strukturiert erklärt. "Nice to know". Die Beispiele sind während des Schreibens dieses Post's live erstellt und 1:1 eingefügt worden. D.h. die Beispiele funktionieren auf diesem Computer (Win 10 Prof) in einer Standardumgebung. Vielleicht spart es ja einem der Leser ein paar Stunden Recherche und ausprobieren.      

Powershell mit TagLib / taglib-sharp.dll nutzen

Ob man nun Go spielt, ein Sudoku löst oder mit einem Computer programmiert ist aus meiner Sicht gleichwertig. Es zählt, dass man Freude am lernen hat und sich ganz und gar auf eine Aufgabe konzentriert. Meine Begeisterung habe ich in der Programmierung mit Skripten gefunden. Aktuell Powershell, daher auch dieser Blogpost. TagLib TagLib ist eine freie Programmbibliothek zur Bearbeitung von Metainformationen in Audiodateien. Ein deutscher Wikipedia Artikel weiss mehr.  Diese Bibliothek ermöglicht u.a. den Zugriff auf Mediendateien mit MS Powershell. Für die auf dem Microsoft .NET Framework basierten Programme, heisst die Bibliothek "taglib-sharp". Hier der download über eine ZIP-Datei. In Powershell wird eine DLL wie folgt eingebunden: [Reflection.Assembly]::LoadFrom([Pfad zur DLL]) Beispiel: [Reflection.Assembly]::LoadFrom("C:\Program Files\PS1\Podcast-download\taglib-sharp.dll")   Welchen praktischen Nutzen hat das? Beispiel 1: Wir haben unsere Musik in einem Verzeichnisbaum gespeichert. Struktur: [Künstler] \ [Album]. Das "Cover" des Albums ist im Verzeichnis des Albumes mit dem Namen "folder.jpg" abgelegt. "PNG" wäre besser (Transparenz Ebenen), jedoch beherschen nicht alle Mediensoftware (Kodi / Plex / etc.) dieses Bildformat. Damit beim abspielen der einzelnen Titel, dass "Cover" angezeigt wird, muss die Datei "folder.jpg" in das entsprechende Tag der Mediendatei geschrieben werden. Tools wie "MP3TAG" sind dafür und vieles andere ideal. Jedoch geht es auch automatisch. Z.B. mit dieserm Powershell Skript. Dieses Skript liest nur Audiodateien des Formates "Flac" ein, da meine Musiksammlung keine MP3 Dateien beinhaltet. D.h. diese Zeile muss nach persönlichem Bedarf geändert / ergänzt werden. #Name:                        Musikdateien in Verzeichnisstruktur - Eigenschaft Bild - Wert zuweisen#Autor:                       Peter Gyger#Version:                     1.0#Datum der letzten Änderung:  18.04.2017#Wenn im Verzeichnis der MP3 / Flac Dateien eine Bilddatei folder.jpg existiert, wird diese den Dateien hinzugefügt. "folder.jpg" wird von Kodi automatisch erkannt.#laden der DLL[Reflection.Assembly]::LoadFrom("C:\Users\Peter\Documents\000 Peter\004 Projekt\Podcast verwalten\taglib-sharp.dll")$hieristdiemusik ="C:\Temp\000 Musik"#Mit Foreach alle Musikdaten eines Verzeichnisbaumes findenforeach ($datei in get-childitem $hieristdiemusik -Filter *.flac -recurse){    #Datei öffen    $musikdatei = [TagLib.File]::Create($datei.fullname)    #prüfen ob die Datei folder.jpg existiert    if (test-path ($datei.Directoryname+"\folder.jpg")){        #dann das bild folder.jpg der Variabeln $albumbild zuweisen        $albumbild = [taglib.picture]::createfrompath($datei.Directoryname+"\folder.jpg")        }     #Datei Eigenschaft das Bild zuweisen und speichern    $musikdatei.tag.Pictures = $albumbild    $musikdatei.save()    $albumbild = ""    $musikdatei = ""    #Anzeige in der PS Konsole, was gerade abgeschlossen wurde    write-output ($datei.FullName +" mit Bild ergänzt")} Man kopiert das Skript in eine Editor, ändert den Wert der Variable "$hieristdiemusik" auf das eigene Musikverzeichnis und speichert die Datei mit der Erweiterung ".PS1" ab. Diese kann nun auf eigenes Risiko - trotz sorgfältiger Erstellung - in der Powershell Konsole oder über Rechtsklick im Win Explorer gestartet werden. Natürlich wäre ein Befehl wie "InputBox" den man aus Basic (VBA, VB-Script, etc.) kennt praktisch. Dann müsste man nicht im Skript den Wert der Variable "$hieristdiemusik" anpassen. Diesen Befehl ("CMDLET") gibt es in Powershell nicht. Microsoft hat einen einen Artikel mit vollständigem Beispiel veröffentlicht, wie das in Powershell umgesetzt werden kann. Diesen Code kann man in ein eigenes Modul speichern und bei Bedarf in ein Powershell Skript einbinden. Im zweiten Beispiel habe ich den Code der InputBox direkt in das Skript kopiert. Das macht es einfacher das Programm zu überblicken. Das nachfolgende Programm holt MP3 Dateien ("Podcast") aus einer Website und speichert sie lokal. Das Programm fragt nach einer URL und holt danach die erreichbaren MP3 Dateien ab. Aktuell getestet und verwendet für die SRF Podcasts. Beispiele für solche URL: http://pod.drs.ch/wissenschaft_drs_2_mpx.xml http://pod.drs.ch/country_special_mpx.xml http://podcasts.srf.ch/fiori_musicali_mpx.xml http://pod.drs.ch/diskothek_im_zwei_mpx.xml http://podcasts.srf.ch/100_sekunden_wissen_mpx.xml http://podcasts.srf.ch/regionaljournal_zh_mpx.xml http://pod.drs.ch/espresso_mpx.xml   #Name:                        MP3 Dateien aus RSS Feed (Podcast) downloaden#Autor:                       Peter Gyger#Version:                     0.9#Datum der letzten Änderung:  11.02.2017[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") $objForm = New-Object System.Windows.Forms.Form $objForm.Text = "Podcast Download"$objForm.Size = New-Object System.Drawing.Size(300,200) $objForm.StartPosition = "CenterScreen"$objForm.KeyPreview = $True$objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter")     {$x=$objTextBox.Text;$objForm.Close()}})$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape")     {$objForm.Close()}})$OKButton = New-Object System.Windows.Forms.Button$OKButton.Location = New-Object System.Drawing.Size(75,120)$OKButton.Size = New-Object System.Drawing.Size(75,23)$OKButton.Text = "OK"$OKButton.Add_Click({$script:x=$objTextBox.Text;$objForm.Close()})$objForm.Controls.Add($OKButton)$CancelButton = New-Object System.Windows.Forms.Button$CancelButton.Location = New-Object System.Drawing.Size(150,120)$CancelButton.Size = New-Object System.Drawing.Size(75,23)$CancelButton.Text = "Cancel"$CancelButton.Add_Click({$objForm.Close()})$objForm.Controls.Add($CancelButton)$objLabel = New-Object System.Windows.Forms.Label$objLabel.Location = New-Object System.Drawing.Size(10,20) $objLabel.Size = New-Object System.Drawing.Size(280,20) $objLabel.Text = "Bitte den Link hier eingeben"$objForm.Controls.Add($objLabel) $objTextBox = New-Object System.Windows.Forms.TextBox $objTextBox.Location = New-Object System.Drawing.Size(10,40) $objTextBox.Size = New-Object System.Drawing.Size(260,20) $objForm.Controls.Add($objTextBox) $objForm.Topmost = $True$objForm.Add_Shown({$objForm.Activate()})[void] $objForm.ShowDialog()#write-host "x is $x"$fileURL =$x #prüfen ob eine URL eingegeben wurde. Bsp.: http://pod.drs.ch/jazz_collection_mpx.xmlif (!$fileURL) {exit}$web = New-Object System.Xml.XmlDocument$web.Load($fileURL)$fileslash = $fileURL.LastIndexOf("/") +1$fileName =$fileURL.substring($fileslash)$dirname = $fileName.substring(0,$fileName.Length -4)#Überprüfen ob das Verzeichnis c:\temp\ und Unterverzeichnis mypodcast existiertIf (!(Test-Path c:\temp)){    write-host c-temp erstellen    New-Item c:\temp -ItemType directory}If (!(Test-Path c:\temp\mypodcast)){    write-host c-temp mypodcast    New-Item c:\temp\mypodcast -ItemType directory}Set-Location c:\temp\mypodcast#Verzeichnis mit dem Namen des Podcasts erstellen$dirname = $fileName.substring(0,$fileName.Length -4)If (!(Test-Path c:\temp\mypodcast\$dirname)){    Write-Host neues verzeichnis erstellen    write-host $dirname    New-Item c:\temp\mypodcast\$dirname -ItemType directory}Set-Location c:\temp\mypodcast\$dirname # *** Teil 2 *** ##Dateien aus der Website extrahieren$max =$web.rss.channel.item.Count$webclient = New-Object System.Net.WebClient# load the TagLib# assembly into PowerShelL[Reflection.Assembly]::LoadFrom("C:\Temp\mypodcast\taglib-sharp.dll")#kalenderwoche ermitteln$kw = Get-Date -uFormat %V$kw = $kw + " - "$i = 0do {  $fileURL = $web.rss.channel.item[$i].guid  $mp3name = "c:\temp\mypodcast\$dirname\" +$kw +$web.rss.channel.item[$i].title +".mp3"   write-host c:\temp\mypodcast\$dirname\$mp3name  If (!(Test-Path c:\temp\mypodcast\$dirname\$mp3name)){    write-host $mp3name    write-host "Die Datei $mp3name wird erstellt"    $webclient.DownloadFile($fileURL,$mp3name)    #$media = [TagLib.File]::Create($mp3name)    $media = [TagLib.File]::Create($mp3name)    # set the tags     #$media.Tag.Genre = "Podcast"     $media.Tag.Album = $dirname     $media.Tag.Comment = "Neu"    $media.Save() }  $i++} while ($i -lt $max)Get-ChildItem *.mp3Set-Location c:\temp\mypodcast   Eine weiterentwickelte Version nachfolgend. Die Source URL sind im Skript definiert. Das Skript wird über den Taskmanager von Windows regelmässig angestossen und ergänzt die Podcasts um die neuen Folgen #Name:                        MP3 Dateien aus RSS Feed (Podcast) downloaden#Autor:                       Peter Gyger#Version:                     1.2#Datum der letzten Änderung:  1.05.2017#Überprüfen ob das Verzeichnis c:\temp\ und Unterverzeichnis mypodcast existiertIf (!(Test-Path c:\temp)){    write-host c-temp erstellen    New-Item c:\temp -ItemType directory}If (!(Test-Path c:\temp\mypodcast)){    write-host c-temp mypodcast    New-Item c:\temp\mypodcast -ItemType directory}Set-Location c:\temp\mypodcast# load the TagLib# assembly into PowerShelL[Reflection.Assembly]::LoadFrom("C:\Temp\mypodcast\taglib-sharp.dll") ForEach($Number in 1..20) {    $dirname = ""    $rssURL = ""    Switch ($Number) {                #DRS / SRF Feeds        1 {$rssURL ="http://pod.drs.ch/jazz_collection_mpx.xml"        $dirname = "SRF - jazz_collection"         }        2 {$rssURL ="http://pod.drs.ch/a_point_mpx.xml"            $dirname = "SRF - a_point"        }        3 {$rssURL ="http://podcasts.srf.ch/100_sekunden_wissen_mpx.xml"            $dirname = "SRF - 100_sekunden_wissen"        }        4 {$rssURL ="http://podcasts.srf.ch/digital_plus_mpx.xml"            $dirname = "SRF - digital_plus"        }        5 {$rssURL ="http://pod.drs.ch/wissenschaft_drs_2_mpx.xml"            $dirname = "SRF - wissenschaft_drs_2"        }        6 {$rssURL ="http://pod.drs.ch/country_special_mpx.xml"            $dirname = "SRF - country_special"        }        7 {$rssURL ="http://podcasts.srf.ch/fiori_musicali_mpx.xml"            $dirname = "SRF - fiori_musicali"        }        8 {$rssURL ="http://pod.drs.ch/diskothek_im_zwei_mpx.xml"         $dirname = "SRF - diskothek_im_zwei"        }        9 {$rssURL ="http://pod.drs.ch/espresso_mpx.xml"        $dirname = "SRF - espresso"         }        #Heise Feeds        10 {$rssURL ="https://www.heise.de/ct/uplink/ctuplink.rss"        $dirname = "ctuplink"        }               #diverse        14 {$rssURL ="http://www.br-online.de/podcast/cd-tipp-der-woche/cast.xml"            $dirname = "BR - Classic aktuell"        }    }    $web = New-Object System.Xml.XmlDocument    $web.Load($rssURL)    $max =$web.rss.channel.item.Count    $webclient = New-Object System.Net.WebClient     If (!(Test-Path c:\temp\mypodcast\$dirname))    {        Write-Host neues verzeichnis erstellen        write-host $dirname        New-Item c:\temp\mypodcast\$dirname -ItemType directory    }    Set-Location c:\temp\mypodcast\$dirname    write-host c:\temp\mypodcast\$dirname    $i = 0    do     {      $mp3name = ""      $mp3name =$web.rss.channel.item[$i].title +".mp3"      #Sonderzeichen die das NTFS Dateisystem nicht akzeptiert ersetzen      $mp3name = $mp3name.Replace("/","_")      $mp3name = $mp3name.Replace("\","_")      $mp3name = $mp3name.Replace("?","_")      $mp3name = $mp3name.Replace(":","_")      $mp3name = $mp3name.Replace(""" ","_")      $mp3name = "c:\temp\mypodcast\$dirname\" +$mp3name       #$mp3name = "c:\temp\mypodcast\$dirname\" +$kw +$fileURL.Substring(35)      If (!(Test-Path $mp3name))    {        #mp3 podcast?        If (!($mp3name.endswith(".mp3")))    {        write-host "keine MP3 Datei"        $mp3name        }        write-host "Die Datei $mp3name wird erstellt"        $fileURL = $web.rss.channel.item[$i].guid        $webclient.DownloadFile($fileURL,$mp3name)        #$media = [TagLib.File]::Create($mp3name)        $media = [TagLib.File]::Create($mp3name)        # set the tags         #$media.Tag.Genre = "Podcast"         #$media.Tag.Album = $dirname         $media.Tag.Comment = "Neu"        $media.Save()     }      $i++    } while ($i -lt $max)    } Die hier vorgestellten Codebeispiele in der hier genannten Version sind "Public Domain CC". Jeder darf sie verwenden und ändern.  Vielleicht entdeckt jemand ein neues, spannendes Hobby?    

Übersicht MS Powershell

  Um was geht es? Was mit einer Batchdatei ("Stapeldatei") begann, mit dem "Windows Scripting Host" seine Fortsetzung fand, soll seit Jahren durch die Skriptsprache "Powershell" abgelöst werden. Nachfolgend ein paar Informationen zum Einstieg in Powershell. Einleitung Powershell wurde von Microsoft zur strategischen Sprache erhoben. Wenige Produkte haben Sie noch nicht implementiert. Aktuell ist die Version 3.0 erschienen.     Windows PowerShell setzt auf dem .NET Framework auf. So wie die bekannten Sprachen C# oder ASP.NET. Sie verwendet das Konzept von Pipes und Filtern mit dem Paradigma der objektorientierten Programmierung (.net). Wie bei den Batchdateien können Befehle einzeln oder zusammengefasst als Skript verwendet werden.     Grafische Oberflächen sind eine Konzession an den Anwender. Microsoft hat mit Windows Server 2008R2 diesen Weg zurück zu den Wurzeln beschritten. "Powershell" ist für den Systembetrieb in einer Microsoft IT Umgebung das, was einmal mit "command.com" bzw. "cmd.exe" angefangen hat.     Bei den meisten Shells wird ein Befehl (Dienstprogramm) in einem neuen Prozess ausgeführt. Die Resultate werden als Text ausgegeben. Allen bekannten, klassischen Shells wie Bash ist gemeinsam das sie wenige eigene Befehle und Funktionen haben. Daher entstanden im Verlauf der Zeit unterschiedliche Hilfsprogramme, Erweiterungen, etc. Powershell bricht konsequent mit diesem Modus. Im Detail:   Die Zahl integrierter Befehle ist hoch Alle Befehle haben eine einheitliche Schnittstelle. statt Text werden Objekte verarbeitet  Jede Sprache die .NET nutzt, verwendet Sonderzeichen. Die wurden so gewählt das sie auf einer US Tastatur leicht zu erzeugen sind. Somit hat man die Wahl, das Layout der Tastatur umzustellen oder diese auf dem verwendeten Tastaturlayout zu identifizieren. "Gross" / "Klein" Schreibweise ist anders als bei C# nichtrelevant. Auf einer Tastatur mit aktivem SG ("Swiss German") Layout sind die Sonderzeichen wie folgt zu finden: Zeichen Tasten Sinn | AltGr 7 Ausgabe eines Befehles ` Shift ^ Befehl auf der folgenden Zeile fortsetzen { AltGr ä Beginn einer Befehlsfolge } AltGr $ Ende einer Befehlsfolge [ AltGr ü Manchmal bei Objekten erforderlich ] AltGr ! Manchmal bei Objekten erforderlich TAB Tabulator A la IntelliSense: vervollständigt einen Befehl   Hintergrund Die EXE Datei von PowerShell liegt im Verzeichnis "v1.0". Der Verzeichnisname "v1.0" ist irreführend. Die installierte Version von PowerShell kann mit "get-host" ermittelt werden. Standard ist:     Produkt Version 2 Version 3 Windows 7 – SP1 X    Windows 8    X Windows Server 2008 R2 X    Windows Server 2012    X     Die Installation auf dem "Windows Home Server" sollte ebenfalls kein Problem sein: Der Update auf die Version 3 ist für die Version Windows 7 und Windows Server 2008R2 unproblematisch     Interaktiv         "Get-Help" liefert die ersten Informationen zu den Befehlen. Die Sprache der Information richtet sich nach dem Betriebssystem. "Gross / Kleinschreibung" wird nicht interpretiert.     Cmdlets Die Basis der PowerShell Funktionen bilden die sogenannten "cmdlets". Der Name ist nach dem Schema Verb-Substantiv aufgebaut. z.B. "get-command". Ein cmdlet kann Parameter oder Objekte als Eingabe verarbeiten. Die Ausgabe ist immer ein Objekt.     "Cmdlets" sind spezielle .NET Klassen. D.h. Teil des .NET Frameworks. Nebst den .NET Klassen werden auch COM Objekte sowie WMI Klassen verarbeitet.     Parameter beim Aufruf werden mit einem "-" gekennzeichnet. Objekte werden durch einen Leerschlag übergeben. Beispiel: Hilfetext zum Cmdlets "get-command" abrufen. Für die Hilfe ist das Cmdlets "get-help" zuständig. Diesem muss also mitgeteilt werden, dass lediglich der Hilfetext zu "get-command" angezeigt werden soll.     Dazu wird "get-help" das Objekt übergeben: "get-help get-command"     Mit dem Parameter "-online" wird der Hilfetext direkt aus dem Web (MS TechNet) abgerufen: "get-help –online get-command"     Als Alternative zu einer Referenz hat Microsoft in der TechNet einen aufgabenbasierten Leitfaden erstellt. Dieser zeigt in mehreren Artikeln, wie man PowerShell im Alltag einsetzen kann.     In der Wikipedia ist eine Liste mit vergleichbaren Befehlen anderer CLI zu finden: http://de.wikipedia.org/wiki/Powershell#Cmdlets     Pipe Wer sich mit der Unix (Linux, BSD, etc.) Welt auseinandersetzt, wird das Prinzip von "Pipes und Filtern" zwangsläufig kennenlernen. Diese Wikipedia Artikel erklären die Funktionsweise: http://de.wikipedia.org/wiki/Pipe_(Informatik) http://de.wikipedia.org/wiki/Filter_(Unix) http://de.wikipedia.org/wiki/Pipes_und_Filter     . Z.B. kann die Liste die "get-command" liefert an das Cmdlets "format-list" übergeben werden: "get-command | format-list"     Die Ausgabe kann auch sortiert erfolgen: "get-command | sort-order"     Über ein weiteres Pipe kann die bearbeitete Liste in eine Datei gespeichert werden: "get-command | format-list | out-file H:\projekt\ps\workdir\bsp-1c.txt     Programme Grundsätzlich lässt sich jedes Programm bzw. Funktion starten. Analog zu "Cmd". Natürlich gibt es ein paar Feinheiten. Wie bei CMD können nur Programme gefunden, werden, deren Pfad in der Variable "path" aufgeführt ist.     Filezilla kann in der CMD Shell direkt ausgeführt werden: ""C:\Program Files (x86)\FileZilla FTP Client\filezilla.exe"" PowerShell benötigt mehr Angaben. Die Eingabe des Pfades mit Anführungs und Schlusszeichen wird als Text interpretiert und ausgegeben. Ohne die "" liefert PowerShell einen Fehler zurück: Programm nicht gefunden. Mit der Verwendung des Befehles "Start" klappt es: start "C:\Program Files (x86)\FileZilla FTP Client\filezilla.exe"     Anstatt "Start" kann das Cmdlet "Invoke-Item" verwendet werden: invoke-item "C:\Program Files (x86)\FileZilla FTP Client\filezilla.exe"     Dokumente deren Erweiterung ("Suffix") einem installierten Programm zugeordnet ist, werden geöffnet. Jedoch muss die Pfadangabe absolut sein. D.h. eine Datei gps.pdf wird nicht gefunden. Auch nicht, wenn die Datei im gleichen Verzeichnis ist. Als Beispiel eines absoluten Pfades:H:\projekt\ps\workdir\bsp-1c.txt     Beispiele In der Microsoft TechNet hat es folgende Beispiele für die Verwendung von PowerShell Dateien und Ordner Datumswerte und Uhrzeiten Systemverwaltungsaufgaben Speichern und Importieren von Daten     Scripting Ein Skript ist eine Textdatei mit Befehlen. Die Skriptdatei muss mit der Erweiterung ".ps1" gespeichert werden. Analog einer Batchdatei, welche mit der Erweiterung "CMD" (bzw. .bat) gespeichert wird.     Mit dem Cmdlet "Get-ExecutionPolicy" erfährt man, ob eine Restriktion die Ausführung sperrt.     Mit folgenden Zeilen werden die Farben der PowerShell Konsole geändert. Mit einem abschliessenden "Cls" wird der Wechsel sichtbar.     $a = (Get-Host).UI.RawUI $a.BackgroundColor = "red" $a.ForegroundColor = "black"     Wenn man diese Zeilen kopiert und in PowerShell einfügt, werden sie umgehend abgearbeitet. Nach einem CLS sieht man den roten Hintergrund. Mit dem Neustart der Konsole ist die Orginal Farbgebung wieder hergestellt.     Wenn diese Zeilen in eine Textdatei mit der Erweiterung .PS1 (z.B. test1.ps1) kopiert werden, kann diese in der PowerShell ausgeführt werden. Natürlich mit absoluter Pfadangabe, bzw. wenn es ich lokalen Verzeichnis ist mit ".\".     Im Windows Explorer besteht die Möglichkeit über das Kontextmenu ein Power Shell Skript auszuführen.     "Öffnen" öffnet das Script mit Power Shell ISE. Dem mitgelieferten Editor zu Power Shell.     Mehr zum Thema wie man ein Power Shell Script startet, findet man hier.         Für das erstellen bzw. bearbeiten eines Skriptes ist die Version ISE gedacht     Sie bietet einfach Editorfunktionen, um das erstellen von Skripten zu erleichtern. Die Hilfe im Editor (in der Sprache des Betriebssystems) erklärt die Feinheiten. Weiterführende Links Microsoft PowerShell Homepage (de) MSDN PowerShell Blog Windows PowerShell Shortcut Keys Windows PowerShell 3.0 and Server Manager Quick Reference Guides 2007 hat Frank Koch von Microsoft Schweiz diese Einführung in die Version 1 geschrieben Der gleiche Autor hat 2008 einen Workshop zur Serververwaltung geschrieben     Andere Websites / Blogs zum Thema Powershell Swiss IT Pro User Group Blog Desmond Lee powershellpraxis.de powershell-ag.de PowerShell 2 – Artikel in der Computerworld.ch Power Shell Magazine (YouTube) Channel 9: Windows PowerShell Crash Course Channel 9: Group Windows PowerShell Markus Widl Cheat Sheet (de) Bruce Payette: Quick Reference Card (Ver 2)   Fazit PowerShell ist der neuen Version 3 hat gerade im Remoting interessante Neuerungen erfahren. Daher bin ich gespannt, auf den Kurs mit Desmond Lee, der nächste Woche startet.     ELEMENT Wert Erstellt 23.1.2015 Letzte Änderung   ID   Kategorie Microsoft Tag   Autor