2009-03-25 18 views

Odpowiedz

9

Można zdefiniować nowe typy PowerShell v2.0 pomocą Add-Type komandletu:

SZCZEGÓŁOWY OPIS

Add-Type cmdlet umożliwia zdefiniowanie klasy .NET w sesji środowiska Windows PowerShell . Następnie można utworzyć instancję obiektów (za pomocą cmdletu New-Object) i użyć obiektów, tak jak przy użyciu dowolnego .NET ob ject. Jeśli dodasz polecenie Add-Type do profilu Windows PowerShell, klasa będzie dostępna we wszystkich sesjach Windows PowerShell.

Można określić typ, określając istniejący zbiór lub pliki kodu źródłowego lub można określić kod źródłowy w wierszu lub zapisać w zmiennej. Możesz nawet określić tylko metodę, a Add-Type zdefiniuje i wygeneruje klasę. Możesz użyć tej funkcji, aby wywoływać wywołania platformy (P/Invoke) do niezarządzanych funkcji w Windows PowerShell. Jeśli określisz kod źródłowy, Add-Type skompiluje określone źródło i wygeneruje zespół w pamięci zawierający nowe typy .NET.

Możesz użyć parametrów Add-Type, aby określić alternatywny język i kompilator (domyślnie CSharp), opcje kompilatora, zależności złożenia, przestrzeń nazw klas oraz nazwy tego typu i wynikowy zestaw montażowy .

help Add-Type, aby uzyskać więcej informacji.

Zobacz również:

0

zajmuje rurociągów PowerShell z obiektami, a nie tylko tekst Stream rurociąg Unix robi. Wszystkie zmienne są również instancjami obiektów. To są wszystkie obiekty .NET, BTW.

Oto część wyjściu polecenia „ls” rurami do apletu polecenia Get-Member:

PS C:\Documents and Settings\Administrator.DEV-3DPST1-SWK> ls | get-member 


    TypeName: System.IO.DirectoryInfo 

Name      MemberType  Definition 
----      ----------  ---------- 
Create     Method   System.Void Create(DirectorySecurity directorySecurity), System.Void Create() 
CreateObjRef    Method   System.Runtime.Remoting.ObjRef CreateObjRef(Type requestedType) 
CreateSubdirectory  Method   System.IO.DirectoryInfo CreateSubdirectory(String path), System.IO.Director... 
Delete     Method   System.Void Delete(), System.Void Delete(Boolean recursive) 
Equals     Method   System.Boolean Equals(Object obj) 
GetAccessControl   Method   System.Security.AccessControl.DirectorySecurity GetAccessControl(), System.... 
GetDirectories   Method   System.IO.DirectoryInfo[] GetDirectories(String searchPattern), System.IO.D... 
GetFiles     Method   System.IO.FileInfo[] GetFiles(String searchPattern), System.IO.FileInfo[] G... 
GetFileSystemInfos  Method   System.IO.FileSystemInfo[] GetFileSystemInfos(String searchPattern), System... 
GetHashCode    Method   System.Int32 GetHashCode() 
GetLifetimeService  Method   System.Object GetLifetimeService() 
GetObjectData    Method   System.Void GetObjectData(SerializationInfo info, StreamingContext context) 
GetType     Method   System.Type GetType() 
get_Attributes   Method   System.IO.FileAttributes get_Attributes() 
get_CreationTime   Method   System.DateTime get_CreationTime() 

get-member wyświetla członków obiektu, który do niego rury. Widać, że są to rzeczywiste elementy klasy System.IO.DirectoryInfo.

7

PowerShell jest bardziej językiem konsumenckim OOP. Może wykorzystywać większość platformy .NET Framework, ale nie wspiera natywnie tworzenia interfejsów, klas, a na pewno nie miesza. .NET, na którym oparty jest system typu PowerShell, nie obsługuje mixinów. PowerShell obsługuje dynamiczne dodawanie właściwości i metod do istniejącego obiektu za pomocą polecenia cmdlet Add-Member.

Add-Type jest użyteczny, ale jeśli musisz uciec do C# lub VB, aby zdefiniować klasę lub klasę, która implementuje konkretny interfejs, nie uważam, że pierwsza klasa obsługuje tworzenie klas/interfejsów.

Jeśli szukasz bezpłatnego materiału do nauki, sprawdź: Effective Windows PowerShell.

+0

dobra odpowiedź i bardzo ładne książki. Dziękujemy za jedno i drugie! –

-1

Wydaje się, że wersja 5 Powershell obsługuje niektóre główne OOP.

Wszystko zasługa tego faceta: https://xainey.github.io/2016/powershell-classes-and-concepts/

przykładem klasy:

class myColor 
    { 
     [String] $Color 
     [String] $Hex 

     myColor([String] $Color, [String] $Hex) 
     { 
      $this.Color = $Color 
      $this.Hex = $Hex 
     } 

     [String] ToString() 
     { 
      return $this.Color + ":" + $this.Hex 
     } 
    } 

przykładem klasy abstrakcyjnej:

class Foo 
{ 
    Foo() 
    { 
     $type = $this.GetType() 

     if ($type -eq [Foo]) 
     { 
      throw("Class $type must be inherited") 
     } 
    } 

    [string] SayHello() 
    { 
     throw("Must Override Method") 
    } 
} 

class Bar : Foo 
{ 
    Bar() 
    { 

    } 

    [string] SayHello() 
    { 
     return "Hello" 
    } 
} 
+1

Link do rozwiązania jest mile widziany, ale upewnij się, że twoja odpowiedź jest przydatna bez niego: [dodaj kontekst wokół linku] (// meta.stackexchange.com/a/8259), aby inni użytkownicy mieli pojęcie, co to jest i dlaczego tam jest, a następnie zacytuj najważniejszą część strony, do której prowadzi link, jeśli strona docelowa jest niedostępna. [Odpowiedzi, które są niewiele więcej niż link, mogą zostać usunięte.] (// stackoverflow.com/help/deleted-answers) – Simon