Toleo la maandishi la amri katika dirisha la mkalimani la PowerShell ni njia tu ya kuonyesha habari katika fomu inayofaa kwa mtazamo wa mwanadamu. Kweli Jumatano
Jedwali la Yaliyomo:
Vitu katika PowerShell
Hebu tukumbuke kwamba kitu ni mkusanyiko wa mashamba ya data (mali, matukio, nk) na mbinu za usindikaji (mbinu). Muundo wake unaelezwa na aina, ambayo kwa kawaida inategemea madarasa yaliyotumiwa katika jukwaa la umoja la NET Core. Pia inawezekana kufanya kazi na vitu vya COM, CIM (WMI) na ADSI. Sifa na mbinu zinahitajika kufanya vitendo mbalimbali kwenye data; kwa kuongeza, katika PowerShell, vitu vinaweza kupitishwa kama hoja kwa kazi na cmdlets, kupewa maadili yao kwa vigezo, na pia kuna.
Kuangalia muundo wa vitu
Kwa mfano, wacha tuendeshe Get-Process cmdlet, ambayo hukuruhusu kupata habari kuhusu michakato inayoendeshwa kwenye mfumo:
Itaonyesha data fulani ya maandishi iliyoumbizwa ambayo haitoi wazo lolote kuhusu sifa za vitu vilivyorejeshwa na mbinu zao. Ili kurekebisha matokeo, tunahitaji kujifunza jinsi ya kuchunguza muundo wa vitu, na Get-Member cmdlet itatusaidia na hili:
Get-Process | Get-Member
Hapa tayari tunaona aina na muundo, na kwa msaada wa vigezo vya ziada tunaweza, kwa mfano, kuonyesha tu mali ya kitu kilichojumuishwa kwenye pembejeo:
Get-Process | Get-Member -MemberType Property
Ujuzi huu utahitajika ili kutatua matatizo ya utawala kwa maingiliano au kuandika hati zako mwenyewe: kwa mfano, kupata taarifa kuhusu michakato ya kupachika kwa kutumia mali ya Kujibu.
Kuchuja vitu
PowerShell inaruhusu vitu vinavyokidhi hali fulani kupitishwa kupitia bomba:
Where-Object { блок сценария }
Matokeo ya kutekeleza kizuizi cha hati ndani ya mabano lazima yawe thamani ya boolean. Ikiwa ni kweli ($true), kitu ambacho kimeingizwa kwenye cmdlet ya Who-Object kitapitishwa kando ya bomba, vinginevyo ($false) kitafutwa. Kwa mfano, hebu tuonyeshe orodha ya huduma za Windows Server zilizosimamishwa, i.e. wale ambao mali yao ya Hali imewekwa kuwa "Imesimamishwa":
Get-Service | Where-Object {$_.Status -eq "Stopped"}
Hapa tena tunaona uwakilishi wa maandishi, lakini ikiwa unataka kuelewa aina na muundo wa ndani wa vitu vinavyopita kwenye bomba si vigumu:
Get-Service | Where-Object {$_.Status -eq "Stopped"} | Get-Member
Kupanga vitu
Wakati wa usindikaji wa bomba la vitu, mara nyingi kuna haja ya kuzipanga. Cmdlet ya Kitu cha Kupanga hupitishwa majina ya mali (vifunguo vya kuchagua) na hurejesha vitu vilivyoagizwa na maadili yao. Ni rahisi kupanga matokeo ya michakato inayoendeshwa na wakati wa CPU uliotumika (mali ya cpu):
Get-Process | Sort-Object –Property cpu
Kigezo cha -Property kinaweza kuachwa wakati wa kupiga cmdlet ya Kitu cha Panga; inatumiwa kwa chaguo-msingi. Kwa kupanga nyuma, tumia -Descending parameta:
Get-Process | Sort-Object cpu -Descending
Kuchagua vitu na sehemu zao
Chagua-Kitu cmdlet hukuruhusu kuchagua idadi maalum ya vitu mwanzoni au mwisho wa bomba kwa kutumia vigezo vya -Kwanza au -Mwisho. Kwa msaada wake, unaweza kuchagua vitu moja au mali fulani, na pia kuunda vitu vipya kulingana nao. Wacha tuangalie jinsi cmdlet inavyofanya kazi kwa kutumia mifano rahisi.
Amri ifuatayo inaonyesha habari kuhusu michakato 10 inayotumia kiwango cha juu cha RAM (mali ya WS):
Get-Process | Sort-Object WS -Descending | Select-Object -First 10
Unaweza kuchagua mali fulani tu ya vitu vinavyopita kwenye bomba na kuunda mpya kulingana nao:
Get-Process | Select-Object ProcessName, Id -First 1
Kama matokeo ya operesheni ya bomba, tutapokea kitu kipya, ambacho muundo wake utatofautiana na muundo uliorejeshwa na cmdlet ya Mchakato wa Kupata. Hebu tuthibitishe hili kwa kutumia Pata Mwanachama:
Get-Process | Select-Object ProcessName, Id -First 1 | Get-Member
Kumbuka kuwa Select-Object inarudisha kitu kimoja (-First 1) ambacho kina sehemu mbili tu tulizobainisha: thamani zake zilinakiliwa kutoka kwa kitu cha kwanza kilichopitishwa kwenye bomba na Get-Process cmdlet. Mojawapo ya njia za kuunda vitu katika hati za PowerShell inategemea kutumia Select-Object:
$obj = Get-Process | Select-Object ProcessName, Id -First 1
$obj.GetType()
Kwa kutumia Select-Object, unaweza kuongeza mali zilizokokotwa kwa vitu vinavyohitaji kuwakilishwa kama
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}
Wacha tuangalie muundo wa vitu vinavyopita kupitia conveyor:
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member
ForEach-Object, Group-Object na Pima-Object
Kuna cmdlets zingine za kufanya kazi na vitu. Kama mfano, hebu tuzungumze juu ya tatu muhimu zaidi:
Kwa Kila Kitu hukuruhusu kuendesha msimbo wa PowerShell kwa kila kitu kwenye bomba:
ForEach-Object { блок сценария }
Kikundi-Kitu huweka vitu kwa thamani ya mali:
Group-Object PropertyName
Ikiwa utaiendesha na kigezo cha -NoElement, unaweza kujua idadi ya vitu kwenye vikundi.
Pima-Kitu hukusanya vigezo mbalimbali vya muhtasari na maadili ya uwanja wa kitu kwenye bomba (huhesabu jumla, na pia hupata thamani ya chini, ya juu au ya wastani):
Measure-Object -Property PropertyName -Minimum -Maximum -Average -Sum
Kwa kawaida, cmdlets zilizojadiliwa hutumiwa kwa maingiliano, na mara nyingi huundwa katika hati.
Kuunda vipengee vya .NET na COM (Kitu Kipya)
Kuna vipengele vingi vya programu vilivyo na violesura vya .NET Core na COM ambavyo ni muhimu kwa wasimamizi wa mfumo. Kwa kutumia darasa la System.Diagnostics.EventLog, unaweza kudhibiti kumbukumbu za mfumo moja kwa moja kutoka Windows PowerShell. Wacha tuangalie mfano wa kuunda mfano wa darasa hili kwa kutumia New-Object cmdlet na parameta ya -TypeName:
New-Object -TypeName System.Diagnostics.EventLog
Kwa kuwa hatukubainisha kumbukumbu maalum ya tukio, mfano unaotokana wa darasa hauna data. Ili kubadilisha hii, unahitaji kupiga simu njia maalum ya wajenzi wakati wa uumbaji wake kwa kutumia parameter -ArgumentList. Ikiwa tunataka kufikia logi ya programu, tunapaswa kupitisha kamba "Maombi" kama hoja kwa mjenzi:
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog
Tafadhali kumbuka kuwa tulihifadhi matokeo ya amri katika tofauti ya $AppLog. Ingawa mabomba hutumiwa kwa kawaida katika hali ya mwingiliano, kuandika hati mara nyingi huhitaji kudumisha marejeleo ya kitu. Zaidi ya hayo, madarasa ya msingi ya NET Core yamo katika nafasi ya majina ya Mfumo: PowerShell kwa chaguomsingi hutafuta aina zilizobainishwa ndani yake, kwa hivyo kuandika Diagnostics.EventLog badala ya System.Diagnostics.EventLog ni sahihi kabisa.
Ili kufanya kazi na logi, unaweza kutumia njia zinazofaa:
$AppLog | Get-Member -MemberType Method
Wacha tuseme imesafishwa na njia ya Clear() ikiwa kuna haki za ufikiaji:
$AppLog.Clear()
Cmdlet ya Kitu Kipya pia hutumiwa kufanya kazi na vijenzi vya COM. Kuna mengi yao - kutoka kwa maktaba zinazotolewa na seva ya hati ya Windows hadi programu za ActiveX, kama vile Internet Explorer. Ili kuunda kitu cha COM, unahitaji kuweka parameta -ComObject na ProgId ya programu ya darasa unayotaka:
New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject
Ili kuunda vitu vyako mwenyewe na muundo wa kiholela, kutumia New-Object inaonekana kuwa ya kizamani na ngumu; cmdlet hii hutumiwa kufanya kazi na vifaa vya programu nje ya PowerShell. Katika makala zijazo suala hili litajadiliwa kwa undani zaidi. Mbali na vipengee vya .NET na COM, tutachunguza pia vitu vya CIM (WMI) na ADSI.
Njia za Kupiga Simu
Baadhi ya madarasa ya NET Core hayawezi kuanzishwa, ikiwa ni pamoja na System.Environment na System.Math. Wao ni
[System.Environment] | Get-Member
Ili kutazama washiriki tuli pekee, piga simu ya Get-Member kwa -Static parameta (kumbuka aina ya kitu):
[System.Environment] | Get-Member -Static
Ili kufikia mali na mbinu tuli, tumia koloni mbili mfululizo badala ya kipindi baada ya halisi:
[System.Environment]::OSVersion
Au
$test=[System.Math]::Sqrt(25)
$test
$test.GetType()
Chapa PSCustomObject
Miongoni mwa aina nyingi za data zinazopatikana katika PowerShell, inafaa kutaja PSCustomObject, iliyoundwa kwa ajili ya kuhifadhi vitu na muundo wa kiholela. Kuunda kitu kama hicho kwa kutumia New-Object cmdlet inachukuliwa kuwa ya kawaida, lakini njia ngumu na ya zamani:
$object = New-Object –TypeName PSCustomObject -Property @{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'}
Wacha tuangalie muundo wa kitu:
$object | Get-Member
Kuanzia na PowerShell 3.0, syntax nyingine inapatikana:
$object = [PSCustomObject]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
Unaweza kufikia data kwa njia moja sawa:
$object.Name
$object.'Name'
$value = 'Name'
$object.$value
Hapa kuna mfano wa kubadilisha hashtable iliyopo kuwa kitu:
$hash = @{'Name'='Ivan Danko'; 'City'='Moscow'; 'Country'='Russia'}
$hash.GetType()
$object = [pscustomobject]$hash
$object.GetType()
Moja ya hasara za vitu vya aina hii ni kwamba utaratibu wa mali zao unaweza kubadilika. Ili kuepuka hili, lazima utumie sifa [iliyoagizwa]:
$object = [PSCustomObject][ordered]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
Kuna chaguzi zingine za kuunda kitu: hapo juu tuliangalia kutumia cmdlet
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member
Cmdlet ya Mwanachama wa Ongeza hukuruhusu kuongeza sio mali tu, bali pia njia kwa $object iliyoundwa hapo awali kwa kutumia "-MemberType ScriptMethod" ujenzi:
$ScriptBlock = {
# код
}
$object | Add-Member -Name "MyMethod" -MemberType ScriptMethod -Value $ScriptBlock
$object | Get-Member
Tafadhali kumbuka kuwa tulitumia aina tofauti ya $ScriptBlock ya ScriptBlock kuhifadhi msimbo wa mbinu mpya.
Ili kuondoa mali, tumia njia inayolingana:
$object.psobject.properties.remove('Name')
Kuunda Madarasa Yako Mwenyewe
PowerShell 5.0 ilianzisha uwezo wa kufafanua
class MyClass
{
# тело класса
}
Hii ni aina ya kweli ya NET Core, yenye mwili unaoelezea sifa zake, mbinu na vipengele vingine. Wacha tuangalie mfano wa kufafanua darasa rahisi zaidi:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
}
Ili kuunda kitu (mfano wa darasa), tumia cmdlet
$object = New-Object -TypeName MyClass
au
$object = [MyClass]::new()
Wacha tuchambue muundo wa kitu:
$object | Get-Member
Usisahau kuhusu upeo: huwezi kurejelea jina la aina kama mfuatano au kutumia aina halisi nje ya hati au moduli ambamo darasa limefafanuliwa. Katika hali hii, chaguo za kukokotoa zinaweza kurudisha matukio ya darasa (vitu) ambavyo vitafikiwa nje ya moduli au hati.
Baada ya kuunda kitu, jaza mali zake:
$object.Name = 'Ivan Danko'
$object.City = 'Moscow'
$object.Country = 'Russia'
$object
Kumbuka kuwa maelezo ya darasa hayabainishi tu aina za mali, lakini pia maadili yao ya msingi:
class Example
{
[string]$Name = 'John Doe'
}
Maelezo ya mbinu ya darasa yanafanana na maelezo ya chaguo za kukokotoa, lakini bila kutumia neno la kukokotoa. Kama katika kazi, vigezo hupitishwa kwa njia ikiwa ni lazima:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
#описание метода
Smile([bool]$param1)
{
If($param1) {
Write-Host ':)'
}
}
}
Sasa mwakilishi wa darasa letu anaweza kutabasamu:
$object = [MyClass]::new()
$object.Smile($true)
Njia zinaweza kupakiwa; kwa kuongeza, darasa lina
class MyClass2 : MyClass
{
#тело нового класса, базовым для которого является MyClass
}
[MyClass2]::new().Smile($true)
Maelezo yetu ya kufanya kazi na vitu katika PowerShell sio kamili. Katika machapisho yafuatayo, tutajaribu kuimarisha kwa mifano ya vitendo: makala ya tano katika mfululizo itatolewa kwa masuala ya kuunganisha PowerShell na vipengele vya programu ya tatu. Sehemu za nyuma zinaweza kupatikana kwenye viungo hapa chini.
Chanzo: mapenzi.com