Przykład StopProcessSample01StopProcessSample01 Sample

Ten przykład pokazuje, jak napisać polecenie cmdlet, które żąda informacji zwrotnych od użytkownika przed podjęciem próby zatrzymania procesu oraz jak zaimplementować PassThru parametr wskazujący, że użytkownik chce, aby zwracał obiekt.This sample shows how to write a cmdlet that requests feedback from the user before it attempts to stop a process, and how to implement a PassThru parameter indicating that the user wants the cmdlet to return an object. To polecenie cmdlet jest podobne do Stop-Process polecenia cmdlet dostarczonego przez program Windows PowerShell 2,0.This cmdlet is similar to the Stop-Process cmdlet provided by Windows PowerShell 2.0.

Jak skompilować przykład za pomocą programu Visual Studio.How to build the sample by using Visual Studio.

  1. Po zainstalowaniu zestawu Windows PowerShell 2,0 SDK przejdź do folderu StopProcessSample01.With the Windows PowerShell 2.0 SDK installed, navigate to the StopProcessSample01 folder. Domyślna lokalizacja to C:\Program Files (x86) \Microsoft SDKs\Windows\v7.0\Samples\sysmgmt\WindowsPowerShell\csharp\StopProcessSample01.The default location is C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0\Samples\sysmgmt\WindowsPowerShell\csharp\StopProcessSample01.

  2. Kliknij dwukrotnie ikonę pliku rozwiązania (. sln).Double-click the icon for the solution (.sln) file. Spowoduje to otwarcie przykładowego projektu w Microsoft Visual Studio.This opens the sample project in Microsoft Visual Studio.

  3. W menu kompilacja wybierz opcję Kompiluj rozwiązanie .In the Build menu, select Build Solution .

    Biblioteka dla przykładu zostanie skompilowana w domyślnych folderach \Bin lub \bin\debug.The library for the sample will be built in the default \bin or \bin\debug folders.

Jak uruchomić przykładHow to run the sample

  1. Utwórz następujący folder modułu:Create the following module folder:

    [user]/documents/windowspowershell/modules/StopProcessSample01

  2. Skopiuj przykładowy zestaw do folderu module.Copy the sample assembly to the module folder.

  3. Uruchom program Windows PowerShell.Start Windows PowerShell.

  4. Uruchom następujące polecenie, aby załadować zestaw do programu Windows PowerShell:Run the following command to load the assembly into Windows PowerShell:

    import-module stopprossessample01

  5. Uruchom następujące polecenie, aby uruchomić polecenie cmdlet:Run the following command to run the cmdlet:

    stop-proc

WymaganiaRequirements

Ten przykład wymaga środowiska Windows PowerShell 2,0.This sample requires Windows PowerShell 2.0.

DemonstracjeDemonstrates

Ten przykład ilustruje następujące kwestie.This sample demonstrates the following.

  • Deklarowanie klasy poleceń cmdlet przy użyciu atrybutu cmdlet.Declaring a cmdlet class by using the Cmdlet attribute.

  • Deklarowanie parametrów polecenia cmdlet przy użyciu atrybutu Parameter.Declaring a cmdlet parameters by using the Parameter attribute.

  • Wywoływanie metody ShouldProcess w celu potwierdzenia żądania.Calling the ShouldProcess method to request confirmation.

  • Implementowanie PassThru parametru, który wskazuje, czy użytkownik chce, aby polecenie cmdlet zwracało obiekt.Implementing a PassThru parameter that indicates if the user wants the cmdlet to return an object. Domyślnie to polecenie cmdlet nie zwraca obiektu do potoku.By default, this cmdlet does not return an object to the pipeline.

PrzykładExample

Ten przykład pokazuje, jak zaimplementować PassThru parametr wskazujący, że użytkownik chce, aby polecenie cmdlet zwracało obiekt, i jak zażądać opinii użytkowników przez wywołania ShouldProcess ShouldContinue metod i.This sample shows how to implement a PassThru parameter that indicates that the user wants the cmdlet to return an object, and how to request user feedback by calls to the ShouldProcess and ShouldContinue methods.

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
}

Zobacz teżSee Also

Pisanie polecenia cmdlet programu Windows PowerShellWriting a Windows PowerShell Cmdlet