Korábban már megállapítottuk, hogy a PowerShellben minden objektum, és mint ilyenek, lekérdezhető tulajdonságok és meghívható metódusok jól meghatározott készletével rendelkeznek. Az egyes objektumok képességeinek felderítésére a Get-Member cmdlet szolgál. Korábban, a nem létező parancsok kipróbálásakor már találkozhattunk az alábbi példával:
PS C:\> 1
1
Mi is történt itt? A beírt szám ebben az esetben nyilvánvalóan nem parancs, hanem mi is lehet? Természetesen egy integer típusú objektum. Ha ezt az objektumot odaadjuk a Get-Member cmdletnek, az megmondja, hogy az egy integer (ami egy érték-típus) és hogy milyen tulajdonságokkal és képességekkel rendelkezik (természetesen bármilyen más szám is jóJ):
PS C:\> 1 | Get-Member
TypeName: System.Int32
Name MemberType Definition
---- ---------- ----------
CompareTo Method int CompareTo(System.Object value), int CompareTo(...
Equals Method bool Equals(System.Object obj), bool Equals(int ob...
GetHashCode Method int GetHashCode()
GetType Method type GetType()
GetTypeCode Method System.TypeCode GetTypeCode(), System.TypeCode ICo...
ToBoolean Method bool IConvertible.ToBoolean(System.IFormatProvider...
ToByte Method byte IConvertible.ToByte(System.IFormatProvider pr...
ToChar Method char IConvertible.ToChar(System.IFormatProvider pr...
ToDateTime Method datetime IConvertible.ToDateTime(System.IFormatPro...
ToDecimal Method decimal IConvertible.ToDecimal(System.IFormatProvi...
ToDouble Method double IConvertible.ToDouble(System.IFormatProvide...
ToInt16 Method int16 IConvertible.ToInt16(System.IFormatProvider ...
ToInt32 Method int IConvertible.ToInt32(System.IFormatProvider pr...
ToInt64 Method long IConvertible.ToInt64(System.IFormatProvider p...
ToSByte Method sbyte IConvertible.ToSByte(System.IFormatProvider ...
ToSingle Method float IConvertible.ToSingle(System.IFormatProvider...
ToString Method string ToString(), string ToString(string format),...
ToType Method System.Object IConvertible.ToType(type conversionT...
ToUInt16 Method uint16 IConvertible.ToUInt16(System.IFormatProvide...
ToUInt32 Method uint32 IConvertible.ToUInt32(System.IFormatProvide...
ToUInt64 Method uint64 IConvertible.ToUInt64(System.IFormatProvide...
A megjelenő listából látható, hogy ez az objektum System.Int32 típusú, és ugyan nem rendelkezik tulajdonságokkal, de van néhány meghívható metódusa: vissza tudja adni a típusát, át tudja alakítani magát karakterlánccá, összehasonlítható egy másik számmal, stb. A listában szerepelnek az adott metódus különféle paraméterezéssel meghívható (overloaded) változatai, és az egyes változatok által visszaadott érték típusa is.
Próbáljuk ki, mit tud egy karakterlánc!
[24] PS C:\> "Helló" | Get-Member
TypeName: System.String
Name MemberType Definition
---- ---------- ----------
Clone Method System.Object Clone()
CompareTo Method int CompareTo(System.Object val...
Contains Method bool Contains(string value)
…
PadLeft Method string PadLeft(int totalWidth),...
PadRight Method string PadRight(int totalWidth)...
Remove Method string Remove(int startIndex, i...
Replace Method string Replace(char oldChar, ch...
Split Method string[] Split(Params char[] se...
…
ToUpper Method string ToUpper(), string ToUppe...
…
Chars ParameterizedProperty char Chars(int index) {get;}
Length Property System.Int32 Length {get;}
Ez a lista már jóval bővebb, csak győzzünk válogatni. Akinek esetleg feltűnt korábban, hogy a PowerShellben egyetlen karakterlánc-feldolgozásra képes utasítás sincsen, most megkaphatja a magyarázatot: nincs szükség ilyesmire, mert a .NET Framework String osztálya mindent tud, ami ebben a témában felmerülhet.
A következőkben kipróbálunk néhány egyszerű karakterlánc-műveletet.
Bővítsük a beírt karakterláncot (vagyis a „Helló” karakterláncra hívjuk
meg a String osztály Insert metódusát, első paraméter a pozíció, második a beszúrandó
karakterlánc):
PS C:\> "Helló".Insert(5, " világ!")
Helló világ!
Cseréljünk ki benne egy betűt egy másikra (a karaktereket idézőjelek vagy aposztrófok között adhatjuk meg):
PS C:\> "Helló".Replace('e', 'a')
Halló
Alakítsuk át a karakterláncot csupa nagybetűssé:
PS C:\> "Helló".ToUpper()
HELLÓ
Számoljuk meg a karakterlánc betűit (nem metódus, hanem tulajdonság, így nem kell zárójel):
PS C:\> "Helló".Length
5
A Get-Member lehet a segítségünkre akkor is, ha egy adott cmdlet kimenetét szeretnénk közelebbről megvizsgálni, megmondja milyen típusú objektumokból áll a kimenet, és azoknak milyen tulajdonságai, metódusai vannak. Ha a kimenet nem egyetlen objektum, hanem gyűjtemény (legtöbbször ez a helyzet), akkor abban akár több különböző típusú objektum is előfordulhat, de a Get-Member ebben az esetben sem jön zavarba; a gyűjteményben lévő valamennyi típust kilistázza, típusonként csak egy-egy eredményt jelenít meg. A mappákra kiadott Get-ChildItem például szokásosan FileInfo és DirectoryInfo objektumokat is tartalmaz, ekkor a Get-Member kimenetében mindkét típus megtalálható.
PS C:\> Get-ChildItem | Get-Member
TypeName: System.IO.DirectoryInfo
Name MemberType Definition
---- ---------- ----------
Create Method System.Void Create(), System.V...
CreateObjRef Method System.Runtime.Remoting.ObjRef...
...
TypeName: System.IO.FileInfo
Name MemberType Definition
---- ---------- ----------
AppendText Method System.IO.StreamWriter AppendT...
CopyTo Method System.IO.FileInfo CopyTo(Stri...
...
A .NET objektumokkal, metódusokkal, tulajdonságokkal és adattípusokkal kapcsolatos információt a .NET Framework SDK dokumentációjából kaphatunk, itt igen részletes leírást találhatunk valamennyi osztály valamennyi elemével kapcsolatban. Egyszerűbb esetben azonban nem érdemes a rettenetes mennyiségű információ közötti keresgéléssel sokkolni magunkat, némi segítség közvetlenül a PowerShellből is hozzáférhető az alábbi módszer használatával (egy karakterlánc objektumra meghívható Replace() metódus definícióját kérjük le, a kimenetben látható a visszaadott érték, és a lehetséges paraméterlisták):
[28] PS C:\> ("Helló" | Get-Member replace).definition
string Replace(char oldChar, char newChar), string Replace(string oldValue, st
ring newValue)
Ugyanez (legalábbis az eleje) persze megjelenik egy „közönséges” Get-Member hívás kimenetében is („Definition” oszlop), de ott a szűkös hely miatt a hosszabb szövegek vége általában már nem látható.
A PowerShell 2.0 után ezen metódusok definícióját sokkal egyszerűbben is elérhetjük, elég csak a metódust „meghívni” zárójelek nélkül:
PS C:\> "Helló".Replace
OverloadDefinitions
-------------------
string Replace(char oldChar, char newChar)
string Replace(string oldValue, string newValue)