6. Powershell We need more Objects.

Aug-20th-2011

Zurück zur Theorie. Wir haben uns in den letzten 2 Artikeln mit der Administration von Rechnern im Netzwerk und der Verwaltung des Active Directory beschäftigt. Dies ist jedoch nur ein kleiner Teil der Möglichkeiten von Powershell. In diesem Artikel geht es um Objekte, speziell um objektorientierte Programmierung in Powershell und die Nutzung von C# innerhalb des Powershell Scripts.

Hierfür werden wir uns die CMDLets Add-Type, Add-Member, Get-Member und New-Object von Powershell genauer anschauen.

get-help Add-Type
get-help Get-Member
get-help Add-Member
get-help New-Object

 
Hinzufügen einer Methode zu einem erstelltem Objekt mit Hilfe von Add-Member

Mit dem CMDLet Add-Member können wir einem Objekt in Powershell ein Element hinzufügen.
Das zu verändernde Objekt kann dabei dem CMDLet mit dem Parameter -InputObject oder über den Pipe-Operator übergeben werden.
Weitere Parameter sind:
-membertype <Typ des Elementes z.b. ScriptMethod oder ScriptProperty>
-name <Name des Elementes>
-value <Wert des Elementes, oder Codeblock für eine Methode>
-Passthru <Das CMDLet soll das veränderte Objekt zurückgeben>

Im folgenden Beispiel wird ein String Objekt erstellt. Wir prüfen zuerst das Objekt auf schon vorhandene Eigenschaften und Methoden, ergänzen es dann um eine weitere Methode und lassen uns erneut die Member des Objektes auslisten.

$s_RNTitle = "Radium Networks, Ideas for your IT"
$s_RNTitle | get-member
$s_RNTitle = add-member -inputobject $s_RNTitle -membertype scriptmethod -name Woerter -value {$this.split()} -passthru
$s_RNTitle.Woerter()
$s_RNTitle | get-member

Hier noch eine weitere Möglichkeit mit Hilfe des Pipe-Operators.

$s_RNTitle = "Radium Networks, Powershell macht Spass" | add-member -membertype scriptmethod -name Woerter -value {$this.split()} -passthru
$s_RNTitle.Woerter()

 
Kompilieren von C# Code mit Hilfe von Add-Type

Mittels Add-Type können .Net Assemblies (Funktionsbibliotheken) mit dem Namen über den Parameter -AssemblyName, per Pfad zur DLL mit dem -Path Parameter zur Session hinzugefügt werden um auf mehr Funktionen zugreifen zu können. Während in Powershell v1 die Schreibweise [Reflection.Assembly]::Load verwendet wurde um Assemblies zu laden, wurde dies mit Powershell v2 und dem CMDLet Add-Type vereinfacht. Ein sehr gutes Tutorial für die Nutzung des System.Web Assemblies ist hier zu finden.

Zusätzlich kann auch mit der @’ {<Codeblock>} ‘@ Schreibweise Quelltext aus anderen Sprache wie z.B. C# eingebunden werden.

Add-Type (-AssemblyName <string[]> | -Path <string[]> | @’ {<Codeblock>} ‘@)

Auf statische Methoden von eingebundenen Klassen kann dann über [<Classname>]::<Methodenname> zugegriffen werden. Zusätzlich kann auch über über das CMDLet New-Object eine neue Objektinstanz der entsprechenden Klasse erstellt und referenziert werden.

Add-Type @'
public class RadiumNetworks
{
  public string RNTitle = "Radium Networks, Ideas for your IT";
  public void CompareString(string s)
  {
  if (s == RNTitle)
  { System.Console.WriteLine("Der übergebene Text stimmt mit dem gespeicherten überein."); }
  else
  { System.Console.WriteLine("Der übergebene Text stimmt nicht mit dem gespeicherten überein."); }
  }
}
'@
$object = New-Object RadiumNetworks
$object | get-member
$object.CompareString("Dies ist ein String.")

 
Kompilieren von C# Code zu einer ausführbaren Datei.

Mit Hilfe der Parameter -OutputType und -OutputAssembly lassen sich aus z.B. dem C# Code auch lauffähige Programme erstellen die über das Powershell Script schon fertig parametrisiert und z.B. im Netzwerk verteilt werden können.

  • Beispiel 1 (Kommandozeilentool)

$s_RNTitle = "Radium Networks, Ideas for your IT"
Add-Type -OutputType ConsoleApplication -OutputAssembly DisplayMessage.exe @"
using System;
public class DisplayMessage
{
  public static void Main(string[] args)
  {
    Console.WriteLine("$s_RNTitle");
  }
}
"@

  • Beispiel 2 (Windows Applikation)

$s_RNTitle1 = "Radium Networks"
$s_RNTitle2 = "Ideas for your IT"
  
Add-Type -OutputType WindowsApplication -ReferencedAssemblies "System.Drawing","System.Windows.Forms" -OutputAssembly DisplayMessage2.exe @"
using System;
using System.Drawing;
using System.ComponentModel;
using System.Windows.Forms;
  
namespace WinApplication1
{
  class DisplayMessage2
  {
    [STAThread]
    static void Main(string[] args)
    {
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(new WinForm());
    }
  }
  
  public partial class WinForm : Form
  {
    private System.Windows.Forms.Label WinLabel1;
    public WinForm()
    {
      this.WinLabel1 = new System.Windows.Forms.Label();
      WinLabel1.Location = new System.Drawing.Point(100, 10);
      WinLabel1.Text = "$s_RNTitle2";
      WinLabel1.Size = new System.Drawing.Size(400, 30);
      WinLabel1.Font = new System.Drawing.Font("Microsoft Sans Serif", 24f);
      WinLabel1.TabIndex = 0;
      this.Text = "$s_RNTitle1";
      this.MaximizeBox = false;
      this.AutoScaleBaseSize = new System.Drawing.Size(5, 10);
      this.MinimizeBox = false;
      this.ClientSize = new System.Drawing.Size(500, 60);
      this.Controls.Add(WinLabel1);
    }
  }
}
"@

An dieser Stelle endet der Powershell Workshop. Ich hoffe es sind einige Fragen ausgeräumt worden.
Auch für noch zu klärende Fragen oder Probleme bei der Umsetzung von Scriptideen kann gerne die Kommentarfunktion genutzt werden.


Kick It auf dotnet-kicks.de

Add A Comment