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
Table di cuntenutu:
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
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:
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
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"}
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
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
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
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
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()
Utilizendu Select-Object, pudete aghjunghje proprietà calculate à l'uggetti chì deve esse rapprisintatu cum'è
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}
Fighjemu a struttura di l'uggetti chì passanu per u trasportatore:
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member
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.
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
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
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
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ò
[System.Environment] | Get-Member
Per vede solu membri statichi, chjamate Get-Member cù u paràmetru -Static (nota u tipu d'ughjettu):
[System.Environment] | Get-Member -Static
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()
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
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()
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
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member
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.
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
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
$object = New-Object -TypeName MyClass
o
$object = [MyClass]::new()
Analizemu a struttura di l'ughjettu:
$object | Get-Member
Ù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
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à
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.
Source: www.habr.com