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.
Néha a parancsmagnak módosítania kell a rendszer futási állapotát, nem csak a Windows PowerShell-futtatókörnyezet állapotát. Ezekben az esetekben a parancsmagnak lehetővé kell tennie a felhasználó számára, hogy megerősítse a módosítást.
A megerősítés támogatásához a parancsmagnak két dolgot kell tennie.
Deklarálja, hogy a parancsmag támogatja a megerősítést a System.Management.Automation.CmdletAttribute attribútum megadásakor a SupportsShouldProcess kulcsszó
truebeállításával.Hívja meg a System.Management.Automation.Cmdlet.ShouldProcess parancsmagot a parancsmag végrehajtása során (az alábbi példában látható módon).
A megerősítés támogatásával a parancsmagok elérhetővé teszik a Confirm Windows PowerShell által biztosított paramétereket és WhatIf paramétereket, és megfelelnek a parancsmagok fejlesztési irányelveinek is (a parancsmagok fejlesztési irányelveiről további információt a parancsmagok fejlesztési irányelvei című témakörben talál.)
A rendszer módosítása
A "rendszer módosítása" minden olyan parancsmagra vonatkozik, amely a Windows PowerShellen kívül esetleg megváltoztatja a rendszer állapotát. Például egy folyamat leállítása, egy felhasználói fiók engedélyezése vagy letiltása, vagy egy sor hozzáadása egy adatbázistáblához a rendszer minden olyan módosítása, amelyet meg kell erősíteni.
Ezzel szemben az adatokat olvasó vagy átmeneti kapcsolatokat létesítő műveletek nem módosítják a rendszert, és általában nem igényelnek megerősítést. Nem szükséges megerősítést adni az olyan műveletekhez sem, amelyek hatása a Windows PowerShell-futtatókörnyezeten belülre korlátozódik, például Set-Variable. Az állandó módosítást esetleg nem okozó parancsmagoknak deklarálniuk SupportsShouldProcess kell, és csak akkor kell meghívniuk a System.Management.Automation.Cmdlet.ShouldProcess parancsmagot , ha állandó módosításra készülnek.
Megjegyzés:
A ShouldProcess megerősítése csak a parancsmagokra vonatkozik. Ha egy parancs vagy szkript a .NET-metódusok vagy -tulajdonságok közvetlen meghívásával vagy a Windows PowerShellen kívüli alkalmazások meghívásával módosítja a rendszer futási állapotát, ez a megerősítési forma nem lesz elérhető.
A StopProc-parancsmag
Ez a témakör egy Stop-Proc parancsmagot ismertet, amely megpróbálja leállítani a Get-Proc parancsmaggal lekért folyamatokat (az első parancsmag létrehozásával).
A parancsmag definiálása
A parancsmag létrehozásának első lépése mindig a parancsmag elnevezése és a parancsmagot implementáló .NET-osztály deklarálása. Mivel egy parancsmagot ír a rendszer módosításához, ennek megfelelően kell elneveznie. Ez a parancsmag leállítja a rendszerfolyamatokat, ezért az itt kiválasztott ige neve "Stop", amelyet a System.Management.Automation.VerbsLifecycle osztály határoz meg, és a "Proc" főnév jelzi, hogy a parancsmag leállítja a folyamatokat. A jóváhagyott parancsmag-parancsmagokkal kapcsolatos további információkért lásd parancsmagok parancsmagjának nevei.
A Stop-Proc parancsmag osztálydefiníciója a következő.
[Cmdlet(VerbsLifecycle.Stop, "Proc",
SupportsShouldProcess = true)]
public class StopProcCommand : Cmdlet
Vegye figyelembe, hogy a System.Management.Automation.CmdletAttribute deklarációban az SupportsShouldProcess attribútum kulcsszója úgy van beállítva, hogy true a parancsmag meghívja a System.Management.Automation.Cmdlet.ShouldProcess és a System.Management.Automation.Cmdlet.ShouldContinue parancsmagot. E kulcsszókészlet nélkül a paraméterek és WhatIf a Confirm paraméterek nem lesznek elérhetők a felhasználó számára.
Rendkívül romboló műveletek
Egyes műveletek rendkívül rombolóak, például egy aktív merevlemez-partíció újraformázása. Ezekben az esetekben a parancsmagnak be kell állítania ConfirmImpact = ConfirmImpact.High a System.Management.Automation.CmdletAttribute attribútum deklarálásakor. Ez a beállítás arra kényszeríti a parancsmagot, hogy a felhasználó megerősítését kérje akkor is, ha a felhasználó nem adta meg a paramétert Confirm . A parancsmagfejlesztőknek azonban el kell kerülnie az olyan műveletek túlzott használatát ConfirmImpact , amelyek csak potenciálisan romboló jellegűek, például egy felhasználói fiók törlése. Ne feledje, hogy ha ConfirmImpact a System.Management.Automation.ConfirmImpactHigh értékre van állítva.
Hasonlóképpen, egyes műveletek nem valószínű, hogy rombolóak, bár elméletileg módosítják a windowsos PowerShellen kívüli rendszerek futási állapotát. Az ilyen parancsmagok a System.Management.Automation.ConfirmImpact.Low értékre állíthatókConfirmImpact. Ez megkerüli a megerősítést kérő kéréseket, ahol a felhasználó csak közepes és nagy hatású műveletek megerősítését kérte.
A rendszermódosítás paramétereinek meghatározása
Ez a szakasz bemutatja, hogyan definiálhatók a parancsmag paraméterei, beleértve a rendszermódosítás támogatásához szükséges paramétereket is. Ha általános információkra van szüksége a paraméterek definiálásáról, tekintse meg a parancssori bemenetet feldolgozó paraméterek hozzáadása című témakört.
A Stop-Proc parancsmag három paramétert határoz meg: Name, Forceés PassThru.
A Name paraméter a folyamatbemeneti objektum tulajdonságának felel meg Name . Vegye figyelembe, hogy a Name mintában szereplő paraméter kötelező, mivel a parancsmag sikertelen lesz, ha nem áll le egy elnevezett folyamat.
A Force paraméter lehetővé teszi, hogy a felhasználó felülbírálja a System.Management.Automation.Cmdlet.ShouldContinue hívásait. Valójában minden olyan parancsmagnak, amely a System.Management.Automation.Cmdlet.ShouldContinue parancsmagot meghívja, rendelkeznie kell egy Force paraméterrel, így ha Force meg van adva, a parancsmag kihagyja a System.Management.Automation.Cmdlet.ShouldContinue hívását, és folytatja a műveletet. Vegye figyelembe, hogy ez nem érinti a System.Management.Automation.Cmdlet.ShouldProcess hívásait.
A PassThru paraméter lehetővé teszi a felhasználó számára, hogy jelezze, hogy a parancsmag átadja-e a kimeneti objektumot a folyamaton keresztül, ebben az esetben a folyamat leállítása után. Vegye figyelembe, hogy ez a paraméter a parancsmaghoz van kötve a bemeneti objektum tulajdonsága helyett.
Itt található a Stop-Proc parancsmag paraméterdeklarációja.
[Parameter(
Position = 0,
Mandatory = true,
ValueFromPipeline = true,
ValueFromPipelineByPropertyName = true
)]
public string[] Name
{
get { return processNames; }
set { processNames = value; }
}
private string[] processNames;
/// <summary>
/// Specify the Force parameter that allows the user to override
/// the ShouldContinue call to force the stop operation. This
/// parameter should always be used with caution.
/// </summary>
[Parameter]
public SwitchParameter Force
{
get { return force; }
set { force = value; }
}
private bool force;
/// <summary>
/// Specify the PassThru parameter that allows the user to specify
/// that the cmdlet should pass the process object down the pipeline
/// after the process has been stopped.
/// </summary>
[Parameter]
public SwitchParameter PassThru
{
get { return passThru; }
set { passThru = value; }
}
private bool passThru;
Bemeneti feldolgozási módszer felülírása
A parancsmagnak felül kell bírálnia egy bemeneti feldolgozási módszert. Az alábbi kód a System.Management.Automation.Cmdlet.ProcessRecord felülbírálást mutatja be, amelyet a minta Stop-Proc parancsmagban használ. Ez a metódus minden kért folyamatnév esetében biztosítja, hogy a folyamat ne különleges folyamat legyen, megpróbálja leállítani a folyamatot, majd egy kimeneti objektumot küldjön, ha a PassThru paraméter meg van adva.
protected override void ProcessRecord()
{
foreach (string name in processNames)
{
// For every process name passed to the cmdlet, get the associated
// process(es). For failures, write a non-terminating error
Process[] processes;
try
{
processes = Process.GetProcessesByName(name);
}
catch (InvalidOperationException ioe)
{
WriteError(new ErrorRecord(ioe,"Unable to access the target process by name",
ErrorCategory.InvalidOperation, name));
continue;
}
// Try to stop the process(es) that have been retrieved for a name
foreach (Process process in processes)
{
string processName;
try
{
processName = process.ProcessName;
}
catch (Win32Exception e)
{
WriteError(new ErrorRecord(e, "ProcessNameNotFound",
ErrorCategory.ReadError, process));
continue;
}
// Call Should Process to confirm the operation first.
// This is always false if WhatIf is set.
if (!ShouldProcess(string.Format("{0} ({1})", processName,
process.Id)))
{
continue;
}
// Call ShouldContinue to make sure the user really does want
// to stop a critical process that could possibly stop the computer.
bool criticalProcess =
criticalProcessNames.Contains(processName.ToLower());
if (criticalProcess &&!force)
{
string message = String.Format
("The process \"{0}\" is a critical process and should not be stopped. Are you sure you wish to stop the process?",
processName);
// It is possible that ProcessRecord is called multiple times
// when the Name parameter receives objects as input from the
// pipeline. So to retain YesToAll and NoToAll input that the
// user may enter across multiple calls to ProcessRecord, this
// information is stored as private members of the cmdlet.
if (!ShouldContinue(message, "Warning!",
ref yesToAll,
ref noToAll))
{
continue;
}
} // if (criticalProcess...
// Stop the named process.
try
{
process.Kill();
}
catch (Exception e)
{
if ((e is Win32Exception) || (e is SystemException) ||
(e is InvalidOperationException))
{
// This process could not be stopped so write
// a non-terminating error.
string message = String.Format("{0} {1} {2}",
"Could not stop process \"", processName,
"\".");
WriteError(new ErrorRecord(e, message,
ErrorCategory.CloseError, process));
continue;
} // if ((e is...
else throw;
} // catch
// If the PassThru parameter argument is
// True, pass the terminated process on.
if (passThru)
{
WriteObject(process);
}
} // foreach (Process...
} // foreach (string...
} // ProcessRecord
A ShouldProcess metódus meghívása
A parancsmag bemeneti feldolgozási módszerének meg kell hívnia a System.Management.Automation.Cmdlet.ShouldProcess metódust, hogy megerősítse a művelet végrehajtását, mielőtt a rendszer futó állapotára módosítanák (például a fájlok törlését). Ez lehetővé teszi, hogy a Windows PowerShell-futtatókörnyezet a megfelelő "WhatIf" és "Confirm" viselkedést adja meg a rendszerhéjon belül.
Megjegyzés:
Ha egy parancsmag azt állítja, hogy támogatja a folyamatot, és nem tudja kezdeményezni a System.Management.Automation.Cmdlet.ShouldProcess hívást, előfordulhat, hogy a felhasználó váratlanul módosítja a rendszert.
A System.Management.Automation.Cmdlet.ShouldProcess hívása elküldi a felhasználónak módosítani kívánt erőforrás nevét. A Windows PowerShell-futtatókörnyezet figyelembe veszi a parancssori beállításokat vagy a beállítási változókat annak meghatározásához, hogy mit kell megjeleníteni a felhasználó számára.
Az alábbi példa a System.Management.Automation.Cmdlet.ShouldProcess hívását mutatja be a System.Management.Automation.Cmdlet.ProcessRecord metódus felülbírálásából a minta Stop-Proc parancsmagban.
if (!ShouldProcess(string.Format("{0} ({1})", processName,
process.Id)))
{
continue;
}
A ShouldContinue metódus meghívása
A System.Management.Automation.Cmdlet.ShouldContinue metódus hívása másodlagos üzenetet küld a felhasználónak. Ez a hívás a System.Management.Automation.Cmdlet.ShouldProcesstrue hívás után történik, és ha a Force paraméter nincs beállítva true. A felhasználó ezután visszajelzést küldhet arról, hogy a műveletet folytatni kell-e. A parancsmag meghívja a System.Management.Automation.Cmdlet.ShouldContinue parancsmagot a rendszer esetlegesen veszélyes módosításainak további ellenőrzéseként, vagy ha igent szeretne adni az összesre és no-to- minden lehetőséget a felhasználónak.
Az alábbi példa a System.Management.Automation.Cmdlet.ShouldContinue hívását mutatja be a System.Management.Automation.Cmdlet.ProcessRecord metódus felülbírálásából a minta Stop-Proc parancsmagban.
if (criticalProcess &&!force)
{
string message = String.Format
("The process \"{0}\" is a critical process and should not be stopped. Are you sure you wish to stop the process?",
processName);
// It is possible that ProcessRecord is called multiple times
// when the Name parameter receives objects as input from the
// pipeline. So to retain YesToAll and NoToAll input that the
// user may enter across multiple calls to ProcessRecord, this
// information is stored as private members of the cmdlet.
if (!ShouldContinue(message, "Warning!",
ref yesToAll,
ref noToAll))
{
continue;
}
} // if (criticalProcess...
Bemeneti feldolgozás leállítása
A rendszermódosításokat okozó parancsmag bemeneti feldolgozási módszerének módot kell biztosítania a bemenet feldolgozásának leállítására. Ebben az Stop-Proc parancsmagban a Rendszer.Management.Automation.Cmdlet.ProcessRecord metódus meghívja a System.Diagnostics.Process.Kill* metódust. Mivel a paraméter be van állítvatrue, a PassThruSystem.Management.Automation.Cmdlet.ProcessRecord meghívja a System.Management.Automation.Cmdlet.WriteObject parancsmagot is, hogy elküldje a folyamatobjektumot a folyamatnak.
Kódminta
A teljes C#-mintakódért tekintse meg a StopProcessSample01 mintát.
Objektumtípusok meghatározása és formázása
A Windows PowerShell .NET-objektumokkal továbbítja az adatokat a parancsmagok között. Következésképpen előfordulhat, hogy egy parancsmagnak meg kell határoznia a saját típusát, vagy előfordulhat, hogy a parancsmagnak ki kell terjesztenie egy másik parancsmag által biztosított meglévő típust. Az új típusok definiálásáról vagy a meglévő típusok kibővítéséről további információt az Objektumtípusok és formázás kiterjesztése című témakörben talál.
A parancsmag létrehozása
A parancsmag implementálása után egy Windows PowerShell beépülő modulon keresztül regisztrálnia kell azt a Windows PowerShellben. A parancsmagok regisztrálásáról további információt a parancsmagok, szolgáltatók és gazdagépalkalmazások .
A parancsmag tesztelése
Ha a parancsmag regisztrálva lett a Windows PowerShellben, a parancssorban futtatva tesztelheti. Íme néhány teszt, amely teszteli a Stop-Proc parancsmagot. A parancsmagok parancssorból való használatával kapcsolatos további információkért tekintse meg a rendszerhéj futó parancsait.
Indítsa el a Windows PowerShellt, és a Stop-Proc parancsmaggal állítsa le a feldolgozást az alább látható módon. Mivel a parancsmag kötelezőként adja meg a
Nameparamétert, a parancsmag lekérdezi a paramétert.PS> Stop-ProcMegjelenik a következő kimenet.
Cmdlet Stop-Proc at command pipeline position 1 Supply values for the following parameters: Name[0]:Most használjuk a parancsmagot a "JEGYZETTÖMB" nevű folyamat leállításához. A parancsmag megkéri, hogy erősítse meg a műveletet.
PS> Stop-Proc -Name notepadMegjelenik a következő kimenet.
Confirm Are you sure you want to perform this action? Performing operation "Stop-Proc" on Target "notepad (4996)". [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): YA "WINLOGON" nevű kritikus folyamat leállításához használja a Stop-Proc az ábrán látható módon. A rendszer kéri és figyelmezteti a művelet végrehajtására, mert az az operációs rendszer újraindítását okozza.
PS> Stop-Proc -Name WinlogonMegjelenik a következő kimenet.
Confirm Are you sure you want to perform this action? Performing operation "Stop-Proc" on Target "winlogon (656)". [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): Y Warning! The process " winlogon " is a critical process and should not be stopped. Are you sure you wish to stop the process? [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): NMost próbáljuk meg figyelmeztetés nélkül leállítani a WINLOGON-folyamatot. Vegye figyelembe, hogy ez a parancsbejegyzés a
Forceparamétert használja a figyelmeztetés felülbírálásához.PS> Stop-Proc -Name winlogon -ForceMegjelenik a következő kimenet.
Confirm Are you sure you want to perform this action? Performing operation "Stop-Proc" on Target "winlogon (656)". [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): N