Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A PowerShell a PSObject objektumával két módon terjeszti ki az objektumtípusokat. Először is a PSObject objektum lehetővé teszi az adott objektumtípusok különböző nézeteinek megjelenítését. Ezt úgy nevezzük, hogy egy objektum adaptált nézetét jeleníti meg. Másodszor, a PSObject objektum lehetővé teszi tagok hozzáadását a meglévő objektumhoz. A psObject objektum az alapobjektumnak nevezett meglévő objektum körbefuttatásával egy kiterjesztett típusrendszert (ETS) biztosít, amellyel a szkript- és parancsmagfejlesztők a .NET-objektumokat manipulálhatják a rendszerhéjon belül.
Parancsmag- és szkriptfejlesztési problémák
Az ETS két alapvető problémát old meg:
Először is egyes .NET-objektumok nem rendelkeznek a parancsmagok közötti adatként való működéshez szükséges alapértelmezett viselkedéssel.
- Egyes .NET-objektumok "meta" objektumok (például WMI-objektumok, ADO-objektumok és XML-objektumok), amelyek tagjai az általuk tárolt adatokat írják le. A szkriptelési környezetben azonban a tartalmazott adatok a legérdekesebbek, nem pedig a benne foglalt adatok leírása. Az ETS azzal oldja meg ezt a problémát, hogy bemutatja az adapterek fogalmát, amelyek a mögöttes .NET-objektumot a várt alapértelmezett szemantikához igazítják.
- Egyes .NET-objektumtagok neve inkonzisztens, nem megfelelő számú nyilvános tagot biztosít, vagy nem biztosít elegendő képességet. Az ETS úgy oldja meg ezt a problémát, hogy bevezeti a .NET-objektum további tagokkal való kiterjesztésének lehetőségét.
Másodszor, a PowerShell-szkriptnyelv típus nélküli abban az esetben, ha egy változót nem kell egy adott típusú deklarálni. Vagyis a szkriptfejlesztő által létrehozott változók természete típus nélküli. A PowerShell-rendszer azonban "típusalapú", mivel attól függ, hogy rendelkezik-e típusnévvel az alapműveletekhez, például az eredmények kimenetéhez vagy a rendezéshez.
Ezért a szkriptfejlesztőknek meg kell tudniuk adni az egyik változójuk típusát, és saját dinamikusan beírt "objektumokat" kell létrehozniuk, amelyek tulajdonságokat és metódusokat tartalmaznak, és részt vehetnek a típusalapú rendszerben. Az ETS úgy oldja meg ezt a problémát, hogy egy gyakori objektumot biztosít a szkriptnyelvhez, amely képes dinamikusan állapotba helyezni a típust, és dinamikus tagokat hozzáadni.
Az ETS alapvetően úgy oldja meg a korábban említett problémát, hogy megadja a PSObject objektumot, amely a szkriptelési nyelv összes objektumhozzáférésének alapjaként szolgál, és szabványos absztrakciót biztosít a parancsmag fejlesztőjének.
Parancsmagfejlesztők
A parancsmagfejlesztők számára az ETS a következő támogatást nyújtja:
- A PSObject objektum használatával általánosan használható absztrakciók az objektumok ellen. Az ETS emellett lehetővé teszi ezen absztrakciók részletezésének lehetőségét is, ha szükséges.
- Az objektumtípusuk formázására, rendezésére, szerializálására és más rendszermódosításokra vonatkozó alapértelmezett viselkedés létrehozására szolgáló mechanizmusok a kiterjesztett tagok jól ismert készletével.
- A LanguagePrimitives objektumot használó szkriptnyelvvel megegyező szemantikát használó objektumokon való működés módja.
- A kivonattáblák dinamikus "beírásának" eszköze, hogy a rendszer többi része hatékonyan működjön rajta.
Szkriptfejlesztők
A szkriptfejlesztők számára az ETS a következő támogatást nyújtja:
- Bármely mögöttes objektumtípusra ugyanazzal a szintaxissal (
$a.x) hivatkozhat. - Az PSObject objektum által biztosított absztrakción túli hozzáférés lehetősége (például csak az adaptált tagok elérése vagy az alapobjektum elérése).
- Az objektumpéldányok vagy -típusok formázását, rendezését, szerializálását és egyéb manipulációit vezérlő ismert tagok definiálásának lehetősége.
- Azt jelenti, hogy egy objektumot egy adott típusnak nevezünk el, és ezáltal szabályozni a típusalapú tagok öröklését.
- A kiterjesztett tagok hozzáadásának, eltávolításának és módosításának lehetősége.
- Az PSObject objektum szükség esetén történő módosításának lehetősége.
A PSObject osztály
A PSObject objektum a szkriptnyelv összes objektumhozzáférésének alapja, és szabványos absztrakciót biztosít a parancsmag fejlesztőjének. Alapobjektumot (.NET-objektumot) és bármely példánytagot (tagokat, különösen kiterjesztett tagokat) tartalmaz, amelyek egy adott objektumpéldányon vannak jelen, de nem feltétlenül azonos típusú objektumokon. Az alapobjektum típusától függően a PSObject objektum implicit és explicit hozzáférést is biztosíthat az adaptált tagokhoz, valamint bármilyen típusalapú kiterjesztett taghoz.
A PSObject objektum a következő mechanizmusokat biztosítja:
- Az PSObject létrehozása alapobjektummal vagy anélkül.
- Az egyes létrehozott PSObject objektum összes tagjának hozzáférése egy közös keresési algoritmuson keresztül, és szükség esetén felülbírálható az algoritmus.
- A létrehozott PSObject objektumok típusneveinek lekérése és beállítása, hogy a szkriptek és parancsmagok hasonló PSObject objektumokra hivatkozhassanak ugyanazzal a típusnévvel, függetlenül az alapobjektum típusától.
PSObject létrehozása
Az alábbi lista ismerteti, hogyan hozhat létre PSObject objektumot:
- A PSObject .#ctor konstruktor meghívásával létrehoz egy új PSObject objektumot a PSCustomObject alapobjektumával. Az ilyen típusú alapobjektum azt jelzi, hogy az PSObject objektumnak nincs értelmes alapobjektuma. Az ilyen típusú alapobjektumokkal rendelkező PSObject objektum azonban olyan tulajdonságcsomagot biztosít, amelyet a parancsmag fejlesztői hasznosnak találnak a kiterjesztett tagok hozzáadásával.
A fejlesztők megadhatják az objektumtípus nevét is, amely lehetővé teszi, hogy az objektum megossza a kiterjesztett tagjait más PSObject azonos típusú objektumokkal.
A PSObject .#ctor(System.Object) konstruktor meghívása új PSObject objektumot hoz létre egy System.Object típusú alapobjektummal.
Ebben az esetben a létrehozott objektum típusneve az alapobjektum származtatási hierarchiájának gyűjteménye. A ProcessInfo alapobjektumot tartalmazó PSObject típusneve például a következő neveket tartalmazza:
- System.Diagnostics.Process
- System.ComponentModel.Component
- System.MarshalByRefObject
- System.Object
A PSObject meghívása. Az AsPSObject(System.Object) metódus egy új PSObject objektumot hoz létre egy megadott objektum alapján.
Ha a megadott objektum System.Object típusú, a rendszer a megadott objektumot használja az új PSObject objektum alapobjektumaként. Ha a megadott objektum már PSObject objektum, a rendszer a megadott objektumot adja vissza.
Alaptagok, adaptált és kiterjesztett tagok
Az ETS elméletileg a következő kifejezésekkel jeleníti meg az alapobjektum eredeti tagjai és a PowerShell által hozzáadott tagok közötti kapcsolatot. Az PSObject objektum által használt tagtípusokról további információt PSObject osztály.
Alapobjektum-tagok
Ha az alapobjektum a PSObject objektumok létrehozásakor van megadva, akkor az alapobjektum tagjai a Tagok tulajdonságon keresztül lesznek elérhetők.
Adaptált tagok
Ha egy alapobjektum egy metaobjektum, amely olyan általános módon tartalmaz adatokat, amelyek tulajdonságai "leírják" a bennük lévő adatokat, az ETS az objektumokat egy olyan nézethez igazítja, amely lehetővé teszi az adatok közvetlen elérését a PSObject objektum adaptált tagjain keresztül. Az adaptált tagok és az alapobjektum-tagok a Tagok tulajdonságon keresztül érhetők el.
Kiterjesztett tagok
Az alapobjektumból vagy a PowerShell által létrehozott adaptált tagokból elérhetővé tett tagokon kívül egy PSObject is meghatározhat kiterjesztett tagokat, amelyek kibővítik az eredeti alapobjektumot a szkriptelési környezetben hasznos további információkkal.
A PowerShell által biztosított összes alapvető parancsmag, például a Get-Content és a Set-Content parancsmagok például egy Path paramétert használnak. Annak érdekében, hogy ezek a parancsmagok és mások különböző típusú objektumok ellen is működjenek, az Elérési út tagokat hozzá lehet adni ezekhez az objektumokhoz, hogy az összes információjuk közös módon legyen megadva. Ez a kiterjesztett elérésiút-tag biztosítja, hogy a parancsmagok az összes ilyen típussal szemben működjön, annak ellenére, hogy az alaposztály nem rendelkezik Elérési út taggal.
A kiterjesztett tagok, az adaptált tagok és az alapobjektum-tagok mind a Tagok tulajdonságon keresztül érhetők el.