Przykład StopProcessSample01

W tym przykładzie pokazano, jak napisać polecenie cmdlet, które żąda opinii od użytkownika przed podjęciem próby zatrzymania procesu, oraz jak zaimplementować parametr wskazujący, że użytkownik chce, aby polecenie cmdlet zwróciło PassThru obiekt. To polecenie cmdlet jest podobne do Stop-Process polecenia cmdlet dostarczonego przez program Windows PowerShell 2.0.

Jak skompilować przykład przy użyciu Visual Studio.

  1. Po zainstalowaniu Windows PowerShell 2.0 SDK przejdź do folderu StopProcessSample01. Domyślna lokalizacja to C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0\Samples\sysmgmt\WindowsPowerShell\csharp\StopProcessSample01.

  2. Kliknij dwukrotnie ikonę pliku rozwiązania (sln). Spowoduje to otwarcie przykładowego projektu w Microsoft Visual Studio.

  3. W menu Kompilacja wybierz pozycję Build Solution (Skompilowanie rozwiązania).

    Biblioteka przykładu zostanie s zbudowana w domyślnych folderach \bin lub \bin\debug.

Jak uruchomić przykład

  1. Utwórz następujący folder modułu:

    [user]/documents/windowspowershell/modules/StopProcessSample01

  2. Skopiuj przykładowy zestaw do folderu modułu.

  3. Uruchom program Windows PowerShell.

  4. Uruchom następujące polecenie, aby załadować zestaw do Windows PowerShell:

    import-module stopprossessample01

  5. Uruchom następujące polecenie, aby uruchomić polecenie cmdlet:

    stop-proc

Wymagania

Ten przykład wymaga Windows PowerShell 2.0.

Demonstracje

W tym przykładzie przedstawiono następujące informacje.

  • Deklarowanie klasy polecenia cmdlet przy użyciu atrybutu polecenia cmdlet .

  • Deklarowanie parametrów polecenia cmdlet przy użyciu atrybutu Parameter.

  • Wywołanie metody ShouldProcess w celu zażądania potwierdzenia.

  • Implementowanie PassThru parametru, który wskazuje, czy użytkownik chce, aby polecenie cmdlet zwracało obiekt . Domyślnie to polecenie cmdlet nie zwraca obiektu do potoku.

Przykład

W tym przykładzie pokazano, jak zaimplementować parametr, który wskazuje, że użytkownik chce, aby polecenie cmdlet zwracało obiekt, oraz jak żądać opinii użytkowników za pomocą wywołań metod PassThru ShouldProcess i 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
}

Zobacz też

Pisanie polecenia cmdlet programu Windows PowerShell