PowerShellin perusteet:

Windows PowerShell on komentosarjaympäristö, joka tukee Microsoft .NET Frameworkiin perustuvaa oliosuuntautunutta skriptausta. Sen ytimessä on PowerShell cmdlet, kevyt komento, joka suorittaa tietyn toiminnon ja palauttaa samalla .NET-objektin. PowerShellin avulla voit käyttää cmdlettejä erilaisten järjestelmien käyttämiseen ja lukuisten tehtävien suorittamiseen näissä järjestelmissä. Pelkät cmdletit eivät kuitenkaan aina riitä tiettyjen toimintojen suorittamiseen. Näitä toimia varten on usein luotava omia .NET-luokkiin perustuvia objekteja. Yksi .NET-objektityyppi, jonka voit rakentaa, on mukautettu objekti. Mukautetun objektin avulla voit määritellä kyseiselle objektille määritetyt tietotyypit ja toiminnot, joita se voi suorittaa. Kun ymmärrät, miten mukautettu objekti rakennetaan, sinulla on tehokas työkalu skriptien luomiseen, joilla voit laajentaa PowerShellin jo ennestään huomattavaa ulottuvuutta.

Huomaa, että .NET Framework ja oliopohjainen ohjelmointi ovat monimutkaisia aiheita, jotka ylittävät reilusti tämän artikkelin laajuuden. Jotta voisit täysin ymmärtää PowerShellin oliosuuntautuneen luonteen, voi auttaa, jos sinulla on ainakin perusymmärrys näistä käsitteistä. Lisätietoja .NET Frameworkista on MSDN-artikkelissa ”Overview of the .NET Framework”. Johdatus oliosuuntautuneeseen ohjelmointiin on MSDN-artikkelissa ”Oliosuuntautunut ohjelmointi (C# ja Visual Basic).”

Kustomoidun objektin luominen

Kustomoidun objektin luomiseksi PowerShellissä on ensin käytettävä New-Object-komentoa alkuperäisen objektin luomiseen. Tämän komennon avulla voit luoda .NET- tai COM-objekteja valikoimasta luokkia. Mukautettu objekti on erityinen .NET-objektityyppi, joka perustuu joko Object- tai PSObject-.NET-luokkaan. Alkuperäisen objektin luomisessa ei ole eroa näiden kahden välillä. PSObject-luokkaa pidetään kuitenkin yleensä parempana, koska Object-luokkaan perustuvaan objektiin voidaan lisätä ominaisuuksia, joten käytetään PSObject-luokkaa.

Luoaksesi PSObject-luokkaan perustuvan objektin sinun on käytettävä New-Object-komentoa, jossa on -TypeName-parametri, ja määritettävä parametrin arvoksi PSObject-luokka näin:

$system = New-Object -TypeName PSObject

Kun suoritat tämän komennon, komento luo PSObject-olion (PSCustomObject-olio) ja määrittelee sen muuttujaan $system. Useimmiten haluat määrittää objektin muuttujaan, jotta voit helposti työskennellä kyseisen objektin jäsenten kanssa. Jäsenet ovat komponentteja, jotka muodostavat objektin, kuten ominaisuudet, metodit, alias-ominaisuudet ja jäsenjoukot.

Kun työskentelet objektien kanssa PowerShellissä, kaksi todennäköisesti käyttämääsi jäsentyyppiä ovat ominaisuudet ja metodit. Ominaisuus kuvaa objektin tiettyä osaa. Esimerkiksi yksi FileInfo .NET -luokan jäsenistä on Length-ominaisuus, joka ilmoittaa tiedoston koon tavuina. Jos luot FileInfo-objektin kyseisen luokan perusteella, voit käyttää Length-ominaisuutta kyseiseen objektiin liittyvän tiedoston koon määrittämiseen. Metodi suorittaa objektiin liittyvän toiminnon. Esimerkiksi FileInfo-luokka sisältää myös Delete-metodin, jolla voit poistaa objektin edustaman tiedoston.

Objektin jäsenten helppo tunnistaminen helpottaa työskentelyä objektin kanssa. Voit saada luettelon objektin muodostavista jäsenistä Get-Member-komentokomennolla. Jos haluat esimerkiksi tarkastella $system-muuttujaan määritetyn uuden objektin jäseniä, voit putkella $system-muuttujan Get-Member-senttimerkkiin:

$system | Get-Member

Kuten kuvasta 1 näkyy, luomasi objekti perustuu System.Management.Automation.PSCustomObject-luokkaan, joka sisältää vain pienen määrän jäseniä, jotka kaikki ovat menetelmiä. Mutta juuri siksi sitä kutsutaan mukautetuksi objektiksi – voit muokata sitä lisäämällä omia jäseniäsi.

Kuva 1: Uuden objektin jäsenluettelo

Ennen kuin näytän, miten jäseniä lisätään, lisään vielä, että monien .NET-luokkien tapaan myös PSCustomObject-luokka sisältää useita erityyppisiä piilomerkittyjä jäseniä, kuten memberset ja codeproperty. Voit tarkastella näitä jäseniä lisäämällä -Force-parametrin, kun kutsut Get-Member-komentoa. Vaikka keskustelu piilotetuista jäsenistä ei kuulu tähän, voi olla hyödyllistä tutustua jossain vaiheessa PSCustomObject-luokan ja muiden .NET-luokkien käytettävissä oleviin piilotettuihin jäseniin, jotta voit hyödyntää PowerShell-objektejasi täysipainoisesti.

Ominaisuuksien lisääminen mukautettuun objektiin

Ominaisuuksien lisääminen mukautettuun objektiin

Mukautettu objekti on vain niin hyödyllinen kuin objektiin liittyvät jäsenet. Voit lisätä mukautettuun objektiin useita erityyppisiä jäseniä. Tässä esimerkissä lisäät jäsenet NoteProperty ja ScriptMethod. NoteProperty-jäsen muistuttaa tavallista ominaisuutta, ja ScriptMethod-jäsen muistuttaa tavallista metodia. Mukautettuun objektiin ei voi lisätä tavallista ominaisuutta tai metodia, minkä vuoksi käytetään NoteProperty- ja ScriptMethod-jäseniä. (Tietoja mukautetun objektin tuetuista jäsenistä on PowerShell TechNetin aiheessa ”Add-Member.”)

Aloitetaan lisäämällä pari NoteProperty-jäsentä $system-objektiin. Jäsenten lisäämiseen voit käyttää Add-Member-senttimerkkiä ominaisuuksien nimien ja arvojen määrittämiseen. Oletetaan esimerkiksi, että haluat lisätä Note-ominaisuuksia, jotka perustuvat PowerShellin sisäänrakennettujen Windows Management Instrumentation (WMI) -ominaisuuksien avulla haettuihin tietoihin. (WMI tarjoaa infrastruktuurin tietojen ja toimintojen hallintaan Windows-käyttöjärjestelmissä). WMI-objektimalli sisältää lukuisia luokkia, jotka tukevat monenlaisia hallintatoimintoja. Esimerkiksi Win32_OperatingSystem-luokka tarjoaa pääsyn sellaisiin tietoihin kuin tietokoneeseen asennetun käyttöjärjestelmän nimi ja käyttöjärjestelmään sovellettu viimeisin palvelupaketti.

WMI-objektin luomiseksi käytetään Get-WmiObject-komentoa ja määritetään haluttu luokka. Voit esimerkiksi luoda Win32_OperatingSystem WMI-olion ja määrittää sen $os-muuttujaan seuraavalla koodilla:

$os = Get-WmiObject Win32_OperatingSystem

Tässä tapauksessa haet järjestelmätietoja paikallisesta tietokoneesta, mutta WMI:n hienous on sen kyky käyttää ja hallita myös etä-Windows-tietokoneita.

Voit sitten käyttää $os-muuttujan avulla kyseisen objektin palauttamia tietoja. Objektin osoittaminen muuttujaan tällä tavoin lukitsee tiedot kyseisellä hetkellä. Jos käyttöjärjestelmään esimerkiksi asennetaan uusi huoltopaketti sen jälkeen, kun olet luonut $os-muuttujan, objektin CSDVersion-ominaisuus ei heijasta muutosta, koska objekti oli luotu alkuperäisten tietojen perusteella.

$os-muuttujan määrittelyn jälkeen sinun on määritettävä kaksi Add-Member-komentoa. Kumpikin komento ottaa neljä parametria:

  • -InputObject. -InputObject-parametrin avulla tunnistat objektin, joka vastaanottaa uudet nuottiominaisuudet. Tässä tapauksessa sinun on määritettävä $system-objekti.
  • -MemberType. -MemberType-parametri osoittaa luotavan jäsenen tyypin, joten sinun on määritettävä NoteProperty.
  • -Name. -Name-parametrilla määritetään uuden jäsenen nimi. Tässä esimerkissä nimetään ensimmäinen jäsen OperatingSystem ja toinen jäsen ServicePack.
  • -Value. Tämä parametri määrittää jäsenen arvon. Ensimmäiselle huomautusominaisuudelle on määritettävä $os.Caption, jotta se palauttaa käyttöjärjestelmän nimen. Toiselle huomautusominaisuudelle on määritettävä $os.CSDVersion palauttaaksesi käyttöjärjestelmään sovelletun viimeisimmän palvelupaketin.

Tältä näyttävät nämä kaksi Add-Member-komentoa:

Add-Member -InputObject $system -MemberType NoteProperty ` -Name OperatingSystem -Value $os.CaptionAdd-Member -InputObject $system -MemberType NoteProperty ` -Name ServicePack -Value $os.CSDVersion

Huomaa, että olen jakanut jokaisen Add-Member-komennon kahdelle riville. Kummankin ensimmäisen rivin loppuun lisäsin takaisin rastin (`), jotta PowerShell-prosessori tietää jatkaa seuraavalle riville koko komentoa varten.

Kun olet suorittanut Add-Member-komennot, voit kutsua $system-muuttujaa nähdäksesi sen sisällön:

$system

Kuvassa 2 on esimerkkituloksia.

Kuva 2: $system-muuttujan sisältö

Muuttujan $system avulla voit myös kutsua yksittäisiä jäseniä. Määritä yksinkertaisesti muuttujan nimi, jota seuraa piste ja sitten jäsenen nimi. Esimerkiksi seuraava komento palauttaa OperatingSystem-muistiinpano-ominaisuuden nykyisen arvon:

$system.OperatingSystem

Yksi etu mukautetun objektin luomisessa on se, että sen avulla voit luoda muistiinpano-ominaisuuksia, jotka perustuvat eri lähteistä tuleviin tietoihin, sekä muistiinpano-ominaisuuden, jonka arvo on tietty merkkijono. Katso esimerkiksi Listing 1:n koodia, joka lisää $system-objektiin kolme uutta huomautusominaisuutta.

$mem = Get-WmiObject Win32_PhysicalMemory$disk = Get-WmiObject Win32_DiskDriveAdd-Member -InputObject $system -MemberType NoteProperty ` -Name PhysicalMemory ` -Value (("{0:N2}" -f ($mem.Capacity/1GB)) + ' GB')Add-Member -InputObject $system -MemberType NoteProperty ` -Name DiskSize ` -Value (("{0:N2}" -f ($disk.Size/1GB)) + ' GB')Add-Member -InputObject $system -MemberType NoteProperty ` -Name Owner -Value "janetp"

Listing 1:n elementeistä useimmat näit edellisessä esimerkissä. Huomaa kuitenkin, että koodi luo Win32_PhysicalMemory-luokan instanssin, joka osoitetaan $mem-muuttujaan, ja Win32_DiskDrive-luokan instanssin, joka osoitetaan $disk-muuttujaan. Kaksi lisättyä muistiinpano-ominaisuutta käyttää näitä uusia WMI-objekteja tietolähteinä.

Ensimmäinen Add-Member-komento hakee tietoja $mem.Capacity-ominaisuudesta, joka antaa muistin kapasiteetin kohdejärjestelmässä. Tässä tapauksessa -Value-parametri on kuitenkin hieman monimutkaisempi kuin edellisessä esimerkissä. Ensin komennossa määritetään ”{0:N2}”, jota seuraa -f, joka on .NET-konstruktio tulostetun luvun muotoilua varten. Periaatteessa tämä määrittää, että luku palautetaan kahden desimaalin tarkkuudella. Muotoiluohjeita seuraa lyhyt lauseke ($mem.Capacity/1GB), joka jakaa Capacity-arvon 1GB:llä. Capacity-arvo ilmoittaa muistin koon tavuina. PowerShellin avulla tavut on helppo muuntaa gigatavuiksi yksinkertaisesti jakamalla ne 1GB:llä. Lopuksi komento merkitsee tulosteeseen merkkijonon ’ GB’ (välilyönti mukaan lukien) ja sulkee koko jutun sulkuihin.

Toinen Add-Member-komento noudattaa samaa logiikkaa palauttaakseen tietokoneen kiintolevyn koon. Se käyttää $disk.Size-ominaisuutta palauttaakseen koon tavuina ja muuntaa sen sitten gigatavuiksi.

Kolmas Add-Member-komento lisää huomautusominaisuuden nimeltä Owner ja antaa sille merkkijonoarvon janetp. Tässä tapauksessa ”omistaja” voi tarkoittaa mitä tahansa – pääkäyttäjää, viimeistä käyttäjää, ylläpitäjää tai mitä tahansa merkitystä haluat ominaisuudelle antaa. Lisäsin sen tähän vain osoittaakseni, että voit lisätä muistiinpano-ominaisuuden, jonka arvo on yksinkertainen merkkijono.

Kun olet lisännyt kolme jäsentä mukautettuun objektiin, voit jälleen kerran kutsua $system-muuttujaa. Se palauttaa kuvan 3 kaltaiset tulokset.

Kuva 3: Add-Member Cmdletillä lisätyt Note-ominaisuudet

Sinulla on nyt yksi objekti, joka sisältää kolmesta eri WMI-objektista johdettuja tietoja. Objekti sisältää myös Owner-ominaisuuden, joka perustuu merkkijonoarvoon. Voit kutsua tuota muistiinpano-ominaisuutta kuten mitä tahansa muuta jäsentä:

$system.Owner

Komento palauttaa odotetusti arvon janetp. Voit kuitenkin vaihtaa tuon arvon johonkin muuhun antamalla ominaisuudelle uuden arvon, esimerkiksi näin:

$system.Owner = "rogert"

Tässä tapauksessa Owner note -ominaisuudelle on annettu arvo rogert. Jos kutsut nyt kyseistä muistiinpano-ominaisuutta, se palauttaa uuden arvon.

Kuten monissa PowerShellissä suoritettavissa tehtävissä, myös mukautettuun objektiin voi lisätä jäsenen monella eri tavalla. PowerShell 3.0:ssa voit esimerkiksi luoda hash-taulukon ja välittää hashin New-Object-komentoon. Listauksessa 2 oleva koodi luo samat viisi muistiinpano-ominaisuutta, mutta käyttää hash-taulukkoa jäsenen nimien ja arvojen välittämiseen.

$info = @{ "OperatingSystem" = $os.Caption; "ServicePack" = $os.CSDVersion; "PhysicalMemory" = (("{0:N2}" -f ($mem.Capacity/1GB)) + ' GB'); "DiskSize" = (("{0:N2}" -f ($disk.Size/1GB)) + ' GB'); "Owner" = 'janetp'}$system = New-Object -TypeName PSObject -Property $info$system

Tässä koodissa luodaan ensin hash-taulukko, joka määrittelee viisi ominaisuus-/arvoparia, jotka vastaavat muistiinpano-ominaisuuksia. Kuten koodista käy ilmi, ominaisuus/arvoparit on erotettava toisistaan puolipisteillä. Viiden ominaisuuden/arvon parin joukko on myös suljettava sulkeisiin ja avattavan sulkeen eteen on lisättävä at-merkki (@). Lopuksi hash-taulukko on osoitettava $info-muuttujaan.

Hash-taulukon määrittelyn jälkeen koodi luo New-Object-komentokomennolla PSObject-luokkaan perustuvan objektin ja osoittaa sen $system-muuttujaan. Vain tällä kertaa komento sisältää -Property-parametrin, joka ottaa arvokseen $info-muuttujan.

Viimeiseksi koodi kutsuu $system-muuttujaa, joka palauttaa kuvan 4 mukaiset tulokset. Huomaa, missä järjestyksessä ominaisuudet on lisätty objektiin. Yksi ongelma hash-taulukon käyttämisessä huomautusominaisuuksien lisäämiseen on se, että niiden järjestystä ei voi hallita. Jotta voit hallita järjestystä, sinun on käytettävä Add-Member-senttimerkkiä kunkin jäsenen lisäämiseen.

Kuva 4: Hash-taulukon avulla luodut muistiinpano-ominaisuudet

Metodien lisääminen mukautettuun objektiin

Nyt kun olet nähnyt, miten helppoa ominaisuuksien lisääminen, niiden arvojen käyttäminen ja muuttaminen on, siirrymme menetelmiin. Näistä tulee hieman monimutkaisempia, koska metodien on tehtävä jotakin, ja sinun on määriteltävä tämä jotakin osana metodin arvoa.

Listauksen 3 koodi luo esimerkiksi metodin, joka hakee nykyisen päivämäärän ja kellonajan ja palauttaa ne sekä alkuperäisessä muodossaan että UTC-arvoina (Coordinated Universal Time, UTC).

$method ={ $a = Get-Date -Format F; "Local: " + $a; $b = Get-Date; "UTC: " + $b.ToUniversalTime().DateTime}Add-Member -InputObject $system -MemberType ScriptMethod ` -Name GetUTC -Value $method

Koodin pitämiseksi helppolukuisempana voit määrittää metodin arvon muuttujaan (esim. $method). Tämä arvo sisältää päivämäärän ja kellonajan palauttamiseen tarvittavat lausekkeet. Sinun on kuitenkin määriteltävä arvo komentosarjalohkoksi, jotta voit siirtää sen Add-Member-komentoon. Tätä varten suljet arvon sisällön sulkeisiin. Tämän jälkeen PowerShell määrittää arvon nykyisessä muodossaan muuttujaan ScriptBlock-objektina.

Listauksessa 3 metodin arvo sisältää kaksi lauseketta. Ensimmäinen lauseke palauttaa nykyisen päivämäärän ja kellonajan, ja toinen lauseke palauttaa UTC-version. Ensimmäinen lauseke aloitetaan hakemalla Get-Date-cmdletillä nykyinen päivämäärä ja kellonaika, jotka osoitetaan $a-muuttujaan. Huomaa, että kun kutsut Get-Date-senttimerkkiä, sinun on sisällytettävä -Format-parametri sekä arvo F. Tämä kehottaa PowerShelliä näyttämään aikaleiman täydellisessä päivämäärän ja kellonajan muodossa, kuten Monday, August 19, 2013 12:28:25 PM. Lisää sitten merkkijono ”Local: ” (välilyönti mukaan lukien) muuttujan arvoon palauttaaksesi tämänhetkisen päivämäärän ja kellonajan yhdessä kyseisen merkinnän kanssa.

Toisessa lausekkeessa aloitat jälleen Get-Date-cmdletillä palauttaaksesi tämänhetkisen päivämäärän ja kellonajan, jonka osoitat $b-muuttujaan. Sen jälkeen käytät muuttujan ToUniversalTime-metodia palauttaaksesi päivämäärän ja kellonajan UTC-arvona ja määrität sitten DateTime-ominaisuuden palauttaaksesi oikean formaatin.

Jos kutsuisit $method-muuttujaa tässä vaiheessa, se palauttaisi molemmat lausekkeet merkkijonoina, juuri sellaisina kuin ne oli kirjoitettu. Koska määrittelit muuttujan arvon komentosarjalohkona, komentoja ei käsitellä, kun ne osoitetaan $method-muuttujaan. Sen sijaan $method-muuttuja luodaan ScriptBlock-olioksi, minkä voit varmistaa käyttämällä GetType-metodia nähdäksesi muuttujan tyypin:

$method.GetType()

Käsikirjoituslohkon kanssa työskentelemiseksi sinun on lisättävä metodi $system-olion jäseneksi $method-muuttujan määrittelyn jälkeen. Tätä varten luot Add-Member-komennon, jossa tyyppinä on ScriptMethod, nimenä GetUTC ja arvona $method-muuttuja.

Listauksen 3 koodin suorittamisen jälkeen voit käyttää $system-muuttujaa kutsuaksesi GetUTC-metodia samalla tavalla kuin kutsuit ominaisuuksia:

$system.GetUTC()

Huomaa kuitenkin, että kutsuessasi komentosarjametodia sinun on lisättävä sulkeet, aivan kuten minkä tahansa muun metodin kohdalla, vaikka et välittäisikään argumentteja. Metodin pitäisi nyt palauttaa samanlaisia tuloksia kuin kuvassa 5, mutta päivämäärällä ja kellonajalla, jolloin kutsuit metodia.

Kuva 5: Esimerkkituloksia GetUTC()-metodista

Todellisessa elämässä haluaisit luultavasti luoda metodeja, joilla on enemmän tehoa. Esimerkiksi $system-olio voisi sisällyttää WMI:n hallintatehtäviä skriptimenetelmiinsä. Jos teet näin, sinun on testattava metodi täydellisesti varmistaaksesi, että komennot tekevät juuri sen, mitä niiden on tarkoitus tehdä. PowerShell ja WMI ovat molemmat tehokkaita työkaluja, joten niitä on käytettävä varovasti Windows-tietokoneiden hallinnassa.

Kustomoitujen objektien lisääminen arrayyn

Kustomoidut objektit eivät rajoitu vain itsenäisiin objekteihin, joita käytetään kerran ja heitetään syrjään. Voit lisätä näitä objekteja objektiryhmään ja käyttää objekteja sitten kyseisen ryhmän kautta. Oletetaan esimerkiksi, että haluat käsitellä tietoja, jotka haet useista tietokoneista. Näihin tietoihin voi sisältyä tietoja järjestelmissä käytettävissä olevasta muistista ja loogisista asemista. Haluat pystyä käsittelemään näitä tietoja mielekkäällä tavalla PowerShellissä. PowerShellin oliosuuntautuneen luonteen vuoksi näiden tietojen asettaminen objekteihin on usein yksinkertaisin tapa työskennellä näiden tietojen kanssa.

Katsotaanpa esimerkki siitä, miten voit tehdä tämän. Tämän keskustelun kannalta on yhdentekevää, millä lähestymistavalla tietoja eri tietokoneista kerätään. Voit esimerkiksi asettaa PowerShellissä foreach-silmukan, joka käyttää WMI:tä tietojen hakemiseen eri työasemilta. Käytetystä menetelmästä riippumatta oletetaan lyhyyden vuoksi, että olet kerännyt tiedot pilkulla erotettuun tekstitiedostoon, joka sisältää kuvassa 6 esitetyt tiedot.

Kuva 6: Kerätyt WMI-tiedot

Tekstitiedosto sisältää otsikkorivin ja rivin kunkin järjestelmän loogisia asemia varten. Esimerkiksi ensimmäisellä tietorivillä on tietoja tietokoneen ws01 loogisesta C-asemasta. Loogisen aseman kapasiteetti on 500 Gt, ja vapaata tilaa on 225 Gt. Järjestelmässä on myös 4 Gt muistia. Toinen rivi kertoo, että samassa tietokoneessa on myös D-looginen asema, jonka kapasiteetti on sama kuin C-aseman, mutta vapaata tilaa on 320 Gt.

Tavoitteena on muuttaa jokainen tietorivi omaksi mukautetuksi objektikseen ja lisätä nämä objektit sitten arrayyn. Tämän jälkeen voit tehdä toimenpiteitä joukon sisällä oleville objekteille johtamalla tiedot muihin PowerShell-komentoihin. Listauksessa 4 oleva koodi määrittelee tyhjän array-määrityksen, tuo tiedot tekstitiedostosta ja käyttää sitten foreach-silmukkaa objektien luomiseen ja lisäämiseen array-määritykseen.

$SystemInfo = @()$SourceData = Import-CSV C:\DataFiles\SourceData.txtforeach ($source in $SourceData){ $system = New-Object -TypeName PSObject $system | Add-Member -Type NoteProperty ` -Name Computer -Value $source.Computer $system | Add-Member -Type NoteProperty ` -Name DeviceID -Value $source.DeviceID $system | Add-Member -Type NoteProperty ` -Name DriveSize -Value ($source.DriveSize) $system | Add-Member -Type NoteProperty ` -Name UsedSpace ` -Value ($source.DriveSize - $Source.FreeSpace) $system | Add-Member -Type NoteProperty ` -Name FreeSpace -Value ($source.FreeSpace) $SystemInfo += $system}

Kuten näet, ensimmäinen vaihe on tyhjän array-määrityksen luominen (@()) ja sen osoittaminen $SystemInfo-muuttujaan. Lopulta lisäät mukautetut objektit tähän arrayyn.

Seuraavaksi tuot tiedot Import-CSV-cmdletillä $SourceData-muuttujaan. Tässä harjoituksessa tekstitiedoston nimi on SourceData.txt, ja se tallennetaan kansioon C:\DataFiles. Import-CSV-cmdlet hakee jokaisen rivin omana objektinaan ja tallentaa sen $SourceData-muuttujaan. Tässä vaiheessa voisit käyttää kyseistä muuttujaa tietojen käyttämiseen, mutta et pystyisi hallitsemaan objektiin sisältyviä jäseniä etkä myöskään lisäämään jäseniä.

Seuraavaksi luodaan siis foreach-silmukka, jonka avulla voit luoda mukautetun objektin jokaiselle tekstitiedoston riville. foreach-ehto ($source in $SourceData) määrittää, että jokainen $SourceDatan rivi osoitetaan $source-muuttujaan, kun koodi iteroi foreach-silmukan läpi. foreach-skriptilohkossa määritetty logiikka (suluissa) suoritetaan tällöin kerran kullekin riville, ja eri $source-objektia käytetään jokaisen iteraation aikana. (Lisätietoja foreach-silmukan luomisesta on PowerShell TechNetin aiheessa about_ForEach.)

Katsotaanpa foreach-skriptilohkoa tarkemmin. Ensimmäinen komento luo alkuobjektin ja tallentaa sen $system-muuttujaan, kuten aiemmissa esimerkeissä nähtiin. Seuraavaksi $system-muuttuja ohjataan Add-Member-komentoon, jolla luodaan ensimmäinen muistiinpano-ominaisuus. Tämä on hieman erilainen muoto kuin aiemmin käytetty. Sen sijaan, että Add-Member-komennossa käytettäisiin -InputObject-parametria, komentoon syötetään yksinkertaisesti $system-muuttuja. Näin saavutetaan samat tulokset kuin aiemmissa Add-Member-komentojen esimerkeissä. Olen käyttänyt tätä lähestymistapaa tässä vain havainnollistaakseni vielä yhden tavan, jolla PowerShellin avulla voit lisätä jäseniä.

Add-Member-komennon arvona käytät $source-muuttujaa kutsuaksesi Computer-ominaisuutta, joka vastaa Computer-kenttää lähdetiedoissa. Toinen Add-Member-komento toimii samalla tavalla, paitsi että se hakee tiedot DeviceID-ominaisuudesta. Huomaa, että Memory-ominaisuutta ei oteta mukaan. Kun luot mukautettua objektia, voit jättää tiettyjä ominaisuuksia pois tai asettaa ne eri järjestykseen.

Kolmas Add-Member-komento toimii samalla tavalla kuin kaksi ensimmäistä, paitsi että se käyttää DriveSize-ominaisuutta. Koska haluat ehkä työskennellä tämän tiedon kanssa numeerisena arvona merkkijonon sijaan, komento muuntaa tiedon nimenomaisesti numeroksi. Tämä saavutetaan merkitsemällä ominaisuuden nimen eteen, että haluatint-tietotyypin, ja sulkemalla sitten koko ominaisuuden lauseke sulkuihin.

Neljäs Add-Member-komento tekee jotain hieman erilaista. Se luo laskennallisen jäsenen, joka vähentää FreeSpace-arvon DriveSize-arvosta käytetyn tilan määrän määrittämiseksi. Jälleen ominaisuuden nimeä edeltää ja koko lauseke suljetaan sulkuihin. Mahdollisuus luoda laskennallinen ominaisuus on yksi tärkeimmistä syistä, miksi saatat haluta luoda mukautettuja objekteja.

Viimeinen Add-Member-komento toimii aivan kuten kolmaskin, paitsi että se hakee tietoja FreeSpace-ominaisuudesta.

Edellinen komento foreach-skriptilohkossa lisää tämänhetkisen $system-olion $SystemInfo-määritykseen. Huomaa, että +=-operaattoria käytetään varmistamaan, että uusi $system-objekti lisätään jokaisella silmukan iteraatiokerralla ilman, että mitään ylikirjoitetaan.

Listauksen 4 koodin suorittamisen jälkeen voit kutsua muuttujaa nähdäksesi sen sisällön. Kuvassa 7 näkyy osittainen luettelo tiedoista, jotka on nyt tallennettu $SystemInfo-matriisiin.

Kuva 7: $SystemInfo-matriisiin tallennetut tiedot

Kuvassa näkyvät erityisesti tiedot matriisin seitsemästä ensimmäisestä objektista, jotka vastaavat alkuperäisen tekstitiedoston seitsemää ensimmäistä tietoriviä. Kukin ryhmittely edustaa yhtä $SystemInfo-määritykseen lisättyä objektia. Voit tarkistaa, että olet luonut objektimassan, käyttämällä GetType-metodia muuttujan tyypin hakemiseen:

$SystemInfo.GetType()

Jos tämä komento palauttaa BaseType-arvoksi System.Array, $SystemInfo-muuttuja on todellakin objektimassa, joka pystyy säilyttämään mukautettuja objekteja. Voit sitten käyttää kyseistä muuttujaa tietojen käsittelyyn parhaaksi katsomallasi tavalla. Voit esimerkiksi johtaa muuttujan Sort-Object-komentoon lajitellaksesi tiedot alenevaan järjestykseen FreeSpace-arvojen perusteella:

$SystemInfo | Sort FreeSpace -Descending

Tässä tapauksessa komento käyttää Sort-alianimea Sort-Object-komentoon viittaamiseen ja sisältää FreeSpace-ominaisuuden ja -Descending-parametrin. Kuten kuvassa 8 näkyy, objektit luetellaan nyt FreeSpace-arvojen mukaan siten, että suurin määrä vapaata tilaa luetellaan ensimmäisenä. Jälleen kerran tämä on vain osittainen luettelo.

Kuva 8: Tiedot lajiteltu vapaan tilan määrän mukaan

Voit myös lajitella tiedot useiden sarakkeiden perusteella. Voit esimerkiksi lajitella tiedot ensin Tietokone-ominaisuuden ja sitten Vapaa tila -ominaisuuden mukaan alenevassa järjestyksessä:

$SystemInfo | Sort Computer, FreeSpace -Descending

Kuten arvata saattaa, tulokset ovat nyt paljon erilaiset, kuten kuvasta 9 näkyy.

Kuva 9: Tietokoneen nimen ja vapaan tilan määrän mukaan lajitellut tiedot laskevassa järjestyksessä

Yksi seurauksista, joita sarakkeiden lajittelusta tällä tavalla aiheutuu, on se, että sekä Tietokone-arvot että Vapaan tilan arvot lajitellaan laskevaan järjestykseen. Sort-Object-cmdletillä ei voi helposti lajitella yhtä saraketta nousevassa järjestyksessä ja toista saraketta laskevassa järjestyksessä. Jos määrität -Descending-parametrin, kaikki tiedot lajitellaan tässä järjestyksessä. Voit kuitenkin kiertää tämän rajoituksen luomalla kullekin ominaisuudelle lausekkeita, jotka määrittävät, miten kyseiset arvot lajitellaan. Esimerkiksi seuraava komento lajittelee ensin Computer-ominaisuuden mukaan nousevassa järjestyksessä ja sitten FreeSpace-ominaisuuden mukaan laskevassa järjestyksessä:

$SystemInfo | Sort ` @{Expression="Computer"; Descending=$false}, @{Expression="FreeSpace"; Descending=$true}

Ensimmäinen Sort-Object-lauseke asettaa Expression-ominaisuuden arvoksi Computer ja Descending-ominaisuuden arvoksi $false. Toinen lauseke asettaa Expression-ominaisuuden arvoksi FreeSpace ja Descending-ominaisuuden arvoksi $true. ($true- ja $false-muuttujat ovat sisäänrakennettuja järjestelmämuuttujia, jotka antavat oikean ja väärän Boolen arvon 1 ja 0.) Tämän jälkeen jokainen lauseke on suljettava hakasulkeisiin ja jokaisen aukeavan hakasulkeen eteen on laitettava at-merkki (@). Nyt tiedot lajitellaan haluttuun järjestykseen, kuten kuvassa 10.

Kuva 10: Tietokoneen nimen mukaan lajitellut tiedot nousevassa järjestyksessä ja vapaan tilan määrän mukaan laskevassa järjestyksessä

Tämä saattaa tuntua lajittelun suhteen liioittelulta, mutta se osoittaa, miten joustavaa on työskennellä objektien kanssa joukossa. Etkä todellakaan ole rajoittunut Sort-Object-cmdletiin. Esimerkiksi seuraava komento putkittaa $SystemInfo-muuttujan Where-Object-cmdletille:

$SystemInfo | Where DriveSize -gt 250 | Sort FreeSpace -Descending

Tässä tapauksessa komento käyttää Where-aliasia Where-Object-cmdletiin viittaamiseen. Lisäksi se määrittää, että DriveSize-arvon on oltava suurempi kuin 250, jotta se sisällytetään tuloksiin. (PowerShellissä käytetään -gt-operaattoria Suurempi kuin.) Nämä kriteerit täyttävät tulokset ohjataan Sort-Object-komentoon, jotta tiedot näytetään oikeassa järjestyksessä.

Voit myös ohjata lajitellut tiedot Select-Object-komentoon, kuten tässä:

$SystemInfo | Where DriveSize -gt 250 | Sort FreeSpace -Descending | Select -First 5

Tässä komennossa käytetään Select-Object-komentoa (johon viitataan Select-aliasilla) palauttamaan vain tulosjoukon viisi ensimmäistä riviä. Kuten näet, kun lisäät mukautettuja objekteja $SystemInfo-joukkoon, sinulla on monenlaisia vaihtoehtoja näiden objektien kanssa työskentelyyn.

Making the Most of Your Custom Objects

Käytössä olevien mukautettujen objektien luominen PowerShellissä on suurimmaksi osaksi melko suoraviivainen prosessi. Jos siihen liittyy monimutkaisuutta, se johtuu yleensä arvolausekkeista, joita määrittelet muistiinpano-ominaisuuksille tai komentosarjametodeille. Näissä esimerkeissä käytetyt lausekkeet ovat suhteellisen yksinkertaisia verrattuna siihen, millaisia lausekkeita PowerShellissä voi luoda. Siitä huolimatta tässä näkemäsi pitäisi antaa sinulle perusta, jota tarvitset mukautettujen objektien luomiseen. Kun niitä käytetään tehokkaasti, ne voivat olla tehokas osa PowerShell-skriptejäsi, luotpa sitten yksittäisiä objekteja, lisäät niitä joukkoon tai käytät niitä jollakin muulla tavalla. Voit esimerkiksi luoda mukautettuja objekteja PowerShell-profiiliisi, jotta ne ovat käytettävissä aina, kun aloitat uuden istunnon. Se, miten käytät mukautettuja objekteja komentosarjoissasi, on sinun päätettävissäsi. Tiedä vain, että mukautettu objekti on tehokas ja joustava työkalu, joka voi palvella monia komentosarjakäsikirjoitustarpeitasi.

Lisätietoja mukautettujen objektien luomisesta Windows PowerShellissä on Bill Stewartin kirjassa ”Creating Custom Objects in Windows PowerShell.”

Vastaa

Sähköpostiosoitettasi ei julkaista.