Windows PowerShell là gì và nó dùng để làm gì? Phần 4: Làm việc với đối tượng, lớp riêng

Windows PowerShell là gì và nó dùng để làm gì? Phần 4: Làm việc với đối tượng, lớp riêng

Đầu ra văn bản của các lệnh trong cửa sổ trình thông dịch PowerShell chỉ là một cách để hiển thị thông tin ở dạng phù hợp với nhận thức của con người. Thật ra thứ tư định hướng để làm việc với các đối tượng: các lệnh ghép ngắn và các hàm nhận chúng làm đầu vào và trở lại ở lối ravà các loại biến có sẵn tương tác và trong các tập lệnh đều dựa trên các lớp .NET. Trong bài viết thứ tư của loạt bài này, chúng ta sẽ nghiên cứu cách làm việc với các đối tượng một cách chi tiết hơn.

Mục lục:

Các đối tượng trong PowerShell
Xem cấu trúc của đối tượng
Lọc đối tượng
Sắp xếp đồ vật
Chọn đối tượng và các bộ phận của chúng
ForEach-Object, Group-Object và Measure-Object
Tạo đối tượng .NET và COM (Đối tượng mới)
Gọi các phương thức tĩnh
Nhập PSCustomObject
Tạo lớp học của riêng bạn

Các đối tượng trong PowerShell

Chúng ta hãy nhớ lại rằng một đối tượng là một tập hợp các trường dữ liệu (thuộc tính, sự kiện, v.v.) và các phương thức để xử lý chúng (các phương thức). Cấu trúc của nó được chỉ định bởi một loại, thường dựa trên các lớp được sử dụng trong nền tảng .NET Core hợp nhất. Cũng có thể làm việc với các đối tượng COM, CIM (WMI) và ADSI. Các thuộc tính và phương thức cần thiết để thực hiện các hành động khác nhau trên dữ liệu; ngoài ra, trong PowerShell, các đối tượng có thể được truyền dưới dạng đối số cho các hàm và lệnh ghép ngắn, gán giá trị của chúng cho các biến và cũng có cơ chế thành phần lệnh (băng tải hoặc đường ống). Mỗi lệnh trong đường ống lần lượt chuyển đầu ra của nó sang lệnh tiếp theo, từng đối tượng. Để xử lý, bạn có thể sử dụng các lệnh ghép ngắn đã biên dịch hoặc tạo lệnh ghép ngắn của riêng bạn các tính năng tiên tiếnđể thực hiện các thao tác khác nhau với các đối tượng trong đường ống: lọc, sắp xếp, nhóm và thậm chí thay đổi cấu trúc của chúng. Việc truyền dữ liệu ở dạng này có một lợi thế lớn: nhóm nhận không cần phân tích luồng byte (văn bản), tất cả thông tin cần thiết đều có thể dễ dàng lấy ra bằng cách gọi các thuộc tính và phương thức thích hợp.

Xem cấu trúc của đối tượng

Ví dụ: hãy chạy lệnh ghép ngắn Get-Process, cho phép bạn lấy thông tin về các tiến trình đang chạy trong hệ thống:

Windows PowerShell là gì và nó dùng để làm gì? Phần 4: Làm việc với đối tượng, lớp riêng

Nó sẽ hiển thị một số dữ liệu văn bản được định dạng mà không đưa ra bất kỳ ý tưởng nào về các thuộc tính của đối tượng được trả về và phương thức của chúng. Để tinh chỉnh đầu ra, chúng ta cần học cách kiểm tra cấu trúc của các đối tượng và lệnh ghép ngắn Get-Member sẽ giúp chúng ta điều này:

Get-Process | Get-Member

Windows PowerShell là gì và nó dùng để làm gì? Phần 4: Làm việc với đối tượng, lớp riêng

Ở đây, chúng ta đã thấy loại và cấu trúc, đồng thời với sự trợ giúp của các tham số bổ sung, chẳng hạn, chúng ta có thể chỉ hiển thị các thuộc tính của đối tượng có trong đầu vào:

Get-Process | Get-Member -MemberType Property

Kiến thức này sẽ cần thiết để giải quyết các vấn đề quản trị một cách tương tác hoặc để viết các tập lệnh của riêng bạn: ví dụ: để lấy thông tin về các quy trình bị treo bằng cách sử dụng thuộc tính Phản hồi.

Lọc đối tượng

PowerShell cho phép các đối tượng đáp ứng một điều kiện nhất định được truyền qua một đường dẫn:

Where-Object { блок сценария }

Kết quả của việc thực thi khối tập lệnh trong dấu ngoặc đơn phải là giá trị boolean. Nếu nó đúng ($true), đối tượng được nhập vào lệnh ghép ngắn Where-Object sẽ được chuyển dọc theo đường dẫn, nếu không ($false) nó sẽ bị xóa. Ví dụ: hãy hiển thị danh sách các dịch vụ Windows Server đã dừng, tức là. những người có thuộc tính Trạng thái được đặt thành “Đã dừng”:

Get-Service | Where-Object {$_.Status -eq "Stopped"}

Windows PowerShell là gì và nó dùng để làm gì? Phần 4: Làm việc với đối tượng, lớp riêng

Ở đây một lần nữa chúng ta thấy một cách biểu diễn bằng văn bản, nhưng nếu bạn muốn hiểu loại và cấu trúc bên trong của các đối tượng đi qua đường ống thì không khó:

Get-Service | Where-Object {$_.Status -eq "Stopped"} | Get-Member

Windows PowerShell là gì và nó dùng để làm gì? Phần 4: Làm việc với đối tượng, lớp riêng

Sắp xếp đồ vật

Khi xử lý các đối tượng theo đường ống, thường cần phải sắp xếp chúng. Lệnh ghép ngắn Sort-Object được truyền tên của các thuộc tính (khóa sắp xếp) và trả về các đối tượng được sắp xếp theo giá trị của chúng. Thật dễ dàng để sắp xếp đầu ra của các tiến trình đang chạy theo thời gian CPU sử dụng (thuộc tính cpu):

Get-Process | Sort-Object –Property cpu

Tham số -Property có thể được bỏ qua khi gọi lệnh ghép ngắn Sort-Object; nó được sử dụng theo mặc định. Để sắp xếp ngược lại, hãy sử dụng tham số -Descending:

Get-Process | Sort-Object cpu -Descending

Windows PowerShell là gì và nó dùng để làm gì? Phần 4: Làm việc với đối tượng, lớp riêng

Chọn đối tượng và các bộ phận của chúng

Lệnh ghép ngắn Select-Object cho phép bạn chọn một số đối tượng cụ thể ở đầu hoặc cuối của quy trình bằng cách sử dụng tham số -First hoặc -Last. Với sự trợ giúp của nó, bạn có thể chọn các đối tượng đơn lẻ hoặc các thuộc tính nhất định, đồng thời tạo các đối tượng mới dựa trên chúng. Hãy xem cách lệnh ghép ngắn hoạt động bằng các ví dụ đơn giản.

Lệnh sau hiển thị thông tin về 10 tiến trình tiêu thụ lượng RAM tối đa (thuộc tính WS):

Get-Process | Sort-Object WS -Descending | Select-Object -First 10

Windows PowerShell là gì và nó dùng để làm gì? Phần 4: Làm việc với đối tượng, lớp riêng

Bạn chỉ có thể chọn một số thuộc tính nhất định của các đối tượng đi qua đường dẫn và tạo các thuộc tính mới dựa trên chúng:

Get-Process | Select-Object ProcessName, Id -First 1

Do hoạt động của đường ống, chúng ta sẽ nhận được một đối tượng mới, cấu trúc của đối tượng này sẽ khác với cấu trúc được trả về bởi lệnh ghép ngắn Get-Process. Hãy xác minh điều này bằng cách sử dụng Get-Member:

Get-Process | Select-Object ProcessName, Id -First 1 | Get-Member

Windows PowerShell là gì và nó dùng để làm gì? Phần 4: Làm việc với đối tượng, lớp riêng

Lưu ý rằng Select-Object trả về một đối tượng duy nhất (-First 1) chỉ có hai trường mà chúng tôi đã chỉ định: giá trị của chúng được sao chép từ đối tượng đầu tiên được lệnh ghép ngắn Get-Process chuyển vào đường dẫn. Một trong những cách tạo đối tượng trong tập lệnh PowerShell dựa trên việc sử dụng Select-Object:

$obj = Get-Process | Select-Object ProcessName, Id -First 1
$obj.GetType()

Windows PowerShell là gì và nó dùng để làm gì? Phần 4: Làm việc với đối tượng, lớp riêng

Sử dụng Select-Object, bạn có thể thêm các thuộc tính được tính toán vào các đối tượng cần được biểu diễn dưới dạng bảng băm. Trong trường hợp này, giá trị của khóa đầu tiên tương ứng với tên thuộc tính và giá trị của khóa thứ hai tương ứng với giá trị thuộc tính cho phần tử đường ống hiện tại:

Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}

Windows PowerShell là gì và nó dùng để làm gì? Phần 4: Làm việc với đối tượng, lớp riêng

Chúng ta hãy nhìn vào cấu trúc của các vật thể đi qua băng tải:

Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member

Windows PowerShell là gì và nó dùng để làm gì? Phần 4: Làm việc với đối tượng, lớp riêng

ForEach-Object, Group-Object và Measure-Object

Có các lệnh ghép ngắn khác để làm việc với các đối tượng. Ví dụ: hãy nói về ba điều hữu ích nhất:

ForEach-Object cho phép bạn chạy mã PowerShell cho từng đối tượng trong quy trình:

ForEach-Object { блок сценария }

Nhóm đối tượng nhóm các đối tượng theo giá trị thuộc tính:

Group-Object PropertyName

Nếu bạn chạy nó với tham số -NoElement, bạn có thể tìm ra số phần tử trong các nhóm.

Đối tượng đo lường tổng hợp các tham số tóm tắt khác nhau theo các giá trị trường đối tượng trong đường ống (tính tổng và cũng tìm giá trị tối thiểu, tối đa hoặc trung bình):

Measure-Object -Property PropertyName -Minimum -Maximum -Average -Sum

Thông thường, các lệnh ghép ngắn được thảo luận được sử dụng một cách tương tác và thường được tạo trong các tập lệnh. chức năng với các khối Bắt đầu, Quá trình và Kết thúc.

Tạo đối tượng .NET và COM (Đối tượng mới)

Có nhiều thành phần phần mềm có giao diện .NET Core và COM hữu ích cho quản trị viên hệ thống. Sử dụng lớp System.Diagnostics.EventLog, bạn có thể quản lý nhật ký hệ thống trực tiếp từ Windows PowerShell. Hãy xem ví dụ về cách tạo một thể hiện của lớp này bằng lệnh ghép ngắn New-Object với tham số -TypeName:

New-Object -TypeName System.Diagnostics.EventLog

Windows PowerShell là gì và nó dùng để làm gì? Phần 4: Làm việc với đối tượng, lớp riêng

Vì chúng ta không chỉ định nhật ký sự kiện cụ thể nên phiên bản kết quả của lớp không chứa dữ liệu. Để thay đổi điều này, bạn cần gọi một phương thức khởi tạo đặc biệt trong quá trình tạo nó bằng tham số -ArgumentList. Nếu muốn truy cập nhật ký ứng dụng, chúng ta nên chuyển chuỗi "Ứng dụng" làm đối số cho hàm tạo:

$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog

Windows PowerShell là gì và nó dùng để làm gì? Phần 4: Làm việc với đối tượng, lớp riêng

Xin lưu ý rằng chúng tôi đã lưu kết quả đầu ra của lệnh trong biến $AppLog. Mặc dù các đường dẫn thường được sử dụng trong chế độ tương tác, nhưng việc viết tập lệnh thường yêu cầu duy trì một tham chiếu đến một đối tượng. Ngoài ra, các lớp .NET Core cốt lõi được chứa trong không gian tên Hệ thống: PowerShell theo mặc định tìm kiếm các loại được chỉ định trong đó, vì vậy việc viết Diagnostics.EventLog thay vì System.Diagnostics.EventLog là khá chính xác.

Để làm việc với nhật ký, bạn có thể sử dụng các phương pháp thích hợp:

$AppLog | Get-Member -MemberType Method

Windows PowerShell là gì và nó dùng để làm gì? Phần 4: Làm việc với đối tượng, lớp riêng

Giả sử nó bị xóa bằng phương thức Clear() nếu có quyền truy cập:

$AppLog.Clear()

Lệnh ghép ngắn New-Object cũng được sử dụng để làm việc với các thành phần COM. Có khá nhiều trong số chúng - từ các thư viện được cung cấp cùng với máy chủ tập lệnh Windows đến các ứng dụng ActiveX, chẳng hạn như Internet Explorer. Để tạo đối tượng COM, bạn cần đặt tham số -ComObject với ProgId có lập trình của lớp mong muốn:

New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject

Để tạo các đối tượng của riêng bạn với cấu trúc tùy ý, việc sử dụng New-Object có vẻ quá cổ xưa và cồng kềnh; lệnh ghép ngắn này được sử dụng để làm việc với các thành phần phần mềm bên ngoài PowerShell. Trong các bài viết tiếp theo, vấn đề này sẽ được thảo luận chi tiết hơn. Ngoài các đối tượng .NET và COM, chúng ta cũng sẽ khám phá các đối tượng CIM (WMI) và ADSI.

Gọi các phương thức tĩnh

Một số lớp .NET Core không thể khởi tạo được, bao gồm System.Environment và System.Math. họ đang tĩnh và chỉ chứa các thuộc tính và phương thức tĩnh. Đây thực chất là các thư viện tham chiếu được sử dụng mà không cần tạo đối tượng. Bạn có thể tham chiếu đến một lớp tĩnh thông qua một chữ bằng cách đặt tên loại trong dấu ngoặc vuông. Tuy nhiên, nếu nhìn vào cấu trúc của đối tượng sử dụng Get-Member chúng ta sẽ thấy kiểu System.RuntimeType thay vì System.Environment:

[System.Environment] | Get-Member

Windows PowerShell là gì và nó dùng để làm gì? Phần 4: Làm việc với đối tượng, lớp riêng

Để chỉ xem các thành viên tĩnh, hãy gọi Get-Member với tham số -Static (lưu ý loại đối tượng):

[System.Environment] | Get-Member -Static

Windows PowerShell là gì và nó dùng để làm gì? Phần 4: Làm việc với đối tượng, lớp riêng

Để truy cập các thuộc tính và phương thức tĩnh, hãy sử dụng hai dấu hai chấm liên tiếp thay vì dấu chấm sau chữ:

[System.Environment]::OSVersion

Hoặc

$test=[System.Math]::Sqrt(25) 
$test
$test.GetType()

Windows PowerShell là gì và nó dùng để làm gì? Phần 4: Làm việc với đối tượng, lớp riêng

Nhập PSCustomObject

Trong số vô số loại dữ liệu có sẵn trong PowerShell, đáng nói đến PSCustomObject, được thiết kế để lưu trữ các đối tượng có cấu trúc tùy ý. Tạo một đối tượng như vậy bằng lệnh ghép ngắn New-Object được coi là một cách cổ điển, nhưng rườm rà và lỗi thời:

$object = New-Object  –TypeName PSCustomObject -Property @{Name = 'Ivan Danko'; 
                                          City = 'Moscow';
                                          Country = 'Russia'}

Hãy nhìn vào cấu trúc của đối tượng:

$object | Get-Member

Windows PowerShell là gì và nó dùng để làm gì? Phần 4: Làm việc với đối tượng, lớp riêng

Bắt đầu với PowerShell 3.0, có một cú pháp khác:

$object = [PSCustomObject]@{Name = 'Ivan Danko'; 
                                          City = 'Moscow';
                                          Country = 'Russia'
}

Bạn có thể truy cập dữ liệu theo một trong những cách tương đương:

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

Đây là một ví dụ về việc chuyển đổi một bảng băm hiện có thành một đối tượng:

$hash = @{'Name'='Ivan Danko'; 'City'='Moscow'; 'Country'='Russia'}
$hash.GetType()
$object = [pscustomobject]$hash
$object.GetType()

Windows PowerShell là gì và nó dùng để làm gì? Phần 4: Làm việc với đối tượng, lớp riêng

Một trong những nhược điểm của các đối tượng thuộc loại này là thứ tự các thuộc tính của chúng có thể thay đổi. Để tránh điều này, bạn phải sử dụng thuộc tính [ordered]:

$object = [PSCustomObject][ordered]@{Name = 'Ivan Danko'; 
                                          City = 'Moscow';
                                          Country = 'Russia'
}

Có các tùy chọn khác để tạo một đối tượng: ở trên chúng ta đã xem xét việc sử dụng lệnh ghép ngắn Select-Object. Tất cả những gì còn lại là tìm ra cách thêm và loại bỏ các phần tử. Thực hiện điều này cho đối tượng từ ví dụ trước khá đơn giản:

$object | Add-Member –MemberType NoteProperty –Name Age  –Value 33
$object | Get-Member

Windows PowerShell là gì và nó dùng để làm gì? Phần 4: Làm việc với đối tượng, lớp riêng

Lệnh ghép ngắn Add-Member cho phép bạn thêm không chỉ các thuộc tính mà còn cả các phương thức vào đối tượng $ được tạo trước đó bằng cách sử dụng cấu trúc "-MemberType ScriptMethod":

$ScriptBlock = {
    # код 
}
$object | Add-Member -Name "MyMethod" -MemberType ScriptMethod -Value $ScriptBlock
$object | Get-Member

Xin lưu ý rằng chúng tôi đã sử dụng biến $ScriptBlock thuộc loại ScriptBlock để lưu trữ mã cho phương thức mới.

Windows PowerShell là gì và nó dùng để làm gì? Phần 4: Làm việc với đối tượng, lớp riêng

Để loại bỏ thuộc tính, sử dụng phương pháp tương ứng:

$object.psobject.properties.remove('Name')

Tạo lớp học của riêng bạn

PowerShell 5.0 đã giới thiệu khả năng xác định điểm sử dụng đặc điểm cú pháp của ngôn ngữ lập trình hướng đối tượng. Từ dịch vụ Lớp dành cho việc này, sau đó bạn nên chỉ định tên của lớp và mô tả nội dung của nó trong dấu ngoặc toán tử:

class MyClass
{
    # тело класса
}

Đây là loại .NET Core thực sự, có phần nội dung mô tả các thuộc tính, phương thức và các thành phần khác của nó. Hãy xem một ví dụ về việc xác định lớp đơn giản nhất:

class MyClass 
{
     [string]$Name
     [string]$City
     [string]$Country
}

Để tạo một đối tượng (thể hiện của lớp), hãy sử dụng lệnh ghép ngắn Đối tượng mới, hoặc một chữ kiểu [MyClass] và phương pháp giả tĩnh mới (hàm tạo mặc định):

$object = New-Object -TypeName MyClass

hoặc

$object = [MyClass]::new()

Hãy phân tích cấu trúc của đối tượng:

$object | Get-Member

Windows PowerShell là gì và nó dùng để làm gì? Phần 4: Làm việc với đối tượng, lớp riêng

Đừng quên phạm vi: bạn không thể tham chiếu đến tên loại dưới dạng chuỗi hoặc sử dụng ký tự kiểu bên ngoài tập lệnh hoặc mô-đun mà lớp được xác định. Trong trường hợp này, các hàm có thể trả về các thể hiện của lớp (đối tượng) có thể truy cập được bên ngoài mô-đun hoặc tập lệnh.

Sau khi tạo đối tượng, hãy điền các thuộc tính của nó:

$object.Name = 'Ivan Danko'
$object.City = 'Moscow'
$object.Country = 'Russia'
$object

Windows PowerShell là gì và nó dùng để làm gì? Phần 4: Làm việc với đối tượng, lớp riêng

Lưu ý rằng mô tả lớp không chỉ chỉ định các loại thuộc tính mà còn cả các giá trị mặc định của chúng:

class Example
{
     [string]$Name = 'John Doe'
}

Mô tả của một phương thức lớp giống với mô tả của một hàm nhưng không sử dụng từ hàm. Giống như trong một hàm, các tham số sẽ được truyền cho các phương thức nếu cần:

class MyClass 
{
     [string]$Name
     [string]$City
     [string]$Country
     
     #описание метода
     Smile([bool]$param1)
     {
         If($param1) {
            Write-Host ':)'
         }
     }
}

Bây giờ người đại diện của lớp chúng tôi có thể mỉm cười:

$object = [MyClass]::new()
$object.Smile($true)

Các phương thức có thể bị quá tải; ngoài ra, một lớp có thuộc tính và phương thức tĩnh, cũng như các hàm tạo có tên trùng với tên của chính lớp đó. Một lớp được xác định trong tập lệnh hoặc mô-đun PowerShell có thể đóng vai trò là cơ sở cho lớp khác - đây là cách triển khai tính kế thừa. Trong trường hợp này, nó được phép sử dụng các lớp .NET hiện có làm lớp cơ sở:

class MyClass2 : MyClass
{
      #тело нового класса, базовым для которого является MyClass
}
[MyClass2]::new().Smile($true)

Mô tả của chúng tôi về cách làm việc với các đối tượng trong PowerShell hầu như không đầy đủ. Trong các ấn phẩm tiếp theo, chúng tôi sẽ cố gắng đào sâu vấn đề này bằng các ví dụ thực tế: bài viết thứ năm trong loạt bài này sẽ đề cập đến các vấn đề về tích hợp PowerShell với các thành phần phần mềm của bên thứ ba. Các phần trước đây có thể được tìm thấy tại các liên kết dưới đây.

Phần 1: Các tính năng cơ bản của Windows PowerShell
Phần 2: Giới thiệu về Ngôn ngữ lập trình Windows PowerShell
Phần 3: Truyền tham số cho script và hàm, tạo cmdlet

Windows PowerShell là gì và nó dùng để làm gì? Phần 4: Làm việc với đối tượng, lớp riêng

Nguồn: www.habr.com

Thêm một lời nhận xét