A parancsok szöveges kimenete a PowerShell értelmező ablakban csak egy módja annak, hogy az információkat emberi észlelésnek megfelelő formában jelenítsük meg. Valójában szerdán
Tartalomjegyzék:
Objektumok a PowerShellben
Emlékezzünk vissza, hogy az objektum adatmezők (tulajdonságok, események stb.) és ezek feldolgozására szolgáló módszerek (metódusok) gyűjteménye. Felépítését típus határozza meg, amely általában az egységes .NET Core platformban használt osztályokon alapul. COM, CIM (WMI) és ADSI objektumokkal is lehet dolgozni. Tulajdonságokra és metódusokra van szükség az adatokon végzett különféle műveletek végrehajtásához, emellett a PowerShellben az objektumok argumentumként adhatók át függvényeknek és parancsmagoknak, értékeik hozzárendelhetők a változókhoz, és van még
Az objektumok szerkezetének megtekintése
Például futtassuk a Get-Process parancsmagot, amely lehetővé teszi, hogy információkat szerezzen a rendszerben futó folyamatokról:
Néhány formázott szöveges adatot jelenít meg, amelyek nem adnak fogalmat a visszaadott objektumok tulajdonságairól és metódusairól. A kimenet finomhangolásához meg kell tanulnunk megvizsgálni az objektumok szerkezetét, és a Get-Member parancsmag ebben segít:
Get-Process | Get-Member
Itt már látjuk a típust és a szerkezetet, és további paraméterek segítségével például csak a bemenetben szereplő objektum tulajdonságait tudjuk megjeleníteni:
Get-Process | Get-Member -MemberType Property
Ezekre az ismeretekre szükség lesz az adminisztrációs problémák interaktív megoldásához, vagy saját szkriptek írásához: például ahhoz, hogy információkat szerezzen a felfüggesztett folyamatokról a Responding tulajdonság segítségével.
Objektumok szűrése
A PowerShell lehetővé teszi bizonyos feltételeknek megfelelő objektumok áthaladását egy folyamaton:
Where-Object { блок сценария }
A zárójelben lévő szkriptblokk végrehajtásának logikai értéknek kell lennie. Ha igaz ($true), akkor a Where-Object parancsmagba bevitt objektum a folyamat mentén kerül átadásra, ellenkező esetben ($false) törlődik. Például jelenítsük meg a leállított Windows Server szolgáltatások listáját, pl. azok, amelyek Állapot tulajdonsága „Leállítva”:
Get-Service | Where-Object {$_.Status -eq "Stopped"}
Itt is egy szöveges ábrázolást látunk, de ha meg akarjuk érteni a csővezetéken áthaladó objektumok típusát és belső szerkezetét, akkor ez nem nehéz:
Get-Service | Where-Object {$_.Status -eq "Stopped"} | Get-Member
Tárgyak rendezése
Az objektumok csővezetékes feldolgozása során gyakran szükség van azok rendezésére. A Sort-Object parancsmag átadja a tulajdonságok (rendezési kulcsok) nevét, és értékeik szerint rendezett objektumokat ad vissza. A futó folyamatok kimenetét könnyű rendezni a CPU eltöltött ideje (cpu tulajdonság) szerint:
Get-Process | Sort-Object –Property cpu
A -Property paraméter elhagyható a Sort-Object parancsmag meghívásakor; alapértelmezés szerint ez használatos. Fordított rendezéshez használja a -Descending paramétert:
Get-Process | Sort-Object cpu -Descending
Objektumok és részeik kiválasztása
A Select-Object parancsmag lehetővé teszi egy adott számú objektum kiválasztását a folyamat elején vagy végén a -First vagy -Last paraméterek használatával. Segítségével egyedi objektumokat vagy bizonyos tulajdonságokat választhat ki, és ezek alapján új objektumokat is létrehozhat. Nézzük meg, hogyan működik a parancsmag egyszerű példák segítségével.
A következő parancs információkat jelenít meg a 10 folyamatról, amelyek a maximális mennyiségű RAM-ot fogyasztják (WS tulajdonság):
Get-Process | Sort-Object WS -Descending | Select-Object -First 10
A folyamaton áthaladó objektumok csak bizonyos tulajdonságait választhatja ki, és ezek alapján hozhat létre újakat:
Get-Process | Select-Object ProcessName, Id -First 1
A folyamat eredményeként egy új objektumot kapunk, melynek szerkezete eltér a Get-Process cmdlet által visszaadott struktúrától. Ellenőrizzük ezt a Get-Member segítségével:
Get-Process | Select-Object ProcessName, Id -First 1 | Get-Member
Vegye figyelembe, hogy a Select-Object egyetlen objektumot ad vissza (-First 1), amely csak kettővel rendelkezik az általunk megadott mezők közül: az értékeket a Get-Process parancsmag által a folyamatba átadott első objektumról másolták át. Az objektumok PowerShell-szkriptekben való létrehozásának egyik módja a Select-Object használatán alapul:
$obj = Get-Process | Select-Object ProcessName, Id -First 1
$obj.GetType()
A Select-Object használatával kiszámított tulajdonságokat adhat hozzá azokhoz az objektumokhoz, amelyeket így kell ábrázolni
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}
Nézzük meg a szállítószalagon áthaladó tárgyak szerkezetét:
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member
ForEach-Object, Group-Object és Measure-Object
Vannak más parancsmagok is az objektumokkal való munkavégzéshez. Példaként beszéljünk a három leghasznosabbról:
ForEach-Object lehetővé teszi a PowerShell kód futtatását a folyamatban lévő minden objektumhoz:
ForEach-Object { блок сценария }
Csoport-objektum az objektumokat tulajdonságérték szerint csoportosítja:
Group-Object PropertyName
Ha a -NoElement paraméterrel futtatod, akkor megtudhatod, hány elem van a csoportokban.
Mérték-objektum különböző összefoglaló paramétereket összesít a folyamatban lévő objektummezőértékek szerint (kiszámolja az összeget, és megtalálja a minimális, maximális vagy átlagos értéket is):
Measure-Object -Property PropertyName -Minimum -Maximum -Average -Sum
A tárgyalt parancsmagokat általában interaktívan használják, és gyakran szkriptekben hozzák létre.
.NET és COM objektumok létrehozása (New-Object)
Számos .NET Core és COM interfésszel rendelkező szoftverösszetevő hasznos a rendszergazdák számára. A System.Diagnostics.EventLog osztály használatával a rendszernaplókat közvetlenül a Windows PowerShellből kezelheti. Nézzünk egy példát az osztály példányának létrehozására a New-Object parancsmag használatával a -TypeName paraméterrel:
New-Object -TypeName System.Diagnostics.EventLog
Mivel nem adtunk meg konkrét eseménynaplót, az osztály eredményül kapott példánya nem tartalmaz adatokat. Ennek megváltoztatásához meg kell hívni egy speciális konstruktor metódust annak létrehozása során az -ArgumentList paraméter segítségével. Ha hozzá akarunk férni az alkalmazásnaplóhoz, az "Application" karakterláncot kell átadnunk argumentumként a konstruktornak:
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog
Felhívjuk figyelmét, hogy a parancs kimenetét a $AppLog változóba mentettük. Bár a folyamatokat általában interaktív módban használják, a szkriptek írásához gyakran szükség van egy objektumra való hivatkozás fenntartására. Ezenkívül az alapvető .NET Core osztályok a System névtérben találhatók: a PowerShell alapértelmezés szerint meghatározott típusokat keres benne, így a Diagnostics.EventLog írása a System.Diagnostics.EventLog helyett teljesen helyes.
A naplóval való munkavégzéshez használhatja a megfelelő módszereket:
$AppLog | Get-Member -MemberType Method
Tegyük fel, hogy a Clear() metódus törli, ha vannak hozzáférési jogok:
$AppLog.Clear()
A New-Object parancsmag COM-összetevőkkel is működik. Elég sok van belőlük – a Windows script szerverrel szállított könyvtáraktól az ActiveX alkalmazásokig, például az Internet Explorerig. COM objektum létrehozásához be kell állítania a -ComObject paramétert a kívánt osztály programozott ProgId-jével:
New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject
Ha tetszőleges szerkezetű objektumokat szeretne létrehozni, a New-Object használata túl archaikusnak és nehézkesnek tűnik; ez a parancsmag a PowerShell-en kívüli szoftverkomponensekkel való együttműködésre szolgál. A következő cikkekben ezt a kérdést részletesebben tárgyaljuk. A .NET és COM objektumok mellett a CIM (WMI) és ADSI objektumokat is megvizsgáljuk.
Statikus módszerek hívása
Egyes .NET Core osztályok, köztük a System.Environment és a System.Math nem példányosíthatók. Ők
[System.Environment] | Get-Member
Ha csak statikus tagokat szeretne megtekinteni, hívja a Get-Membert a -Static paraméterrel (figyelje meg az objektum típusát):
[System.Environment] | Get-Member -Static
A statikus tulajdonságok és módszerek eléréséhez használjon két egymást követő kettőspontot a literál utáni pont helyett:
[System.Environment]::OSVersion
Vagy
$test=[System.Math]::Sqrt(25)
$test
$test.GetType()
Írja be a PSCustomObject parancsot
A PowerShellben elérhető számos adattípus közül érdemes megemlíteni a PSCustomObject-et, amely tetszőleges szerkezetű objektumok tárolására szolgál. Egy ilyen objektum létrehozása a New-Object parancsmag használatával klasszikus, de nehézkes és elavult módszer:
$object = New-Object –TypeName PSCustomObject -Property @{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'}
Nézzük az objektum szerkezetét:
$object | Get-Member
A PowerShell 3.0-tól kezdve egy másik szintaxis is elérhető:
$object = [PSCustomObject]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
Az adatokhoz az alábbi módon férhet hozzá:
$object.Name
$object.'Name'
$value = 'Name'
$object.$value
Íme egy példa egy meglévő hashtable objektummá konvertálására:
$hash = @{'Name'='Ivan Danko'; 'City'='Moscow'; 'Country'='Russia'}
$hash.GetType()
$object = [pscustomobject]$hash
$object.GetType()
Az ilyen típusú objektumok egyik hátránya, hogy tulajdonságaik sorrendje változhat. Ennek elkerülése érdekében az [ordered] attribútumot kell használnia:
$object = [PSCustomObject][ordered]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
Vannak más lehetőségek is az objektum létrehozására: fentebb a cmdlet használatát néztük meg
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member
Az Add-Member parancsmag segítségével nemcsak tulajdonságokat, hanem metódusokat is hozzáadhat egy korábban létrehozott $objektumhoz a "-MemberType ScriptMethod" konstrukció segítségével:
$ScriptBlock = {
# код
}
$object | Add-Member -Name "MyMethod" -MemberType ScriptMethod -Value $ScriptBlock
$object | Get-Member
Kérjük, vegye figyelembe, hogy az új metódus kódjának tárolására a ScriptBlock típusú $ScriptBlock változót használtuk.
A tulajdonságok eltávolításához használja a megfelelő módszert:
$object.psobject.properties.remove('Name')
Saját osztályok létrehozása
A PowerShell 5.0 bevezette a definiálás lehetőségét
class MyClass
{
# тело класса
}
Ez egy igazi .NET Core típus, amelynek törzse leírja tulajdonságait, metódusait és egyéb elemeit. Nézzünk egy példát a legegyszerűbb osztály meghatározására:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
}
Objektum (osztálypéldány) létrehozásához használja a parancsmagot
$object = New-Object -TypeName MyClass
vagy
$object = [MyClass]::new()
Elemezzük az objektum szerkezetét:
$object | Get-Member
Ne feledkezzünk meg a hatókörről: nem hivatkozhatunk egy típusnévre karakterláncként, és nem használhatunk típusliterált azon a szkripten vagy modulon kívül, amelyben az osztály definiálva van. Ebben az esetben a függvények olyan osztálypéldányokat (objektumokat) adhatnak vissza, amelyek a modulon vagy a parancsfájlon kívül lesznek elérhetők.
Az objektum létrehozása után töltse ki a tulajdonságait:
$object.Name = 'Ivan Danko'
$object.City = 'Moscow'
$object.Country = 'Russia'
$object
Vegye figyelembe, hogy az osztályleírás nemcsak a tulajdonságtípusokat, hanem azok alapértelmezett értékeit is megadja:
class Example
{
[string]$Name = 'John Doe'
}
Az osztálymetódus leírása hasonlít egy függvény leírására, de a függvényszó használata nélkül. A függvényekhez hasonlóan a paramétereket szükség esetén adjuk át a metódusoknak:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
#описание метода
Smile([bool]$param1)
{
If($param1) {
Write-Host ':)'
}
}
}
Most már osztályunk képviselője tudja, hogyan kell mosolyogni:
$object = [MyClass]::new()
$object.Smile($true)
A módszerek túlterhelhetők, ráadásul egy osztálynak van
class MyClass2 : MyClass
{
#тело нового класса, базовым для которого является MyClass
}
[MyClass2]::new().Smile($true)
A PowerShell objektumokkal való munkavégzéséről szóló leírásunk aligha kimerítő. A következő kiadványokban gyakorlati példákkal igyekszünk elmélyíteni: a sorozat ötödik cikke a PowerShell harmadik féltől származó szoftverkomponensekkel való integrálásának kérdéseivel foglalkozik. A korábbi részek az alábbi linkeken érhetők el.
Forrás: will.com