Paraméterek nélküli parancsmag létrehozása
Ez a szakasz azt ismerteti, hogyan hozhat létre olyan parancsmagot, amely paraméterek használata nélkül olvassa be az információkat a helyi számítógépről, majd az adatokat a folyamatba írja. Az itt leírt parancsmag egy Get-Proc parancsmag, amely a helyi számítógép folyamatainak adatait olvassa be, majd megjeleníti azokat a parancssorban.
Megjegyzés
Ne feledje, hogy parancsmagok írásakor a Windows PowerShell®-referencia szerelvények letöltve lesznek a lemezre (alapértelmezés szerint a következő: C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0). A globális szerelvény-gyorsítótárban (GAC) nincsenek telepítve.
A parancsmag elnevezése
A parancsmag neve egy olyan parancsból áll, amely a parancsmag által lekért műveletet és főnevet tartalmazza, amely azokat az elemeket jelöli, amelyeken a parancsmag műveletet mutat. Mivel ez a Get-Proc-parancsmag folyamatobjektumokat ad vissza, a System.Management.Automation.Verbscommon enumerálás által meghatározott "Get" igét használja, a "Proc" főnév pedig azt jelzi, hogy a parancsmag működik a folyamatelemeken.
A parancsmagok elnevezésekor ne használja a következő karakterek egyikét: # , () {} [] & - /\ $ ; : " <> | ? @ ` .
Főnév kiválasztása
Válasszon egy konkrét főnévt. A legjobb, ha egyetlen főnevet használ, amely a terméknév rövid verzióját használja. Ilyen típusú parancsmagnév például a " Get-SQLServer
".
Művelet kiválasztása
A jóváhagyott parancsmagnevek készletének egyik parancsát kell használnia. A jóváhagyott parancsmag-parancsmagokkal kapcsolatos további információkért lásd: Parancsmag-parancsmagok nevei.
A parancsmagosztály meghatározása
Miután kiválasztotta a parancsmag nevét, határozzon meg egy .NET-osztályt a parancsmag megvalósításához. Itt található a minta-parancsmag osztálydefiníciójaGet-Proc parancsmaghoz:
[Cmdlet(VerbsCommon.Get, "Proc")]
public class GetProcCommand : Cmdlet
<Cmdlet(VerbsCommon.Get, "Proc")> _
Public Class GetProcCommand
Inherits Cmdlet
Figyelje meg, hogy az osztálydefiníciót megelőzően a System.Management.Automation.CmdletAttribute attribútum szintaxissal a parancsmagként azonosítja az [Cmdlet(verb, noun, ...)]
osztályt. Ez az egyetlen kötelező attribútum az összes parancsmaghoz, és lehetővé teszi a Windows PowerShell futásidejűnek, hogy helyesen hívja meg őket. Beállíthatja az attribútum kulcsszavakat, hogy szükség esetén tovább deklarálják az osztályt. Vegye figyelembe, hogy a minta GetProcCommand osztály attribútumdeklarációja csak a főnév és a parancsmag Get-Proc deklarál.
Megjegyzés
Minden Windows PowerShell attribútumosztályhoz beállítható kulcsszavak megfelelnek az attribútumosztály tulajdonságainak.
A parancsmag osztályának elnevezésekor a parancsmag nevét az osztály neveként kell tükrözni. Ehhez használja a "VerbNounCommand" formát, és cserélje le az "Ige" és a "Főnév" helyére a parancsmag nevében használt igét és főnevet. Ahogy az előző osztálydefinícióban is látható, a Get-Proc parancsmag egy GetProcCommand nevű osztályt határoz meg, amely a System.Management.Automation.Cmdlet alaposztályból származik.
Fontos
Ha olyan parancsmagot szeretne definiálni, amely közvetlenül hozzáfér a Windows PowerShell-runtime-hoz, a .NET-osztálynak a System.Management.Automation.PSCmdlet alaposztályból kell származtatva lennie. További információ erről az osztályról: Creating a Cmdlet that Defines Parameter Sets(Paraméterkészleteket definiáló parancsmag létrehozása).
Megjegyzés
A parancsmag osztályát explicit módon nyilvánosként kell megjelölni. A nem nyilvánosként megjelölt osztályok alapértelmezés szerint belsőek lesznek, és a Windows PowerShell nem találhatók meg.
Windows PowerShell a Microsoft.PowerShell.Commands névteret használja a parancsmagosztályaihoz. Javasoljuk, hogy a parancsmagosztályokat az API-névtér Commands névterében helyezze el, például xxx.PS.Commands.
Bemeneti feldolgozási metódus felülbírálása
A System.Management.Automation.Cmdlet osztály három fő bemeneti feldolgozási módszert biztosít, amelyek közül legalább az egyiket felül kell bírálni. További információ a rekordok Windows PowerShell a How Windows PowerShell Works Windows PowerShell .
A bemenetek minden típusához a Windows PowerShell a System.Management.Automation.Cmdlet.BeginProcessing parancsmagot hívja meg a feldolgozás engedélyezéséhez. Ha a parancsmagnak előfeldolgozást vagy beállítást kell végrehajtania, ezt a metódus felülbírálásával végezheti el.
Megjegyzés
Windows PowerShell a "record" kifejezést használja a parancsmagok hívatakor megadott paraméterértékek leírására.
Ha a parancsmag elfogadja a folyamat bemenetét, felül kell bírálni a System.Management.Automation.Cmdlet.ProcessRecord metódust és opcionálisan a System.Management.Automation.Cmdlet.EndProcessing metódust. Egy parancsmag például felülbírálhatja mindkét metódust, ha az összes bemenetet a System.Management.Automation.Cmdlet.ProcessRecord használatával gyűjti össze, majd egyszerre egy elem helyett egészként működik a bemeneten, ahogy azt a parancsmag Sort-Object
is teszi.
Ha a parancsmag nem veszi fel a folyamat bemenetét, felülbírálja a System.Management.Automation.Cmdlet.EndProcessing metódust. Vegye figyelembe, hogy ezt a metódust gyakran használják a System.Management.Automation.Cmdlet.BeginProcessing parancsmagok helyére, ha a parancsmag nem tud egyszerre egy elemmel működni, ahogyan a rendezési parancsmag esetében is.
Mivel a minta Get-Proc-parancsmagnak folyamatbemenetet kell fogadnia, felülírja a System.Management.Automation.Cmdlet.ProcessRecord metódust, és a System.Management.Automation.Cmdlet.BeginProcessing és System.Management.Automation.Cmdlet.EndProcessingalapértelmezett implementációit használja. A System.Management.Automation.Cmdlet.ProcessRecord felülbírálás lekéri a folyamatokat, és a parancssorba írja azokat a System.Management.Automation.Cmdlet.WriteObject metódussal.
protected override void ProcessRecord()
{
// Get the current processes
Process[] processes = Process.GetProcesses();
// Write the processes to the pipeline making them available
// to the next cmdlet. The second parameter of this call tells
// PowerShell to enumerate the array, and send one process at a
// time to the pipeline.
WriteObject(processes, true);
}
Protected Overrides Sub ProcessRecord()
'/ Get the current processes.
Dim processes As Process()
processes = Process.GetProcesses()
'/ Write the processes to the pipeline making them available
'/ to the next cmdlet. The second parameter of this call tells
'/ PowerShell to enumerate the array, and send one process at a
'/ time to the pipeline.
WriteObject(processes, True)
End Sub 'ProcessRecord
A bemeneti feldolgozással kapcsolatos dolog, amit meg kell jegyezni
A bemenet alapértelmezett forrása egy explicit objektum (például egy sztring), amelyet a felhasználó a parancssorban biztosít. További információ: Parancsmag létrehozása parancssori bemenet feldolgozásához.
A bemeneti feldolgozási metódus a folyamat egy upstream parancsmagja kimeneti objektumának bemenetét is fogadhatja. További információ: Creating a Cmdlet to Process Pipeline Input(Parancsmag létrehozása a folyamat bemenetének feldolgozásához). Vegye figyelembe, hogy a parancsmag parancssori és folyamatforrások kombinációjából is fogadhat bemenetet.
Előfordulhat, hogy az lefelé irányuló parancsmag nem tér vissza hosszú időre, vagy egyáltalán nem. Emiatt a parancsmag bemeneti feldolgozási metódusának nem szabad zárolásokat tartania a System.Management.Automation.Cmdlet.WriteObjecthívásai során, különösen olyan zárolások esetén, amelyek hatóköre a parancsmagpéldányon túlra terjed.
Fontos
A parancsmagok soha ne hívják meg a System.Console.Writeline* vagy annak megfelelőit.
- Előfordulhat, hogy a parancsmag objektumváltozókat fog megtisztítani a feldolgozás befejezésekor (például ha megnyit egy fájlle leírót a System.Management.Automation.Cmdlet.BeginProcessing metódusban, és nyitva tartja a leírót a System.Management.Automation.Cmdlet.ProcessRecord számára). Fontos megjegyezni, hogy a Windows PowerShell-runtime nem mindig hívja meg a System.Management.Automation.Cmdlet.EndProcessing metódust, amelynek objektum-tisztítást kell végrehajtania.
Előfordulhat például, hogy a rendszer nem hív meg System.Management.Automation.Cmdlet.EndProcessing parancsmagot, ha a parancsmagot félúton megszakítják, vagy ha a parancsmag bármelyik részében megszakítási hiba történik. Ezért az objektum tisztítását igénylő parancsmagnak implementálja a teljes System.IDisposable mintát, beleértve a véglegesítőt is, hogy a futtatás a feldolgozás végén a System.Management.Automation.Cmdlet.EndProcessing és a System.IDisposable.Dispose* rendszert is meg tudja hívni.
Kódminta
A teljes C#-mintakódért lásd: GetProcessSample01 minta.
Objektumtípusok definiálása és formázása
Windows PowerShell .NET-objektumok használatával továbbítja az információkat a parancsmagok között. Emiatt előfordulhat, hogy egy parancsmagnak meg kell határoznia a saját típusát, vagy a parancsmagnak ki kell terjesztenie egy másik parancsmag által biztosított meglévő típust. További információ az új típusok meghatározásáról vagy a meglévő típusok kiterjesztéséről: Extending Object Types and Formatting (Az objektumtípusok kiterjesztése és formázása).
A parancsmag kiépítése
A parancsmagok megvalósítása után regisztrálnia kell azt a Windows PowerShell egy Windows PowerShell beépülő modulon keresztül. További információ a parancsmagok regisztrálásról: Parancsmagok, szolgáltatók és gazdaalkalmazások regisztrálása.
A parancsmag tesztelése
Miután regisztrálta a parancsmagot a Windows PowerShell, a parancssorban futtatva tesztelheti. A minta-Get-Proc parancsmag kódja kicsi, de továbbra is az Windows PowerShell-runtime-t és egy meglévő .NET-objektumot használ, ami elég ahhoz, hogy hasznos legyen. Teszteljük, hogy jobban megértsük, mire Get-Proc és hogyan használható a kimenete. A parancsmagok parancssorból való használatával kapcsolatos további információkért lásd: Getting Started with Windows PowerShell.
Indítsa Windows PowerShell, és szerezze be a számítógépen futó aktuális folyamatokat.
get-proc
Az alábbi kimenet jelenik meg.
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ---------- 254 7 7664 12048 66 173.75 1200 QCTRAY 32 2 1372 2628 31 0.04 1860 DLG 271 6 1216 3688 33 0.03 3816 lg 27 2 560 1920 24 0.01 1768 TpScrex ...
A könnyebb kezelés érdekében rendeljen hozzá egy változót a parancsmag eredményeihez.
$p=get-proc
A folyamatok számának lekért száma.
$p.length
Az alábbi kimenet jelenik meg.
63
Egy adott folyamat lekérése.
$p[6]
Az alábbi kimenet jelenik meg.
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 1033 3 2400 3336 35 0.53 1588 rundll32
A folyamat kezdési ideje.
$p[6].starttime
Az alábbi kimenet jelenik meg.
Tuesday, July 26, 2005 9:34:15 AM
$p[6].starttime.dayofyear
207
Le kell kapnia a folyamatokat, amelyeknél a leírók száma nagyobb 500-asnál, és rendezheti az eredményt.
$p | Where-Object {$_.HandleCount -gt 500 } | Sort-Object HandleCount
Az alábbi kimenet jelenik meg.
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ---------- 568 14 2164 4972 39 5.55 824 svchost 716 7 2080 5332 28 25.38 468 csrss 761 21 33060 56608 440 393.56 3300 WINWORD 791 71 7412 4540 59 3.31 492 winlogon ...
Az
Get-Member
egyes folyamatokhoz elérhető tulajdonságok listához használja a parancsmagot.$p | Get-Member -MemberType property
TypeName: System.Diagnostics.Process
Az alábbi kimenet jelenik meg.
Name MemberType Definition ---- ---------- ---------- BasePriority Property System.Int32 BasePriority {get;} Container Property System.ComponentModel.IContainer Conta... EnableRaisingEvents Property System.Boolean EnableRaisingEvents {ge... ...
Lásd még:
Parancsmag létrehozása parancssori bemenet feldolgozásához
Parancsmag létrehozása a folyamat bemenetének feldolgozásához
Új parancsmag Windows PowerShell létrehozása
Objektumtípusok kiterjesztése és formázása
Az Windows PowerShell működése
Parancsmagok, szolgáltatók és gazdaalkalmazások regisztrálása
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: