Đầ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ư
Mục lục:
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ó
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:
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
Ở đâ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"}
Ở đâ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
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
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
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
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()
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
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}
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
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.
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
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
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
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
[System.Environment] | Get-Member
Để 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
Để 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()
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
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()
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
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member
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.
Để 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
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
$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
Đừ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
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ó
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.
Nguồn: www.habr.com