Die teksuitvoer van opdragte in die PowerShell-tolkvenster is net 'n manier om inligting te vertoon in 'n vorm wat geskik is vir menslike persepsie. Eintlik Woensdag
INHOUDSOPGAWE:
Voorwerpe in PowerShell
Kom ons onthou dat 'n objek 'n versameling datavelde (eienskappe, gebeurtenisse, ens.) en metodes om dit te verwerk (metodes) is. Die struktuur daarvan word gespesifiseer deur 'n tipe, wat gewoonlik gebaseer is op klasse wat in die verenigde .NET Core-platform gebruik word. Dit is ook moontlik om met COM, CIM (WMI) en ADSI voorwerpe te werk. Eienskappe en metodes is nodig om verskeie aksies op data uit te voer; Daarbenewens, in PowerShell, kan voorwerpe as argumente na funksies en cmdlets deurgegee word, hul waardes aan veranderlikes toegeken word, en daar is ook
Kyk na die struktuur van voorwerpe
Laat ons byvoorbeeld die Get-Process cmdlet laat loop, wat jou toelaat om inligting te bekom oor die prosesse wat in die stelsel loop:
Dit sal sommige geformateerde teksdata vertoon wat geen idee gee oor die eienskappe van die teruggekeerde voorwerpe en hul metodes nie. Om die uitset te verfyn, moet ons leer hoe om die struktuur van voorwerpe te ondersoek, en die Get-Lid-cmdlet sal ons hiermee help:
Get-Process | Get-Member
Hier sien ons reeds die tipe en struktuur, en met behulp van addisionele parameters kan ons byvoorbeeld slegs die eienskappe van die voorwerp wat in die invoer ingesluit is, vertoon:
Get-Process | Get-Member -MemberType Property
Hierdie kennis sal nodig wees om administrasieprobleme interaktief op te los of om jou eie skrifte te skryf: byvoorbeeld om inligting te bekom oor opgehangde prosesse deur die Responding-eienskap te gebruik.
Filter van voorwerpe
PowerShell laat toe dat voorwerpe wat aan 'n sekere voorwaarde voldoen, deur 'n pyplyn gevoer word:
Where-Object { блок сценария }
Die resultaat van die uitvoer van die skripblok binne die hakies moet 'n Boolese waarde wees. As dit waar is ($true), sal die voorwerp wat ingevoer word na die Where-Object-cmdlet langs die pyplyn gestuur word, anders ($false) sal dit uitgevee word. Kom ons vertoon byvoorbeeld 'n lys van gestopte Windows Server-dienste, d.w.s. diegene wie se Status-eienskap op "Gestop" gestel is:
Get-Service | Where-Object {$_.Status -eq "Stopped"}
Hier sien ons weer 'n tekstuele voorstelling, maar as jy die tipe en interne struktuur van die voorwerpe wat deur die pyplyn gaan, wil verstaan, is dit nie moeilik nie:
Get-Service | Where-Object {$_.Status -eq "Stopped"} | Get-Member
Sorteer voorwerpe
Wanneer pyplyn verwerking van voorwerpe, is daar dikwels 'n behoefte om hulle te sorteer. Die Sort-Object-cmdlet word die name van eienskappe (sorteersleutels) deurgegee en gee voorwerpe wat volgens hul waardes gerangskik is terug. Dit is maklik om die uitset van lopende prosesse te sorteer volgens SVE-tyd bestee (spu-eienskap):
Get-Process | Sort-Object –Property cpu
Die -Property parameter kan weggelaat word wanneer die Sort-Object cmdlet geroep word; dit word by verstek gebruik. Vir omgekeerde sortering, gebruik die -Descending parameter:
Get-Process | Sort-Object cpu -Descending
Seleksie van voorwerpe en hul dele
Die Select-Object-cmdlet laat jou toe om 'n spesifieke aantal voorwerpe aan die begin of einde van 'n pyplyn te kies deur die -First of -Last parameters te gebruik. Met sy hulp kan jy enkele voorwerpe of sekere eienskappe kies, en ook nuwe voorwerpe op grond daarvan skep. Kom ons kyk na hoe die cmdlet werk deur eenvoudige voorbeelde te gebruik.
Die volgende opdrag vertoon inligting oor die 10 prosesse wat die maksimum hoeveelheid RAM verbruik (WS-eienskap):
Get-Process | Sort-Object WS -Descending | Select-Object -First 10
U kan slegs sekere eienskappe van voorwerpe wat deur die pyplyn gaan, kies en nuwes op grond daarvan skep:
Get-Process | Select-Object ProcessName, Id -First 1
As gevolg van die pyplyn se werking, sal ons 'n nuwe voorwerp ontvang, waarvan die struktuur sal verskil van die struktuur wat deur die Get-Process cmdlet teruggestuur word. Kom ons verifieer dit met Get-Lid:
Get-Process | Select-Object ProcessName, Id -First 1 | Get-Member
Let daarop dat Select-Object 'n enkele voorwerp (-Eerste 1) terugstuur wat slegs twee van die velde het wat ons gespesifiseer het: hul waardes is gekopieer vanaf die eerste voorwerp wat deur die Get-Process cmdlet na die pyplyn gestuur is. Een van die maniere om voorwerpe in PowerShell-skrifte te skep, is gebaseer op die gebruik van Select-Object:
$obj = Get-Process | Select-Object ProcessName, Id -First 1
$obj.GetType()
Deur Kies-Object te gebruik, kan jy berekende eienskappe by voorwerpe voeg wat as voorgestel moet word
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}
Kom ons kyk na die struktuur van voorwerpe wat deur die vervoerband gaan:
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member
Vir Elke-Object, Groep-Object en Meet-Object
Daar is ander cmdlets om met voorwerpe te werk. As 'n voorbeeld, kom ons praat oor die drie mees bruikbare:
Vir elke voorwerp laat jou toe om PowerShell-kode vir elke voorwerp in die pyplyn uit te voer:
ForEach-Object { блок сценария }
Groep-voorwerp groepeer voorwerpe volgens eiendomswaarde:
Group-Object PropertyName
As jy dit met die -NoElement-parameter laat loop, kan jy die aantal elemente in die groepe uitvind.
Maat-voorwerp versamel verskeie opsommingsparameters deur objekveldwaardes in die pyplyn (bereken die som, en vind ook die minimum, maksimum of gemiddelde waarde):
Measure-Object -Property PropertyName -Minimum -Maximum -Average -Sum
Tipies word die cmdlets wat bespreek word, interaktief gebruik en word dikwels in skrifte geskep.
Skep .NET- en COM-voorwerpe (New-Object)
Daar is baie sagtewarekomponente met .NET Core- en COM-koppelvlakke wat nuttig is vir stelseladministrateurs. Deur die System.Diagnostics.EventLog-klas te gebruik, kan jy stelsellogboeke direk vanaf Windows PowerShell bestuur. Kom ons kyk na 'n voorbeeld van die skep van 'n instansie van hierdie klas deur die New-Object cmdlet met die -TypeName parameter te gebruik:
New-Object -TypeName System.Diagnostics.EventLog
Aangesien ons nie 'n spesifieke gebeurtenislogboek gespesifiseer het nie, bevat die gevolglike geval van die klas geen data nie. Om dit te verander, moet jy 'n spesiale konstruktormetode oproep tydens die skepping daarvan met die -ArgumentList-parameter. As ons toegang tot die toepassingslogboek wil verkry, moet ons die string "Application" as 'n argument aan die konstruktor deurgee:
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog
Neem asseblief kennis dat ons die uitvoer van die opdrag in die $AppLog veranderlike gestoor het. Alhoewel pyplyne algemeen in interaktiewe modus gebruik word, vereis die skryf van skrifte dikwels die handhawing van 'n verwysing na 'n voorwerp. Daarbenewens is die kern .NET Core klasse vervat in die Stelsel naamruimte: PowerShell soek by verstek vir gespesifiseerde tipes daarin, so skryf Diagnostics.EventLog in plaas van System.Diagnostics.EventLog is heeltemal korrek.
Om met die log te werk, kan jy die toepaslike metodes gebruik:
$AppLog | Get-Member -MemberType Method
Kom ons sê dit word skoongemaak deur die Clear() metode as daar toegangsregte is:
$AppLog.Clear()
Die New-Object-cmdlet word ook gebruik om met COM-komponente te werk. Daar is nogal baie van hulle - van die biblioteke wat saam met die Windows-skripbediener voorsien word tot ActiveX-toepassings, soos Internet Explorer. Om 'n COM-objek te skep, moet jy die -ComObject-parameter stel met die programmatiese ProgId van die verlangde klas:
New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject
Om jou eie voorwerpe met 'n arbitrêre struktuur te skep, lyk die gebruik van New-Object te argaïes en omslagtig; hierdie cmdlet word gebruik om met sagtewarekomponente buite PowerShell te werk. In toekomstige artikels sal hierdie kwessie in meer besonderhede bespreek word. Benewens .NET- en COM-objekte, sal ons ook CIM (WMI) en ADSI-objekte verken.
Oproep van statiese metodes
Sommige .NET Core-klasse kan nie geïnstansieer word nie, insluitend System.Environment en System.Math. Hulle is
[System.Environment] | Get-Member
Om slegs statiese lede te sien, bel Get-Lid met die -Static parameter (let op die objektipe):
[System.Environment] | Get-Member -Static
Om toegang tot statiese eienskappe en metodes te kry, gebruik twee opeenvolgende dubbelpunte in plaas van 'n punt na die letterlike:
[System.Environment]::OSVersion
Of
$test=[System.Math]::Sqrt(25)
$test
$test.GetType()
Tik PSCustomObject
Onder die talle datatipes wat in PowerShell beskikbaar is, is dit die moeite werd om PSCustomObject te noem, ontwerp vir die stoor van voorwerpe met 'n arbitrêre struktuur. Die skep van so 'n voorwerp met die New-Object cmdlet word beskou as 'n klassieke, maar omslagtige en verouderde manier:
$object = New-Object –TypeName PSCustomObject -Property @{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'}
Kom ons kyk na die struktuur van die voorwerp:
$object | Get-Member
Vanaf PowerShell 3.0 is 'n ander sintaksis beskikbaar:
$object = [PSCustomObject]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
U kan toegang tot die data verkry op een van die ekwivalente maniere:
$object.Name
$object.'Name'
$value = 'Name'
$object.$value
Hier is 'n voorbeeld van die omskakeling van 'n bestaande hashable na 'n voorwerp:
$hash = @{'Name'='Ivan Danko'; 'City'='Moscow'; 'Country'='Russia'}
$hash.GetType()
$object = [pscustomobject]$hash
$object.GetType()
Een van die nadele van voorwerpe van hierdie tipe is dat die volgorde van hul eienskappe kan verander. Om dit te vermy, moet jy die [bestel] kenmerk gebruik:
$object = [PSCustomObject][ordered]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
Daar is ander opsies om 'n voorwerp te skep: hierbo het ons gekyk na die gebruik van die cmdlet
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member
Die Add-Member cmdlet laat jou toe om nie net eienskappe, maar ook metodes by 'n voorheen geskepte $objek by te voeg deur die "-MemberType ScriptMethod"-konstruksie te gebruik:
$ScriptBlock = {
# код
}
$object | Add-Member -Name "MyMethod" -MemberType ScriptMethod -Value $ScriptBlock
$object | Get-Member
Neem asseblief kennis dat ons die $ScriptBlock-veranderlike van tipe ScriptBlock gebruik het om die kode vir die nuwe metode te stoor.
Om eiendomme te verwyder, gebruik die ooreenstemmende metode:
$object.psobject.properties.remove('Name')
Skep jou eie klasse
PowerShell 5.0 het die vermoë om te definieer bekendgestel
class MyClass
{
# тело класса
}
Dit is 'n ware .NET Core tipe, met 'n liggaam wat sy eienskappe, metodes en ander elemente beskryf. Kom ons kyk na 'n voorbeeld van die definisie van die eenvoudigste klas:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
}
Om 'n objek (klasinstansie) te skep, gebruik die cmdlet
$object = New-Object -TypeName MyClass
of
$object = [MyClass]::new()
Kom ons ontleed die struktuur van die voorwerp:
$object | Get-Member
Moenie van omvang vergeet nie: jy kan nie na 'n tipenaam as 'n string verwys of 'n letterlike tipe buite die skrif of module waarin die klas gedefinieer is, gebruik nie. In hierdie geval kan funksies klasgevalle (objekte) terugstuur wat buite die module of skrif toeganklik sal wees.
Nadat u die voorwerp geskep het, vul sy eienskappe in:
$object.Name = 'Ivan Danko'
$object.City = 'Moscow'
$object.Country = 'Russia'
$object
Let daarop dat die klasbeskrywing nie net die eiendomstipes spesifiseer nie, maar ook hul verstekwaardes:
class Example
{
[string]$Name = 'John Doe'
}
Die beskrywing van 'n klasmetode lyk soos die beskrywing van 'n funksie, maar sonder om die funksiewoord te gebruik. Soos in 'n funksie, word parameters aan metodes oorgedra indien nodig:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
#описание метода
Smile([bool]$param1)
{
If($param1) {
Write-Host ':)'
}
}
}
Nou kan die verteenwoordiger van ons klas glimlag:
$object = [MyClass]::new()
$object.Smile($true)
Metodes kan oorlaai word; daarbenewens het 'n klas
class MyClass2 : MyClass
{
#тело нового класса, базовым для которого является MyClass
}
[MyClass2]::new().Smile($true)
Ons beskrywing van werk met voorwerpe in PowerShell is skaars volledig. In die volgende publikasies sal ons probeer om dit te verdiep met praktiese voorbeelde: die vyfde artikel in die reeks sal gewy word aan die kwessies van die integrasie van PowerShell met derdeparty sagteware komponente. Vorige dele kan gevind word by die skakels hieronder.
Bron: will.com