Què és Windows PowerShell i per a què serveix? Part 4: Treball amb objectes, classes pròpies

Què és Windows PowerShell i per a què serveix? Part 4: Treball amb objectes, classes pròpies

La sortida de text de les ordres a la finestra de l'intèrpret de PowerShell és només una manera de mostrar informació en una forma adequada per a la percepció humana. De fet dimecres orientat per treballar amb objectes: els cmdlets i les funcions els reben com a entrada i tornat a la sortida, i els tipus de variables disponibles de manera interactiva i en scripts es basen en classes .NET. En el quart article de la sèrie, estudiarem el treball amb objectes amb més detall.

Taula de continguts:

Objectes a PowerShell
Visualització de l'estructura dels objectes
Filtrar objectes
Classificació d'objectes
Selecció d'objectes i les seves parts
Per a cada objecte, grup-objecte i mesura-objecte
Creació d'objectes .NET i COM (Nou-Objecte)
Crida a mètodes estàtics
Escriviu PSCustomObject
Creant les teves pròpies classes

Objectes a PowerShell

Recordem que un objecte és una col·lecció de camps de dades (propietats, esdeveniments, etc.) i mètodes per processar-los (mètodes). La seva estructura s'especifica mitjançant un tipus, que normalment es basa en les classes utilitzades a la plataforma unificada .NET Core. També és possible treballar amb objectes COM, CIM (WMI) i ADSI. Es necessiten propietats i mètodes per realitzar diverses accions sobre les dades; a més, a PowerShell, els objectes es poden passar com a arguments a funcions i cmdlets, assignar els seus valors a variables i també hi ha mecanisme de composició de comandaments (transportador o canonada). Cada comanda de la canalització passa la seva sortida a la següent al seu torn, objecte per objecte. Per al processament, podeu utilitzar cmdlets compilats o crear els vostres funcions avançadesper realitzar diverses manipulacions amb objectes en el pipeline: filtrar, ordenar, agrupar i fins i tot canviar-ne l'estructura. Transmetre dades d'aquesta forma té un avantatge seriós: l'equip receptor no necessita analitzar el flux de bytes (text), tota la informació necessària es recupera fàcilment trucant a les propietats i mètodes adequats.

Visualització de l'estructura dels objectes

Per exemple, executem el cmdlet Get-Process, que us permet obtenir informació sobre els processos que s'executen al sistema:

Què és Windows PowerShell i per a què serveix? Part 4: Treball amb objectes, classes pròpies

Mostrarà algunes dades de text amb format que no donen cap idea sobre les propietats dels objectes retornats i els seus mètodes. Per afinar la sortida, hem d'aprendre a examinar l'estructura dels objectes i el cmdlet Get-Member ens ajudarà amb això:

Get-Process | Get-Member

Què és Windows PowerShell i per a què serveix? Part 4: Treball amb objectes, classes pròpies

Aquí ja veiem el tipus i l'estructura, i amb l'ajuda de paràmetres addicionals podem, per exemple, mostrar només les propietats de l'objecte inclòs a l'entrada:

Get-Process | Get-Member -MemberType Property

Aquests coneixements seran necessaris per resoldre problemes d'administració de manera interactiva o per escriure els vostres propis scripts: per exemple, per obtenir informació sobre processos penjats mitjançant la propietat Responding.

Filtrar objectes

PowerShell permet que els objectes que compleixen una determinada condició passin per una canalització:

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

El resultat d'executar el bloc d'script dins dels parèntesis ha de ser un valor booleà. Si és cert ($true), l'objecte que s'introdueix al cmdlet Where-Object es passarà al llarg de la canalització, en cas contrari ($false) s'eliminarà. Per exemple, mostrem una llista de serveis de Windows Server aturats, és a dir. aquells que tenen la propietat d'estat establerta en "Aturat":

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

Què és Windows PowerShell i per a què serveix? Part 4: Treball amb objectes, classes pròpies

Aquí de nou veiem una representació textual, però si voleu entendre el tipus i l'estructura interna dels objectes que passen per la canalització no és difícil:

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

Què és Windows PowerShell i per a què serveix? Part 4: Treball amb objectes, classes pròpies

Classificació d'objectes

Quan es processen objectes per canalització, sovint cal ordenar-los. Al cmdlet Sort-Object se li passen els noms de les propietats (claus d'ordenació) i retorna objectes ordenats pels seus valors. És fàcil ordenar la sortida dels processos en execució segons el temps de CPU dedicat (propietat de la CPU):

Get-Process | Sort-Object –Property cpu

El paràmetre -Property es pot ometre quan es crida al cmdlet Sort-Object; s'utilitza de manera predeterminada. Per a l'ordenació inversa, utilitzeu el paràmetre -Descending:

Get-Process | Sort-Object cpu -Descending

Què és Windows PowerShell i per a què serveix? Part 4: Treball amb objectes, classes pròpies

Selecció d'objectes i les seves parts

El cmdlet Select-Object us permet seleccionar un nombre específic d'objectes al principi o al final d'una canalització mitjançant els paràmetres -First o -Last. Amb la seva ajuda, podeu seleccionar objectes individuals o certes propietats, i també crear nous objectes basats en ells. Vegem com funciona el cmdlet utilitzant exemples senzills.

L'ordre següent mostra informació sobre els 10 processos que consumeixen la quantitat màxima de RAM (propietat WS):

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

Què és Windows PowerShell i per a què serveix? Part 4: Treball amb objectes, classes pròpies

Només podeu seleccionar certes propietats dels objectes que passen per la canalització i crear-ne de noves basades en elles:

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

Com a resultat de l'operació de la canalització, rebrem un objecte nou, l'estructura del qual serà diferent de l'estructura que retorna el cmdlet Get-Process. Comprovem-ho amb Get-Member:

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

Què és Windows PowerShell i per a què serveix? Part 4: Treball amb objectes, classes pròpies

Tingueu en compte que Select-Object retorna un únic objecte (-First 1) que només té dos dels camps que hem especificat: els seus valors es van copiar del primer objecte passat a la canalització pel cmdlet Get-Process. Una de les maneres de crear objectes als scripts de PowerShell es basa en utilitzar Select-Object:

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

Què és Windows PowerShell i per a què serveix? Part 4: Treball amb objectes, classes pròpies

Mitjançant Select-Object, podeu afegir propietats calculades als objectes que s'han de representar com a taules hash. En aquest cas, el valor de la seva primera clau correspon al nom de la propietat i el valor de la segona clau correspon al valor de la propietat de l'element de canalització actual:

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

Què és Windows PowerShell i per a què serveix? Part 4: Treball amb objectes, classes pròpies

Vegem l'estructura dels objectes que passen pel transportador:

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

Què és Windows PowerShell i per a què serveix? Part 4: Treball amb objectes, classes pròpies

Per a cada objecte, grup-objecte i mesura-objecte

Hi ha altres cmdlets per treballar amb objectes. Com a exemple, parlem dels tres més útils:

Per a cada objecte us permet executar codi de PowerShell per a cada objecte del pipeline:

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

Grup-Objecte agrupa objectes per valor de propietat:

Group-Object PropertyName

Si l'executeu amb el paràmetre -NoElement, podeu esbrinar el nombre d'elements dels grups.

Mesura-Objecte agrega diversos paràmetres de resum per valors de camp d'objecte a la canalització (calcula la suma i també troba el valor mínim, màxim o mitjà):

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

Normalment, els cmdlets comentats s'utilitzen de manera interactiva i sovint es creen en scripts. funcions amb els blocs Begin, Process i End.

Creació d'objectes .NET i COM (Nou-Objecte)

Hi ha molts components de programari amb interfícies .NET Core i COM que són útils per als administradors del sistema. Amb la classe System.Diagnostics.EventLog, podeu gestionar els registres del sistema directament des de Windows PowerShell. Vegem un exemple de creació d'una instància d'aquesta classe mitjançant el cmdlet New-Object amb el paràmetre -TypeName:

New-Object -TypeName System.Diagnostics.EventLog

Què és Windows PowerShell i per a què serveix? Part 4: Treball amb objectes, classes pròpies

Com que no hem especificat un registre d'esdeveniments específic, la instància resultant de la classe no conté dades. Per canviar-ho, heu de cridar un mètode constructor especial durant la seva creació mitjançant el paràmetre -ArgumentList. Si volem accedir al registre de l'aplicació, hauríem de passar la cadena "Aplicació" com a argument al constructor:

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

Què és Windows PowerShell i per a què serveix? Part 4: Treball amb objectes, classes pròpies

Tingueu en compte que hem desat la sortida de l'ordre a la variable $AppLog. Tot i que els pipelines s'utilitzen habitualment en mode interactiu, l'escriptura d'scripts sovint requereix mantenir una referència a un objecte. A més, les classes bàsiques de .NET Core es troben a l'espai de noms del sistema: PowerShell busca per defecte els tipus especificats, de manera que escriure Diagnostics.EventLog en lloc de System.Diagnostics.EventLog és força correcte.

Per treballar amb el registre, podeu utilitzar els mètodes adequats:

$AppLog | Get-Member -MemberType Method

Què és Windows PowerShell i per a què serveix? Part 4: Treball amb objectes, classes pròpies

Suposem que s'esborra amb el mètode Clear() si hi ha drets d'accés:

$AppLog.Clear()

El cmdlet New-Object també s'utilitza per treballar amb components COM. N'hi ha bastants, des de les biblioteques subministrades amb el servidor d'scripts de Windows fins a aplicacions ActiveX, com ara Internet Explorer. Per crear un objecte COM, heu d'establir el paràmetre -ComObject amb el ProgId programàtic de la classe desitjada:

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

Per crear els vostres propis objectes amb una estructura arbitrària, l'ús de New-Object sembla massa arcaic i feixuc; aquest cmdlet s'utilitza per treballar amb components de programari externs a PowerShell. En propers articles es tractarà aquest tema amb més detall. A més dels objectes .NET i COM, també explorarem els objectes CIM (WMI) i ADSI.

Crida a mètodes estàtics

Algunes classes de .NET Core no es poden instància, incloses System.Environment i System.Math. Ells són estàtica i només contenen propietats i mètodes estàtics. Es tracta bàsicament de biblioteques de referència que s'utilitzen sense crear objectes. Podeu fer referència a una classe estàtica mitjançant un literal posant el nom del tipus entre claudàtors. Tanmateix, si mirem l'estructura de l'objecte mitjançant Get-Member, veurem el tipus System.RuntimeType en comptes de System.Environment:

[System.Environment] | Get-Member

Què és Windows PowerShell i per a què serveix? Part 4: Treball amb objectes, classes pròpies

Per veure només els membres estàtics, truqueu a Get-Member amb el paràmetre -Static (tingueu en compte el tipus d'objecte):

[System.Environment] | Get-Member -Static

Què és Windows PowerShell i per a què serveix? Part 4: Treball amb objectes, classes pròpies

Per accedir a propietats i mètodes estàtics, utilitzeu dos dos punts consecutius en comptes d'un punt després del literal:

[System.Environment]::OSVersion

O

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

Què és Windows PowerShell i per a què serveix? Part 4: Treball amb objectes, classes pròpies

Escriviu PSCustomObject

Entre els nombrosos tipus de dades disponibles a PowerShell, val la pena esmentar PSCustomObject, dissenyat per emmagatzemar objectes amb una estructura arbitrària. La creació d'aquest objecte amb el cmdlet New-Object es considera una manera clàssica, però feixuga i obsoleta:

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

Vegem l'estructura de l'objecte:

$object | Get-Member

Què és Windows PowerShell i per a què serveix? Part 4: Treball amb objectes, classes pròpies

A partir de PowerShell 3.0, hi ha una altra sintaxi disponible:

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

Podeu accedir a les dades d'una de les maneres equivalents:

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

Aquí teniu un exemple de conversió d'una taula hash existent en un objecte:

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

Què és Windows PowerShell i per a què serveix? Part 4: Treball amb objectes, classes pròpies

Un dels inconvenients dels objectes d'aquest tipus és que l'ordre de les seves propietats pot canviar. Per evitar-ho, heu d'utilitzar l'atribut [ordered]:

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

Hi ha altres opcions per crear un objecte: més amunt hem vist l'ús del cmdlet Seleccionar-objecte. Només queda esbrinar afegir i eliminar elements. Fer això per a l'objecte de l'exemple anterior és bastant senzill:

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

Què és Windows PowerShell i per a què serveix? Part 4: Treball amb objectes, classes pròpies

El cmdlet Add-Member us permet afegir no només propietats, sinó també mètodes a un $object creat prèviament mitjançant la construcció "-MemberType ScriptMethod":

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

Tingueu en compte que hem utilitzat la variable $ScriptBlock del tipus ScriptBlock per emmagatzemar el codi del nou mètode.

Què és Windows PowerShell i per a què serveix? Part 4: Treball amb objectes, classes pròpies

Per eliminar propietats, utilitzeu el mètode corresponent:

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

Creant les teves pròpies classes

PowerShell 5.0 va introduir la capacitat de definir graus utilitzant la sintaxi característica dels llenguatges de programació orientats a objectes. La paraula de servei Class està pensada per a això, després de la qual s'ha d'especificar el nom de la classe i descriure el seu cos entre parèntesis de l'operador:

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

Aquest és un autèntic tipus .NET Core, amb un cos que descriu les seves propietats, mètodes i altres elements. Vegem un exemple de definició de la classe més senzilla:

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

Per crear un objecte (instància de classe), utilitzeu el cmdlet Nou-Objecte, o un literal del tipus [MyClass] i mètode pseudostàtic nou (constructor per defecte):

$object = New-Object -TypeName MyClass

o

$object = [MyClass]::new()

Analitzem l'estructura de l'objecte:

$object | Get-Member

Què és Windows PowerShell i per a què serveix? Part 4: Treball amb objectes, classes pròpies

No us oblideu de l'abast: no podeu fer referència a un nom de tipus com a cadena ni utilitzar un literal de tipus fora de l'script o mòdul en què es defineix la classe. En aquest cas, les funcions poden retornar instàncies de classe (objectes) que seran accessibles fora del mòdul o script.

Després de crear l'objecte, empleneu les seves propietats:

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

Què és Windows PowerShell i per a què serveix? Part 4: Treball amb objectes, classes pròpies

Tingueu en compte que la descripció de la classe especifica no només els tipus de propietat, sinó també els seus valors per defecte:

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

La descripció d'un mètode de classe s'assembla a la descripció d'una funció, però sense utilitzar la paraula de funció. Com en una funció, els paràmetres es passen als mètodes si cal:

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

Ara el representant de la nostra classe pot somriure:

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

Els mètodes es poden sobrecarregar; a més, una classe té propietats estàtiques i mètodes, així com els constructors els noms dels quals coincideixen amb el nom de la pròpia classe. Una classe definida en un script o mòdul de PowerShell pot servir com a base per a una altra: així és com s'implementa l'herència. En aquest cas, es permet utilitzar les classes .NET existents com a base:

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

La nostra descripció del treball amb objectes a PowerShell no és gaire exhaustiva. En les següents publicacions, intentarem aprofundir-ho amb exemples pràctics: el cinquè article de la sèrie estarà dedicat als problemes d'integració de PowerShell amb components de programari de tercers. Les parts anteriors es poden trobar als enllaços següents.

Part 1: Funcions bàsiques de Windows PowerShell
Part 2: Introducció al llenguatge de programació Windows PowerShell
Part 3: passar paràmetres a scripts i funcions, creant cmdlets

Què és Windows PowerShell i per a què serveix? Part 4: Treball amb objectes, classes pròpies

Font: www.habr.com

Afegeix comentari