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


Rövid útmutató a Windows PowerShell-szolgáltatóhoz

Ez a témakör azt ismerteti, hogyan hozhat létre olyan Windows PowerShell-szolgáltatót, amely alapvető funkciókkal rendelkezik az új meghajtók létrehozásához. A szolgáltatókkal kapcsolatos általános információkért lásd Windows PowerShell-szolgáltató áttekintése. A teljesebb funkcionalitású szolgáltatókra vonatkozó példákért tekintse meg Szolgáltatói mintákcímű témakört.

Alapszintű szolgáltató írása

A Windows PowerShell-szolgáltató legalapvetőbb funkciója a meghajtók létrehozása és eltávolítása. Ebben a példában implementáljuk a System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* és System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* metódusokat a System.Management.Automation.Provider.DriveCmdletProvider osztályhoz. Azt is látni fogja, hogyan deklarálhat egy szolgáltatói osztályt.

Szolgáltató írásakor megadhatja azokat az alapértelmezett meghajtókat, amelyek automatikusan jönnek létre, amikor a szolgáltató elérhető. A szolgáltatót használó új meghajtók létrehozására is meghatároz egy metódust.

A jelen témakörben ismertetett példák az AccessDBProviderSample02 mintán alapulnak, amely egy nagyobb minta része, amely egy Access-adatbázist jelöl Windows PowerShell-meghajtóként.

A projekt beállítása

A Visual Studióban hozzon létre egy AccessDBProviderSample nevű osztálytár-projektet. Hajtsa végre a következő lépéseket a projekt konfigurálásához, hogy a Windows PowerShell elinduljon, és a szolgáltató betöltve legyen a munkamenetbe a projekt létrehozásakor és indításakor.

A szolgáltatói projekt konfigurálása
  1. Adja hozzá a System.Management.Automation szerelvényt a projekt hivatkozásaként.

  2. Kattintson Project > AccessDBProviderSample properties > Debugelemre. A Projekt indításaterületen kattintson a Külső program indításaelemre, és keresse meg a Végrehajtható Windows PowerShellt (általában C:\Windows\System32\WindowsPowerShell\v1.0\.powershell.exe).

  3. Az Indítási beállításokcsoportban írja be a következőket a Parancssor argumentumai mezőbe: -NoExit -Command "[Reflection.Assembly]::LoadFrom(AccessDBProviderSample.dll' ) | Import-Module"

A szolgáltatói osztály deklarálása

Szolgáltatónk a System.Management.Automation.Provider.DriveCmdletProvider osztályból származik. A valós funkciókat biztosító szolgáltatók többsége (az elemek elérése és módosítása, az adattár navigálása, valamint az elemek tartalmának lekérése és beállítása) a System.Management.Automation.Provider.NavigationCmdletProvider osztályból származik.

Amellett, hogy megadja, hogy az osztály a System.Management.Automation.Provider.DriveCmdletProvider származik-e, a System.Management.Automation.Provider.CmdletProviderAttribute kell díszítenie a példában látható módon.

namespace Microsoft.Samples.PowerShell.Providers
{
  using System;
  using System.Data;
  using System.Data.Odbc;
  using System.IO;
  using System.Management.Automation;
  using System.Management.Automation.Provider;

  #region AccessDBProvider

  [CmdletProvider("AccessDB", ProviderCapabilities.None)]
  public class AccessDBProvider : DriveCmdletProvider
  {

}
}

A NewDrive implementálása

A System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* metódust a Windows PowerShell-motor hívja meg, amikor egy felhasználó meghívja a Microsoft.PowerShell.Commands.NewPSDriveCommand a szolgáltató nevét megadó parancsmagot. A PSDriveInfo paramétert a Windows PowerShell-motor adja át, és a metódus visszaadja az új meghajtót a Windows PowerShell-motornak. Ezt a metódust a fent létrehozott osztályon belül kell deklarálni.

A metódus először ellenőrzi, hogy a meghajtóobjektum és a meghajtógyökér is létezik-e, és null, ha egyik sem. Ezután az AccessDBPSDriveInfo belső osztályának konstruktorával hoz létre egy új meghajtót és egy kapcsolatot a meghajtó által képviselt Access-adatbázissal.

protected override PSDriveInfo NewDrive(PSDriveInfo drive)
    {
      // Check if the drive object is null.
      if (drive == null)
      {
        WriteError(new ErrorRecord(
                   new ArgumentNullException("drive"),
                   "NullDrive",
                   ErrorCategory.InvalidArgument,
                   null));

        return null;
      }

      // Check if the drive root is not null or empty
      // and if it is an existing file.
      if (String.IsNullOrEmpty(drive.Root) || (File.Exists(drive.Root) == false))
      {
        WriteError(new ErrorRecord(
                   new ArgumentException("drive.Root"),
                   "NoRoot",
                   ErrorCategory.InvalidArgument,
                   drive));

        return null;
      }

      // Create a new drive and create an ODBC connection to the new drive.
      AccessDBPSDriveInfo accessDBPSDriveInfo = new AccessDBPSDriveInfo(drive);
      OdbcConnectionStringBuilder builder = new OdbcConnectionStringBuilder();

      builder.Driver = "Microsoft Access Driver (*.mdb)";
      builder.Add("DBQ", drive.Root);

      OdbcConnection conn = new OdbcConnection(builder.ConnectionString);
      conn.Open();
      accessDBPSDriveInfo.Connection = conn;

      return accessDBPSDriveInfo;
    }

A következő az AccessDBPSDriveInfo belső osztálya, amely tartalmazza az új meghajtó létrehozásához használt konstruktort, és tartalmazza a meghajtó állapotadatait.

internal class AccessDBPSDriveInfo : PSDriveInfo
  {
    /// <summary>
    /// A reference to the connection to the database.
    /// </summary>
    private OdbcConnection connection;

    /// <summary>
    /// Initializes a new instance of the AccessDBPSDriveInfo class.
    /// The constructor takes a single argument.
    /// </summary>
    /// <param name="driveInfo">Drive defined by this provider</param>
    public AccessDBPSDriveInfo(PSDriveInfo driveInfo)
           : base(driveInfo)
    {
    }

    /// <summary>
    /// Gets or sets the ODBC connection information.
    /// </summary>
    public OdbcConnection Connection
    {
        get { return this.connection; }
        set { this.connection = value; }
    }
  }

A RemoveDrive implementálása

A System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* metódust a Windows PowerShell-motor hívja meg, amikor egy felhasználó meghívja a Microsoft.PowerShell.Commands.RemovePSDriveCommand parancsmagot. A szolgáltató metódusa bezárja a kapcsolatot az Access-adatbázissal.

protected override PSDriveInfo RemoveDrive(PSDriveInfo drive)
    {
      // Check if drive object is null.
      if (drive == null)
      {
        WriteError(new ErrorRecord(
                   new ArgumentNullException("drive"),
                   "NullDrive",
                   ErrorCategory.InvalidArgument,
                   drive));

        return null;
      }

      // Close the ODBC connection to the drive.
      AccessDBPSDriveInfo accessDBPSDriveInfo = drive as AccessDBPSDriveInfo;

      if (accessDBPSDriveInfo == null)
      {
         return null;
      }

      accessDBPSDriveInfo.Connection.Close();

      return accessDBPSDriveInfo;
    }