Rendszermódosító parancsmag létrehozása
Előfordulhat, hogy egy parancsmagnak módosítania kell a rendszer futási állapotát, nem csak a futtatókörnyezet Windows PowerShell állapotát. Ezekben az esetekben a parancsmagnak lehetővé kell tennie a felhasználó számára annak megerősítését, hogy a módosításra szükség van-e.
A megerősítés támogatásához a parancsmagnak két dolgot kell megtennie.
Deklarálja, hogy a parancsmag támogatja-e a megerősítést, ha megadja a System.Management.Automation.CmdletAttribute attribútumot a SupportsShouldProcess kulcsszó értékére való
true
beá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 parancsmag elérhetővé teszi az Windows PowerShell által biztosított és paramétereket, és megfelel a parancsmagok fejlesztési irányelveinek (További információ a parancsmagok fejlesztésével kapcsolatos irányelvekről: Confirm
WhatIf
Cmdlet Development Guidelines.).
A rendszer módosítása
A "rendszer módosítása" minden olyan parancsmagra vonatkozik, amely esetleg megváltoztatja a rendszer állapotát a Windows PowerShell. Például egy folyamat leállítása, egy felhasználói fiók engedélyezése vagy letiltása, vagy egy sor adatbázistáblához való hozzáadása a rendszer minden meg kell erősítenie.
Ezzel szemben az adatokat beolvasó 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. Megerősítésre nincs szükség az olyan műveleteknél sem, amelyeknek a hatása a Windows PowerShell belülre van korlátozva, például a következő esetében: set-variable
. Azok a parancsmagok, amelyek perzisztens változást eszköznek vagy nem, deklarálják és meg kell hívniuk SupportsShouldProcess
a System.Management.Automation.Cmdlet.ShouldProcess parancsmagot, csak akkor, ha állandó változást fognak tenni.
Megjegyzés
A ShouldProcess megerősítése csak a parancsmagok esetén érvényes. Ha egy parancs vagy szkript a .NET-metódusok vagy -tulajdonságok közvetlen hívásával vagy a Windows PowerShell-n kívüli alkalmazások hívásával módosítja a rendszer futási állapotát, ez a megerősítési mód nem lesz elérhető.
A StopProc parancsmag
Ez a témakör egy Stop-Proc parancsmagot ismertet, amely megkísérli leállítani a Get-Proc-parancsmag használatával lekért folyamatokat (lásd: Creating Your First Cmdlet).
A parancsmag meghatározása
A parancsmagok létrehozásának első lépése mindig a parancsmag elnevezése és a parancsmagot megvalósító .NET-osztály deklarációja. Mivel olyan parancsmagot ír, amely módosítja a rendszert, ennek megfelelően kell elnevezni. Ez a parancsmag leállítja a rendszerfolyamatokat, így az itt kiválasztott parancsnév a "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: Parancsmag-parancsmagok nevei.
A következő a parancsmag osztálydefiníciójaStop-Proc parancsmaghoz.
[Cmdlet(VerbsLifecycle.Stop, "Proc",
SupportsShouldProcess = true)]
public class StopProcCommand : Cmdlet
Vegye figyelembe, hogy a System.Management.Automation.CmdletAttribute deklarációban az attribútum kulcsszó úgy van beállítva, hogy lehetővé tegye a parancsmag számára a következő hívásokat: SupportsShouldProcess
true
System.Management.Automation.Cmdlet.ShouldProcess és System.Management.Automation.Cmdlet.ShouldContinue.
A kulcsszó beállítása nélkül a és a Confirm
paraméter nem lesz elérhető a felhasználó WhatIf
számára.
Rendkívül kipusztító műveletek
Egyes műveletek rendkívül károsak, például újraformálnak egy aktív merevlemez-partíciót. Ezekben az esetekben a parancsmagot a ConfirmImpact
= ConfirmImpact.High
System.Management.Automation.CmdletAttribute attribútum deklarálásakor kell beállítani. Ez a beállítás arra kényszeríti a parancsmagot, hogy akkor is felhasználói megerősítést kérjen, ha a felhasználó nem adott meg Confirm
paramétert. A parancsmag-fejlesztőknek azonban el kell kerülniük a csak potenciálisan kioltó műveletek túlhasználódását, például egy felhasználói fiók ConfirmImpact
törlését. Ne feledje, hogy ha ConfirmImpact
a System.Management.Automation.ConfirmImpactHigh van
beállítva.
Hasonlóképpen, egyes műveletek valószínűleg nem lesznek károsak, bár elméletben módosítják egy rendszer futási állapotát a Windows PowerShell. Az ilyen parancsmagok a ConfirmImpact
System.Management.Automation.Confirmimpact.Low beállításra is beállíthatók.
Ez megkerüli a megerősítési kéréseket, ha a felhasználó csak a közepes és a nagy hatással járó műveletek megerősítését kérte.
Rendszermódosítás paramétereinek definiálása
Ez a szakasz a parancsmag paramétereinek definiálását ismerteti, beleértve azokat is, amelyek a rendszer módosításának támogatásához szükségesek. Ha általános információkra van szüksége a paraméterek meghatározásával kapcsolatban, tekintse meg a Parancssori bemenetet feldolgozására vonatkozó paraméterek hozzáadása.
A Stop-Proc parancsmag három paramétert határoz meg: Name
, Force
és PassThru
.
A Name
paraméter a folyamat bemeneti Name
objektumának tulajdonságának felel meg. Vegye figyelembe, hogy a mintában található paraméter kötelező, mivel a parancsmag sikertelen lesz, ha nem rendelkezik leállítható megnevezett Name
folyamattal.
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, a System.Management.Automation.Cmdlet.ShouldContinue függvényt hívó parancsmagnak egy paraméterrel kell lennie, hogy ha meg van adva, a parancsmag kihagyja a Force
Force
System.Management.Automation.Cmdlet.ShouldContinue hívását, és folytatja a műveletet. Vegye figyelembe, hogy ez nincs hatással a System.Management.Automation.Cmdlet.ShouldProcess hívásaira.
A paraméter lehetővé teszi a felhasználó számára annak jelzését, hogy a parancsmag átadja-e a kimeneti objektumot a folyamaton keresztül, ebben az esetben PassThru
a folyamat leállása után. Vegye figyelembe, hogy ez a paraméter a parancsmaghoz van kötve a bemeneti objektum tulajdonsága helyett.
Lássunk egy paraméterdeklarációt a Stop-Proc parancsmaghoz.
[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 metódus felülbírálása
A parancsmagnak felül kell bírálni egy bemeneti feldolgozási metódust. Az alábbi kód bemutatja a minta-parancsmagban használt System.Management.Automation.Cmdlet.ProcessRecord felülbírálást Stop-Proc parancsmagban. Ez a metódus minden kért folyamatnévhez biztosítja, hogy a folyamat ne speciális folyamat legyen, megpróbálja leállítani a folyamatot, majd kimeneti objektumot küld, ha a paraméter PassThru
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 hívása
A parancsmag bemeneti feldolgozási metódusának meg kell hívnia a System.Management.Automation.Cmdlet.ShouldProcess metódust a művelet végrehajtásának megerősítéséhez, mielőtt a rendszer futási állapotába módosítás (például fájlok törlése) készül. Ez lehetővé teszi a Windows PowerShell, hogy a rendszerhéjban a megfelelő "WhatIf" és "Confirm" viselkedést biztosítsa.
Megjegyzés
Ha egy támogatott parancsmagnak fel kell tudnia feldolgoznia a System.Management.Automation.Cmdlet.ShouldProcess hívást, a felhasználó váratlanul módosíthatja a rendszert.
A System.Management.Automation.Cmdlet.ShouldProcess hívása elküldi a módosítani szükséges erőforrás nevét a felhasználónak úgy, hogy a Windows PowerShell-runtime figyelembe veszi a parancssori beállításokat vagy preferenciavá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 minta parancsmag System.Management.Automation.Cmdlet.ProcessRecor Stop-Proc d metódusának felülbírálásából.
if (!ShouldProcess(string.Format("{0} ({1})", processName,
process.Id)))
{
continue;
}
A ShouldContinue metódus hívása
A System.Management.Automation.Cmdlet.ShouldContinue metódus hívása egy másodlagos üzenetet küld a felhasználónak. Ez a hívás azután történik, hogy a System.Management.Automation.Cmdlet.ShouldProcess visszaadott hívása, és ha a paraméter nem a következőre lett true
Force
beállítva: true
. A felhasználó ezután visszajelzést küldhet arról, hogy folytatni kell-e a műveletet. A parancsmag a System.Management.Automation.Cmdlet.ShouldContinue függvényt hívja meg további ellenőrzésként a potenciálisan veszélyes rendszermódosítások ellenőrzéséhez, vagy ha igen-az-összesre és "mindenhez" lehetőséget szeretne biztosítani a felhasználónak.
Az alábbi példa a System.Management.Automation.Cmdlet.ShouldContinue hívását mutatja be a minta parancsmag System.Management.Automation.Cmdlet.ProcessRecor Stop-Proc d metódusának felülbírálásából.
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...
Bemenet feldolgozásának leállítása
A rendszermódosításokat elkenő parancsmag bemeneti feldolgozási metódusának módot kell adnia a bemenet feldolgozásának leállítására. Ebben az Stop-Proc parancsmagban a System.Management.Automation.Cmdlet.ProcessRecord metódusról a System.Diagnostics.Process.Kill* metódusra történt hívás. Mivel a paraméter értéke PassThru
true
, a System.Management.Automation.Cmdlet.ProcessRecord a System.Management.Automation.Cmdlet.WriteObject hívásával is elküldi a folyamatobjektumot a folyamatnak.
Kódminta
A teljes C#-mintakódért tekintse meg a StopProcessSample01 mintát.
Objektumtípusok definiálása és formázása
Windows PowerShell .NET-objektumokat használó parancsmagok között továbbítja az információkat. 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 parancsmagot a megvalósítása után regisztrálni kell 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. Íme néhány teszt, amelyek tesztelik Stop-Proc parancsmagot. 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 a Stop-Proc parancsmag használatával állítsa le a feldolgozást az alább látható módon. Mivel a parancsmag kötelezőként határozza meg a
Name
paramétert, a parancsmag lekérdezi a paramétert.PS> stop-proc
Az alábbi kimenet jelenik meg.
Cmdlet stop-proc at command pipeline position 1 Supply values for the following parameters: Name[0]:
Most a parancsmag használatával állítsa le a "NOTEPAD" nevű folyamatot. A parancsmag a művelet megerősítését kéri.
PS> stop-proc -Name notepad
Az alábbi kimenet jelenik meg.
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"): Y
A Stop-Proc a "WINLOGON" nevű kritikus folyamat leállításához használja a következőt: . A rendszer figyelmezteti a művelet végrehajtásához, mivel ez az operációs rendszer újraindítását fogja okozhatni.
PS> stop-proc -Name Winlogon
Az alábbi kimenet jelenik meg.
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"): N
Most próbáljuk meg leállítani a WINLOGON folyamatot figyelmeztetés nélkül. Vegye figyelembe, hogy ez a parancsbejegyzés a
Force
paraméter használatával bírálja felül a figyelmeztetést.PS> stop-proc -Name winlogon -Force
Az alábbi kimenet jelenik meg.
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
Lásd még:
Bemeneti adatokat Command-Line paraméterek hozzáadása
Objektumtípusok kiterjesztése és formázása
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: