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
Taula de continguts:
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
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:
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
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"}
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
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
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
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
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()
Mitjançant Select-Object, podeu afegir propietats calculades als objectes que s'han de representar com a
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}
Vegem l'estructura dels objectes que passen pel transportador:
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member
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.
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
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
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
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
[System.Environment] | Get-Member
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
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()
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
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()
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
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member
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.
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
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
$object = New-Object -TypeName MyClass
o
$object = [MyClass]::new()
Analitzem l'estructura de l'objecte:
$object | Get-Member
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
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é
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.
Font: www.habr.com