Cos'è Windows PowerShell e a cosa serve? Parte 4: U travagliu cù l'uggetti, classi propiu

Cos'è Windows PowerShell e a cosa serve? Parte 4: U travagliu cù l'uggetti, classi propiu

L'output di testu di cumandamenti in a finestra di l'interprete PowerShell hè solu un modu per vede l'infurmazioni in una forma adattata per a percepzione umana. In verità u mercuri orientatu per travaglià cù l'uggetti: cmdlets è funzioni ricevenu cum'è input è riturnatu à a surtita, è i tipi di variàbili dispunibuli interattivamente è in scripts sò basati nantu à e classi .NET. In u quartu articulu di a serie, studiaremu u travagliu cù l'uggetti in più detail.

Table di cuntenutu:

Oggetti in PowerShell
Vede a struttura di l'uggetti
Ugetti di filtrazione
Classificazione di l'uggetti
Selezzione di l'uggetti è e so parti
ForEach-Object, Group-Object è Measure-Object
Creazione di oggetti .NET è COM (New-Object)
Chjamate i metudi statichi
Type PSCustomObject
Crea e vostre propiu classi

Oggetti in PowerShell

Ricurdemu chì un ughjettu hè una cullizzioni di campi di dati (proprietà, avvenimenti, etc.) è metudi per processà (metudu). A so struttura hè specificatu da un tipu, chì hè generalmente basatu nantu à classi utilizati in a piattaforma unificata .NET Core. Hè ancu pussibule di travaglià cù oggetti COM, CIM (WMI) è ADSI. Pruprietà è metudi sò necessarii per realizà diverse azzioni nantu à e dati; in più, in PowerShell, l'uggetti ponu esse passati cum'è argumenti à funzioni è cmdlets, assignati i so valori à variàbili, è ci hè ancu mecanismu di cumpusizioni di cumanda (conveyor o pipeline). Ogni cumanda in u pipeline passa u so output à u prossimu à u turnu, ughjettu per ughjettu. Per u processu, pudete aduprà cmdlet compilati o creà u vostru propiu funzioni avanzateper fà diverse manipulazioni cù l'uggetti in u pipeline: filtru, sorte, raggruppamentu, è ancu cambià a so struttura. A trasmissione di dati in questa forma hà un vantaghju seriu: a squadra di riceve ùn hà micca bisognu di analizà u flussu di byte (testu), tutte l'infurmazioni necessarii sò facilmente recuperati chjamendu e proprietà è metudi appropritati.

Vede a struttura di l'uggetti

Per esempiu, eseguite u cmdlet Get-Process, chì vi permette di ottene infurmazioni nantu à i prucessi chì sò in esecuzione in u sistema:

Cos'è Windows PowerShell e a cosa serve? Parte 4: U travagliu cù l'uggetti, classi propiu

Vi mostrarà qualchi dati di testu furmatu chì ùn dà micca idea di e proprietà di l'uggetti restituiti è i so metudi. Per sintonizà l'output, avemu bisognu di amparà cumu esaminà a struttura di l'uggetti, è u cmdlet Get-Member ci aiuterà cun questu:

Get-Process | Get-Member

Cos'è Windows PowerShell e a cosa serve? Parte 4: U travagliu cù l'uggetti, classi propiu

Quì avemu digià vede u tipu è a struttura, è cù l'aiutu di paràmetri supplementari pudemu, per esempiu, vede solu e proprietà di l'ughjettu inclusu in l'input:

Get-Process | Get-Member -MemberType Property

Sta cunniscenza serà necessariu per risolve i prublemi di amministrazione in modu interattivu o per scrive u vostru propiu script: per esempiu, per ottene infurmazioni nantu à i prucessi hung usendu a pruprietà Responding.

Ugetti di filtrazione

PowerShell permette à l'uggetti chì scontranu una certa cundizione di passà per un pipeline:

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

U risultatu di eseguisce u bloccu di script in i parentesi deve esse un valore boolean. S'ellu hè veru ($true), l'ughjettu chì hè input à u cmdlet Where-Object serà passatu longu u pipeline, altrimenti ($false) serà sguassatu. Per esempiu, affissemu una lista di servizii Windows Server fermati, i.e. quelli chì a pruprietà di Status hè impostata à "Stopped":

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

Cos'è Windows PowerShell e a cosa serve? Parte 4: U travagliu cù l'uggetti, classi propiu

Quì dinò vedemu una rappresentazione testuale, ma se vulete capisce u tipu è a struttura interna di l'uggetti chì passanu per u pipeline ùn hè micca difficiule:

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

Cos'è Windows PowerShell e a cosa serve? Parte 4: U travagliu cù l'uggetti, classi propiu

Classificazione di l'uggetti

Quandu u prucessu di pipeline di l'uggetti, ci hè spessu bisognu di sorte. U cmdlet Sort-Object hè passatu i nomi di pruprietà (chjavi di sorte) è torna l'uggetti urdinati da i so valori. Hè faciule d'ordine l'output di i prucessi in esecuzione per u tempu di CPU passatu (proprietà CPU):

Get-Process | Sort-Object –Property cpu

U paràmetru -Property pò esse omessi quandu si chjama u cmdlet Sort-Object; hè utilizatu per automaticamente. Per a classificazione inversa, utilizate u paràmetru -Descending:

Get-Process | Sort-Object cpu -Descending

Cos'è Windows PowerShell e a cosa serve? Parte 4: U travagliu cù l'uggetti, classi propiu

Selezzione di l'uggetti è e so parti

U cmdlet Select-Object permette di selezziunà un numeru specificu d'uggetti à u principiu o à a fine di una pipeline utilizendu i paràmetri -First o -Last. Cù u so aiutu, pudete selezziunà l'uggetti unichi o certe proprietà, è ancu creà novi oggetti basati nantu à elli. Fighjemu cumu funziona u cmdlet usendu esempi simplici.

U cumandimu seguitu mostra infurmazione nantu à i 10 prucessi chì cunsumanu a quantità massima di RAM (proprietà WS):

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

Cos'è Windows PowerShell e a cosa serve? Parte 4: U travagliu cù l'uggetti, classi propiu

Pudete selezziunate solu certe proprietà di l'uggetti chì passanu per u pipeline è creanu novi basati nantu à elli:

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

In u risultatu di u funziunamentu di u pipeline, riceveremu un novu ughjettu, a struttura di quale serà diffirenti da a struttura restituita da u cmdlet Get-Process. Verificà questu cù Get-Member:

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

Cos'è Windows PowerShell e a cosa serve? Parte 4: U travagliu cù l'uggetti, classi propiu

Nota chì Select-Object torna un oggettu unicu (-First 1) chì hà solu dui di i campi chì avemu specificatu: i so valori sò stati copiati da u primu ughjettu passatu in u pipeline da u cmdlet Get-Process. Unu di i modi per creà oggetti in script PowerShell hè basatu annantu à l'usu di Select-Object:

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

Cos'è Windows PowerShell e a cosa serve? Parte 4: U travagliu cù l'uggetti, classi propiu

Utilizendu Select-Object, pudete aghjunghje proprietà calculate à l'uggetti chì deve esse rapprisintatu cum'è tavule hash. In questu casu, u valore di a so prima chjave currisponde à u nome di a pruprietà, è u valore di a seconda chjave currisponde à u valore di a pruprietà per l'elementu di pipeline attuale:

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

Cos'è Windows PowerShell e a cosa serve? Parte 4: U travagliu cù l'uggetti, classi propiu

Fighjemu a struttura di l'uggetti chì passanu per u trasportatore:

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

Cos'è Windows PowerShell e a cosa serve? Parte 4: U travagliu cù l'uggetti, classi propiu

ForEach-Object, Group-Object è Measure-Object

Ci sò altri cmdlets per travaglià cù l'uggetti. Per esempiu, parlemu di i trè più utili:

ForEach-Ughjettu permette di eseguisce u codice PowerShell per ogni ughjettu in u pipeline:

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

Gruppu-Oggettu raggruppa l'uggetti per valore di pruprietà:

Group-Object PropertyName

Se l'eseguite cù u paràmetru -NoElement, pudete truvà u numeru di elementi in i gruppi.

Misura-ughjettu aggrega diversi paràmetri di sintesi per i valori di u campu di l'ughjettu in u pipeline (calcula a somma, è trova ancu u valore minimu, massimu o mediu):

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

Di genere, i cmdlets discututi sò usati interattivamente, è sò spessu creati in scripts. funzioni cù i blocchi Begin, Process and End.

Creazione di oggetti .NET è COM (New-Object)

Ci hè parechje cumpunenti di software cù .NET Core è interfacce COM chì sò utili à l'amministratori di u sistema. Utilizendu a classa System.Diagnostics.EventLog, pudete gestisce i logs di u sistema direttamente da Windows PowerShell. Fighjemu un esempiu di creazione di una istanza di sta classa cù u cmdlet New-Object cù u paràmetru -TypeName:

New-Object -TypeName System.Diagnostics.EventLog

Cos'è Windows PowerShell e a cosa serve? Parte 4: U travagliu cù l'uggetti, classi propiu

Siccomu ùn avemu micca specificatu un logu di l'avvenimentu specificu, l'istanza resultanti di a classe ùn cuntene micca dati. Per cambià questu, avete bisognu di chjamà un metudu di custruttore speciale durante a so creazione cù u paràmetru -ArgumentList. Se vulemu accede à u logu di l'applicazione, duvemu passà a stringa "Applicazione" cum'è argumentu à u custruttore:

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

Cos'è Windows PowerShell e a cosa serve? Parte 4: U travagliu cù l'uggetti, classi propiu

Per piacè nutate chì avemu salvatu l'output di u cumandimu in a variabile $AppLog. Ancu se i pipelines sò comunmente usati in modu interattivu, scrive scripts spessu esige mantene una riferenza à un ughjettu. Inoltre, i classi core .NET Core sò cuntenuti in u spaziu di u sistema: PowerShell per difettu cerca tipi specificati in questu, cusì scrive Diagnostics.EventLog invece di System.Diagnostics.EventLog hè abbastanza currettu.

Per travaglià cù u logu, pudete aduprà i metudi apprupriati:

$AppLog | Get-Member -MemberType Method

Cos'è Windows PowerShell e a cosa serve? Parte 4: U travagliu cù l'uggetti, classi propiu

Diciamu chì hè sbulicatu da u metudu Clear () se ci sò diritti d'accessu:

$AppLog.Clear()

U cmdlet New-Object hè ancu usatu per travaglià cù cumpunenti COM. Ci sò assai di elli - da e biblioteche furnite cù u servitore di script di Windows à l'applicazioni ActiveX, cum'è Internet Explorer. Per creà un ughjettu COM, avete bisognu di stabilisce u paràmetru -ComObject cù u ProgId programmaticu di a classa desiderata:

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

Per creà i vostri ogetti cù una struttura arbitraria, usendu New-Object pare troppu arcaicu è ingombrante; stu cmdlet hè adupratu per travaglià cù cumpunenti di software esterni à PowerShell. In articuli futuri, sta questione serà discututa in più detail. In più di l'uggetti .NET è COM, avemu ancu scopre l'oggetti CIM (WMI) è ADSI.

Chjamate i metudi statichi

Certi classi .NET Core ùn ponu esse instanziati, cumprese System.Environment è System.Math. Sò staticu è cuntene solu pruprietà statiche è metudi. Quessi sò essenzialmente biblioteche di riferimentu chì sò usati senza creà oggetti. Pudete riferite à una classa statica per mezu di un litterale inserendu u nome di u tipu in parentesi quadrate. In ogni casu, se guardemu à a struttura di l'ughjettu cù Get-Member, vedemu u tipu System.RuntimeType invece di System.Environment:

[System.Environment] | Get-Member

Cos'è Windows PowerShell e a cosa serve? Parte 4: U travagliu cù l'uggetti, classi propiu

Per vede solu membri statichi, chjamate Get-Member cù u paràmetru -Static (nota u tipu d'ughjettu):

[System.Environment] | Get-Member -Static

Cos'è Windows PowerShell e a cosa serve? Parte 4: U travagliu cù l'uggetti, classi propiu

Per accede à e pruprietà statiche è i metudi, utilizate dui punti consecutivi invece di un periodu dopu à u literale:

[System.Environment]::OSVersion

Or

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

Cos'è Windows PowerShell e a cosa serve? Parte 4: U travagliu cù l'uggetti, classi propiu

Type PSCustomObject

Trà i numerosi tipi di dati dispunibuli in PowerShell, vale a pena menzione PSCustomObject, cuncepitu per almacenà oggetti cù una struttura arbitraria. Crià un tali ughjettu cù u cmdlet New-Object hè cunsideratu un modu classicu, ma ingombrante è anticu:

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

Fighjemu a struttura di l'ughjettu:

$object | Get-Member

Cos'è Windows PowerShell e a cosa serve? Parte 4: U travagliu cù l'uggetti, classi propiu

Partendu da PowerShell 3.0, una altra sintassi hè dispunibule:

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

Pudete accede à i dati in unu di i modi equivalenti:

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

Eccu un esempiu di cunvertisce un hashtable esistente à un oggettu:

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

Cos'è Windows PowerShell e a cosa serve? Parte 4: U travagliu cù l'uggetti, classi propiu

Unu di i disadvantages di l'uggetti di stu tipu hè chì l'ordine di e so proprietà pò cambià. Per evitari questu, duvete aduprà l'attributu [urdinatu]:

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

Ci sò altre opzioni per creà un oggettu: sopra avemu vistu cù u cmdlet Selezzione-Ughjettu. Tuttu ciò chì resta hè di calculà aghjunghje è sguassà elementi. Fendu questu per l'ughjettu da l'esempiu precedente hè abbastanza simplice:

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

Cos'è Windows PowerShell e a cosa serve? Parte 4: U travagliu cù l'uggetti, classi propiu

U cmdlet Add-Member permette di aghjunghje micca solu pruprietà, ma ancu metudi à un $object creatu prima utilizendu a custruzzione "-MemberType ScriptMethod":

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

Per piacè nutate chì avemu usatu a variàbile $ScriptBlock di tipu ScriptBlock per almacenà u codice per u novu metudu.

Cos'è Windows PowerShell e a cosa serve? Parte 4: U travagliu cù l'uggetti, classi propiu

Per sguassà e proprietà, utilizate u metudu currispundenti:

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

Crea e vostre propiu classi

PowerShell 5.0 hà introduttu a capacità di definisce classi utilizendu a sintassi caratteristica di i linguaggi di prugrammazione orientati à l'ughjettu. A parolla di serviziu Class hè destinata à questu, dopu chì duvete specificà u nome di a classa è discrive u so corpu in parentesi di l'operatore:

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

Questu hè un veru tipu .NET Core, cù un corpu chì descrive e so proprietà, metudi è altri elementi. Fighjemu un esempiu di definisce a classa più simplice:

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

Per creà un oggettu (istanza di classa), utilizate u cmdlet Novu-ughjettu, o un litterale di tipu [MyClass] è metudu pseudostaticu novu (custruttore predeterminatu):

$object = New-Object -TypeName MyClass

o

$object = [MyClass]::new()

Analizemu a struttura di l'ughjettu:

$object | Get-Member

Cos'è Windows PowerShell e a cosa serve? Parte 4: U travagliu cù l'uggetti, classi propiu

Ùn vi scurdate di u scopu: ùn pudete micca riferite à un nome di tipu cum'è una stringa o utilizate un tipu literale fora di u script o modulu in quale a classa hè definita. In questu casu, e funzioni ponu rinvià istanze di classi (oggetti) chì saranu accessibili fora di u modulu o script.

Dopu avè creatu l'ughjettu, compie e so proprietà:

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

Cos'è Windows PowerShell e a cosa serve? Parte 4: U travagliu cù l'uggetti, classi propiu

Nota chì a descrizzione di a classa specifica micca solu i tipi di pruprietà, ma ancu i so valori predeterminati:

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

A descrizzione di un metudu di classi s'assumiglia à a descrizzione di una funzione, ma senza utilizà a parolla di funzione. Cum'è in una funzione, i paràmetri sò passati à i metudi, se ne necessariu:

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

Avà u rapprisentante di a nostra classe pò surrisu:

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

I metudi ponu esse sovraccarichi; in più, una classa hà pruprietà statiche è metudi, è ancu i custruttori chì i nomi coincidenu cù u nome di a classe stessa. Una classa definita in un script o un modulu PowerShell pò serve cum'è una basa per un altru - questu hè cumu l'eredità hè implementata. In questu casu, hè permessu di utilizà e classi .NET esistenti cum'è basi:

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

A nostra descrizzione di travaglià cù oggetti in PowerShell hè pocu exhaustiva. In e publicazioni seguenti, pruvaremu à approfondisce cù esempi pratichi: u quintu articulu di a serie serà dedicatu à i prublemi di integrazione di PowerShell cù cumpunenti di software di terzu. E parti passate ponu esse truvate à i ligami sottu.

Parte 1: Funzioni di basa di Windows PowerShell
Parte 2: Introduzione à a Lingua di Programmazione Windows PowerShell
Parte 3: passanu paràmetri à scripts è funzioni, creanu cmdlets

Cos'è Windows PowerShell e a cosa serve? Parte 4: U travagliu cù l'uggetti, classi propiu

Source: www.habr.com

Add a comment