Voorbeeld StopProcessSample01

In dit voorbeeld ziet u hoe u een cmdlet schrijft die feedback van de gebruiker aanvraagt voordat een proces wordt gestopt en hoe u een parameter implementeert die aangeeft dat de gebruiker wil dat de PassThru cmdlet een -object retourneert. Deze cmdlet is vergelijkbaar met de Stop-Process cmdlet van Windows PowerShell 2.0.

Het voorbeeld bouwen met behulp van Visual Studio.

  1. Als de Windows PowerShell 2.0 SDK is geïnstalleerd, gaat u naar de map StopProcessSample01. De standaardlocatie is C:\Program Files (x86)\Microsoft SDK's\Windows\v7.0\Samples\sysmgmt\WindowsPowerShell\csharp\StopProcessSample01.

  2. Dubbelklik op het pictogram voor het oplossingsbestand (.sln). Hiermee opent u het voorbeeldproject in Microsoft Visual Studio.

  3. Selecteer In het menu Bouwen de optie Oplossing bouwen.

    De bibliotheek voor het voorbeeld wordt gebouwd in de standaardmappen \bin of \bin\debug.

Het voorbeeld uitvoeren

  1. Maak de volgende modulemap:

    [user]/documents/windowspowershell/modules/StopProcessSample01

  2. Kopieer de voorbeeldassemblage naar de modulemap.

  3. Start Windows PowerShell.

  4. Voer de volgende opdracht uit om de assembly in de volgende Windows PowerShell:

    import-module stopprossessample01

  5. Voer de volgende opdracht uit om de cmdlet uit te voeren:

    stop-proc

Vereisten

Voor dit voorbeeld is Windows PowerShell 2.0 vereist.

Demonstreert

In dit voorbeeld wordt het volgende gedemonstreerd.

  • Het declareren van een cmdlet-klasse met behulp van het kenmerk Cmdlet.

  • Het declareren van een cmdlet-parameters met behulp van het kenmerk Parameter.

  • De ShouldProcess-methode aanroepen om bevestiging aan te vragen.

  • Het implementeren van PassThru een parameter die aangeeft of de gebruiker wil dat de cmdlet een -object retourneert. Deze cmdlet retourneerde standaard geen -object naar de pijplijn.

Voorbeeld

In dit voorbeeld ziet u hoe u een parameter implementeert die aangeeft dat de gebruiker wil dat de cmdlet een object retourneert en hoe feedback van gebruikers wordt gevraagd door aanroepen naar de methoden PassThru ShouldProcess en ShouldContinue .

using System;
using System.Diagnostics;
using System.Collections;
using Win32Exception = System.ComponentModel.Win32Exception;
using System.Management.Automation;    // Windows PowerShell namespace
using System.Globalization;

namespace Microsoft.Samples.PowerShell.Commands
{
   #region StopProcCommand

    /// <summary>
   /// This class implements the stop-proc cmdlet.
   /// </summary>
   [Cmdlet(VerbsLifecycle.Stop, "Proc",
       SupportsShouldProcess = true)]
   public class StopProcCommand : Cmdlet
   {
       #region Parameters

      /// <summary>
      /// This parameter provides the list of process names on
      /// which the Stop-Proc cmdlet will work.
      /// </summary>
       [Parameter(
          Position = 0,
          Mandatory = true,
          ValueFromPipeline = true,
          ValueFromPipelineByPropertyName = true
       )]
       public string[] Name
       {
           get { return processNames; }
           set { processNames = value; }
       }
       private string[] processNames;

       /// <summary>
       /// This parameter overrides the ShouldContinue call to force
       /// the cmdlet to stop its operation. This parameter should always
       /// be used with caution.
       /// </summary>
       [Parameter]
       public SwitchParameter Force
       {
           get { return force; }
           set { force = value; }
       }
       private bool force;

       /// <summary>
       /// This parameter indicates that the cmdlet should return
       /// an object to the pipeline after the processing has been
       /// completed.
       /// </summary>
       [Parameter]
       public SwitchParameter PassThru
       {
           get { return passThru; }
           set { passThru = value; }
       }
       private bool passThru;

       #endregion Parameters

       #region Cmdlet Overrides

       /// <summary>
       /// The ProcessRecord method does the following for each of the
       /// requested process names:
       /// 1) Check that the process is not a critical process.
       /// 2) Attempt to stop that process.
       /// If no process is requested then nothing occurs.
       /// </summary>
       protected override void ProcessRecord()
       {
           foreach (string name in processNames)
           {
               // For every process name passed to the cmdlet, get the associated
               // processes.
               // Write a nonterminating error for failure to retrieve
               // a process.
               Process[] processes;

               try
               {
                   processes = Process.GetProcessesByName(name);
               }
               catch (InvalidOperationException ioe)
               {
                   WriteError(new ErrorRecord(ioe,"UnableToAccessProcessByName",
                       ErrorCategory.InvalidOperation, name));

                   continue;
               }

               // Try to stop the processes that have been retrieved.
               foreach (Process process in processes)
               {
                   string processName;

                   try
                   {
                       processName = process.ProcessName;
                   }
                   catch (Win32Exception e)
                   {
                      WriteError(new ErrorRecord(e, "ProcessNameNotFound",
                                           ErrorCategory.ReadError, process));
                      continue;
                   }

                   // Confirm the operation with the user first.
                   // This is always false if the WhatIf parameter is set.
                   if (!ShouldProcess(string.Format(CultureInfo.CurrentCulture,"{0} ({1})", processName,
                               process.Id)))
                   {
                       continue;
                   }

                   // Make sure that the user really wants to stop a critical
                   // process that could possibly stop the computer.
                   bool criticalProcess =
                       criticalProcessNames.Contains(processName.ToLower(CultureInfo.CurrentCulture));

                   if (criticalProcess &&!force)
                   {
                       string message = String.Format
                           (CultureInfo.CurrentCulture,
                                "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 the ProcessRecord method is called
                       // multiple times when objects are received as inputs from
                       // the pipeline. So to retain YesToAll and NoToAll input that
                       // the user may enter across multiple calls to this function,
                       // they are 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 nonterminating error.
                           WriteError(new ErrorRecord(e, "CouldNotStopProcess",
                                           ErrorCategory.CloseError, process));
                           continue;
                       } // if ((e is...
                       else throw;
                   } // catch

                   // If the PassThru parameter is
                   // specified, return the terminated process.
                   if (passThru)
                   {
                       WriteObject(process);
                   }
               } // foreach (Process...
           } // foreach (string...
       } // ProcessRecord

       #endregion Cmdlet Overrides

       #region Private Data

       private bool yesToAll, noToAll;

       /// <summary>
       /// Partial list of critical processes that should not be
       /// stopped.  Lower case is used for case insensitive matching.
       /// </summary>
       private ArrayList criticalProcessNames = new ArrayList(
          new string[] { "system", "winlogon", "spoolsv" }
       );

       #endregion Private Data

   } // StopProcCommand

   #endregion StopProcCommand
}

Zie ook

Een Windows PowerShell-cmdlet schrijven