about_Methods

Rövid leírás

Ismerteti, hogyan hajthat végre műveleteket objektumokon a PowerShellben metódusokkal.

Hosszú leírás

A PowerShell objektumokkal jeleníti meg az adattárak elemeit vagy a számítógép állapotát. A FileInfo-objektumok például a fájlrendszer-meghajtók fájljait, a ProcessInfo-objektumok pedig a számítógépen lévő folyamatokat jelölik.

Az objektumok olyan tulajdonságokkal rendelkeznek, amelyek adatokat tárolnak az objektumról, és olyan módszereket, amelyekkel módosíthatja az objektumot.

A "metódus" olyan utasítások készlete, amelyek megadják az objektumon végrehajtható műveletet. Az objektum például tartalmazza azt a CopyTo metódust, FileInfo amely átmásolja az FileInfo objektum által képviselt fájlt.

Bármely objektum metódusainak lekéréséhez használja a Get-Member parancsmagot. Használja a MemberType tulajdonságát a "Method" értékkel. Az alábbi parancs lekéri a folyamatobjektumok metódusait.

Get-Process | Get-Member -MemberType Method
TypeName: System.Diagnostics.Process

Name                      MemberType Definition
----                      ---------- ----------
BeginErrorReadLine        Method     System.Void BeginErrorReadLine()
BeginOutputReadLine       Method     System.Void BeginOutputReadLine()
...
Kill                      Method     System.Void Kill()
Refresh                   Method     System.Void Refresh()
Start                     Method     bool Start()
ToString                  Method     string ToString()
WaitForExit               Method     bool WaitForExit(int milliseconds), ...
WaitForInputIdle          Method     bool WaitForInputIdle(int millisecon...

Egy objektum metódusának végrehajtásához vagy "meghívásához" írjon be egy pont (.), a metódus nevét és egy zárójelkészletet (()). Ha a metódus argumentumokat tartalmaz, helyezze az argumentumértékeket a zárójelekbe. A zárójelek minden metódushíváshoz szükségesek, még akkor is, ha nincsenek argumentumok. Ha a metódus több argumentumot is használ, vesszővel kell elválasztani őket.

Az alábbi parancs például meghívja a folyamatok Kill metódusát a Jegyzettömb folyamat befejezéséhez a számítógépen.

$notepad = Get-Process notepad
$notepad.Kill()

Ez a példa a fenti utasítások kombinálásával lerövidíthető.

(Get-Process Notepad).Kill()

A Get-Process parancs zárójelek közé van zárva, hogy a Kill metódus meghívása előtt fusson. A Kill metódus ezután meghívódik a visszaadott Process objektumon.

Egy másik nagyon hasznos módszer a Replace sztringek metódusa. A Replace metódus egy sztringen belüli szöveget cserél le. Az alábbi példában a pont (.) közvetlenül a sztring záró idézőjele után helyezhető el.

'this is rocket science'.Replace('rocket', 'rock')
this is rock science

Ahogy az előző példákban is látható, meghívhat egy metódust egy olyan objektumon, amelyet parancs, változó objektuma vagy bármilyen objektum (például idézőjelek sztringje) használatával kap.

A PowerShell 4.0-tól kezdve a metódushívás dinamikus metódusnevek használatával támogatott.

Tanulás a metódusokról

Egy objektum metódusainak definícióinak megkereséséhez keresse meg az objektumtípus súgótémakörét, és keresse meg annak metóduslapját. Az alábbi oldal például a System.Diagnostics.Process folyamatobjektumok metódusait ismerteti.

A metódus argumentumainak meghatározásához tekintse át a metódusdefiníciót, amely egy PowerShell-parancsmag szintaxisdiagramja.

A metódusdefiníciók egy vagy több metódusa aláírással rendelkezhetnek, amelyek olyanok, mint a PowerShell-parancsmagok paraméterkészletei. Az aláírások az összes érvényes parancsformátumot megjelenítik a metódus meghívásához.

Az osztály metódusa FileInfo például CopyTo a következő két metódus-aláírást tartalmazza:

    CopyTo(String destFileName)
    CopyTo(String destFileName, Boolean overwrite)

Az első metódus aláírása a célfájl nevét (és elérési útját) veszi át. Az alábbi példa az első CopyTo módszerrel másolja a fájlt a Final.txtC:\Bin könyvtárba.

(Get-ChildItem c:\final.txt).CopyTo("c:\bin\final.txt")

Feljegyzés

A PowerShell argumentummódjával ellentétben az objektummetódusok kifejezés módban futnak, ami a PowerShell által létrehozott .NET-keretrendszer átadása. A kifejezésmódban az egyszerű argumentumok (nem kvtált sztringek) nem engedélyezettek. Ez a különbség akkor jelenik meg, ha az elérési utat paraméterként használja, szemben az elérési út argumentumként való használatával. Az elemzési módokról a about_Parsing

A második metódus aláírása egy célfájlnevet és egy logikai értéket használ, amely meghatározza, hogy felülírja-e a célfájlt, ha már létezik.

Az alábbi példa a második CopyTo módszerrel másolja a fájlt a Final.txtC:\Bin könyvtárba, és felülírja a meglévő fájlokat.

(Get-ChildItem c:\final.txt).CopyTo("c:\bin\final.txt", $true)

Taghozzáférés számbavétele

A PowerShell 3.0-tól kezdve, amikor a tagelérési operátorral (.) olyan metódushoz fér hozzá, amely nem létezik egy listagyűjteményben, a PowerShell automatikusan számba fogja venni a gyűjtemény elemeit, és meghívja a metódust az egyes elemeken. További információ: about_Member-Access_Enumeration.

Példák

Az alábbi példa az egyes folyamatobjektumok Kill metódusát futtatja egy objektumgyűjteményben.

Az első parancs a Jegyzettömb folyamat három példányát indítja el. Get-Processlekéri a Jegyzettömb folyamat mindhárom példányát, és menti őket a $p változóba.

Notepad; Notepad; Notepad
$p = Get-Process Notepad
$p.Count
3

A következő parancs a Kill metódust futtatja a $p változó mindhárom folyamatán. Ez a parancs akkor is működik, ha egy folyamatgyűjtemény nem rendelkezik metódussal Kill .

$p.Kill()
Get-Process Notepad

A Get-Process parancs megerősíti, hogy a Kill metódus működött.

Get-Process : Cannot find a process with the name "notepad". Verify the proc
ess name and call the cmdlet again.
At line:1 char:12
+ Get-Process <<<<  notepad
    + CategoryInfo          : ObjectNotFound: (notepad:String) [Get-Process]
, ProcessCommandException
    + FullyQualifiedErrorId : NoProcessFoundForGivenName,Microsoft.PowerShel
l.Commands.GetProcessCommand

Ez a példa funkcionálisan egyenértékű azzal, ha a Foreach-Object parancsmaggal futtatja a metódust a gyűjtemény minden objektumán.

$p | ForEach-Object {$_.Kill()}

ForEach és Where metódusok

A PowerShell 4.0-tól kezdve a gyűjteményszűrés metódusszintaxissal támogatott. Ez lehetővé teszi két új módszer használatát a gyűjtemények ForEach és Wherea .

Ezekről a módszerekről a about_arrays

Adott metódus meghívása több túlterhelés esetén

A .NET-metódusok meghívásakor vegye figyelembe a következő forgatókönyvet. Ha egy metódus egy objektumot vesz igénybe, de egy speciális típust használó felületen keresztül túlterheli magát, a PowerShell az objektumot elfogadó metódust választja, kivéve, ha ön explicit módon az adott felületre öntötte.

Add-Type -TypeDefinition @'

   // Interface
   public interface IFoo {
     string Bar(int p);
   }

   // Type that implements the interface
   public class Foo : IFoo {

   // Direct member method named 'Bar'
   public string Bar(object p) { return $"object: {p}"; }

   // *Explicit* implementation of IFoo's 'Bar' method().
   string IFoo.Bar(int p) {
       return $"int: {p}";
   }

}
'@

Ebben a példában a Bar metódus kevésbé specifikus object túlterhelését választottuk.

[Foo]::new().Bar(1)
object: 1

Ebben a példában a metódust az IFoo felületre öntöttük, hogy kiválassza a Bar metódus pontosabb túlterhelését.

([IFoo] [Foo]::new()).Bar(1)
int: 1

Fájlrendszer-elérési utakat használó .NET-metódusok használata

A PowerShell folyamatonként több futtatóteret támogat. Minden runspace saját aktuális könyvtárral rendelkezik. Ez nem ugyanaz, mint az aktuális folyamat munkakönyvtára: [System.Environment]::CurrentDirectory.

A .NET-metódusok a folyamat munkakönyvtárát használják. A PowerShell-parancsmagok a Runspace helyét használják. A .NET-metódusok emellett csak natív fájlrendszer-elérési utakkal működnek, PowerShell-elérésiút-objektumokkal nem. Ha a PowerShell-elérési utakat .NET-metódusokkal szeretné használni, meg kell oldania a fájlrendszer natív elérési útját, mielőtt átadja azt a .NET-metódusnak.

Lásd még