Megosztás a következőn keresztül:


A rendszert módosító parancsmag létrehozása

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.

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 Name paramétert, a parancsmag lekérdezi a paramétert.

    PS> Stop-Proc
    

    Megjelenik 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 notepad
    

    Megjelenik 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"): Y
    
  • A "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 Winlogon
    

    Megjelenik 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"): N
    
  • Most próbáljuk meg figyelmeztetés nélkül leállítani a WINLOGON-folyamatot. Vegye figyelembe, hogy ez a parancsbejegyzés a Force paramétert használja a figyelmeztetés felülbírálásához.

    PS> Stop-Proc -Name winlogon -Force
    

    Megjelenik 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
    

Lásd még