2009-03-25 49 views

Trả lời

9

Bạn có thể xác định các loại mới trong PowerShell v2.0 sử dụng Add-Type cmdlet:

CỤ THỂ TẢ

Add-Type cmdlet phép bạn xác định một lớp .NET trong phiên Windows PowerShell của bạn . Sau đó bạn có thể khởi tạo các đối tượng (bằng cách sử dụng lệnh ghép ngắn đối tượng mới) và sử dụng các đối tượng, giống như bạn sử dụng bất kỳ đối tượng .NET ob nào. Nếu bạn thêm một lệnh Add-Type vào hồ sơ Windows PowerShell của bạn, lớp sẽ có sẵn trong tất cả các phiên Windows PowerShell.

Bạn có thể chỉ định loại bằng cách chỉ định tệp lắp ráp hoặc mã nguồn hiện có hoặc bạn có thể chỉ định mã nguồn trong dòng hoặc được lưu trong biến. Bạn thậm chí có thể chỉ định một phương thức và Add-Type sẽ xác định và tạo lớp. Bạn có thể sử dụng tính năng này để thực hiện cuộc gọi Platform Invoke (P/Invoke) đến các chức năng không được quản lý trong Windows PowerShell. Nếu bạn chỉ định mã nguồn, Add-Type biên dịch mã nguồn được chỉ định de và tạo một hội đồng trong bộ nhớ có chứa các loại .NET mới.

Bạn có thể sử dụng tham số Add-Type để chỉ định ngôn ngữ thay thế và trình biên dịch (CSharp là mặc định), tùy chọn trình biên dịch, phụ thuộc lắp ráp, không gian tên lớp và tên của loại và kết quả .

help Add-Type để biết thêm thông tin.

Ngoài ra, xem:

0

Các thỏa thuận đường ống PowerShell với các đối tượng, không chỉ là một văn bản dòng một một đường ống dẫn Unix không. Tất cả các biến là trường hợp của các đối tượng là tốt. Đây là tất cả các đối tượng .NET, BTW.

Dưới đây là một phần của đầu ra của một "ls" lệnh đường ống để cmdlet Get-Thành viên:

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 thành viên hiển thị các thành viên của đối tượng bạn ống với nó. Bạn có thể thấy rằng đây là những thành viên thực sự của lớp System.IO.DirectoryInfo.

7

PowerShell có nhiều ngôn ngữ tiêu dùng OOP hơn. Nó có thể sử dụng hầu hết các .NET Framework nhưng nó không hỗ trợ tạo các giao diện, các lớp và chắc chắn không phải là mixin. .NET, hệ thống kiểu PowerShell dựa trên, không hỗ trợ mixin. PowerShell hỗ trợ bổ sung động các thuộc tính và phương thức cho một đối tượng hiện có thông qua lệnh ghép ngắn Add-Member.

Add-Type là hữu ích nhưng nếu bạn phải thoát ra C# hoặc VB để xác định một lớp hoặc một lớp thực hiện một giao diện cụ thể, tôi sẽ không xem xét lớp đầu tiên hỗ trợ tạo lớp/giao diện.

Nếu bạn đang tìm kiếm một số tài liệu học tập miễn phí, hãy xem Effective Windows PowerShell.

+0

Tốt câu trả lời, và cuốn sách rất tốt đẹp. Cảm ơn cả hai! –

-1

Phiên bản 5 của Powershell dường như hỗ trợ một số OOP chính thống.

Tất cả tín dụng đi vào anh chàng này: https://xainey.github.io/2016/powershell-classes-and-concepts/

Ví dụ về một lớp học:

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

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

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

Ví dụ về một lớp trừu tượng:

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

Một liên kết đến một giải pháp được chào đón, nhưng hãy đảm bảo câu trả lời của bạn hữu ích mà không có nó: [thêm ngữ cảnh xung quanh liên kết] (// meta.stackexchange.com/a/8259) để người dùng của bạn sẽ có một số ý tưởng và tại sao nó ở đó, sau đó trích dẫn phần có liên quan nhất của trang bạn đang liên kết đến trong trường hợp trang đích không có sẵn. [Câu trả lời có nhiều hơn một liên kết có thể bị xóa.] (// stackoverflow.com/help/deleted-answers) – Simon