Snabbstart för Windows PowerShell-providers

Det här avsnittet beskriver hur du skapar en Windows PowerShell-provider som har grundläggande funktioner för att skapa en ny enhet. Allmän information om leverantörer finns i Windows PowerShell provideröversikt. Exempel på leverantörer med mer fullständig funktionalitet finns i Providerexempel.

Skriva en grundläggande provider

De mest grundläggande funktionerna hos en Windows PowerShell är att skapa och ta bort enheter. I det här exemplet implementerar vi metoderna System.Management.Automation.Provider.Drivecmdletprovider.Newdrive* och System.Management.Automation.Provider.Drivecmdletprovider.Removedrive* i klassen System.Management.Automation.Provider.Drivecmdletprovider. Du får också se hur du deklarerar en providerklass.

När du skriver en provider kan du ange standardenheter som skapas automatiskt när providern är tillgänglig. Du definierar också en metod för att skapa nya enheter som använder den providern.

Exemplen i det här avsnittet baseras på accessDBProviderSample02-exemplet, som är en del av ett större exempel som representerar en Access-databas som Windows PowerShell enhet.

Konfigurera projektet

I Visual Studio du ett klassbiblioteksprojekt med namnet AccessDBProviderSample. Utför följande steg för att konfigurera projektet så Windows PowerShell startar och providern läses in i sessionen när du skapar och startar projektet.

Konfigurera providerprojektet
  1. Lägg till sammansättningen System.Management.Automation som en referens till projektet.

  2. Klicka Project > AccessDBProviderSample-> Felsök. I Starta projekt klickar du på Starta externt program och navigerar till den körbara Windows PowerShell-filen (vanligtvis c:\Windows\System32\WindowsPowerShell\v1.0 \ .powershell.exe).

  3. Under Startalternativ anger du följande i rutan Kommandoradsargument:-noexit -command "[reflection.assembly]::loadFrom(AccessDBProviderSample.dll' ) | import-module"

Deklarera providerklassen

Vår leverantör härleds från klassen System.Management.Automation.Provider.Drivecmdletprovider. De flesta leverantörer som tillhandahåller verkliga funktioner (åtkomst till och manipulering av objekt, navigering i datalagret och hämta och ange innehåll för objekt) härleds från klassen System.Management.Automation.Provider.Navigationcmdletprovider.

Förutom att ange att klassen härleds från System.Management.Automation.Provider.Drivecmdletprovidermåste du använda system.Management.Automation.Provider.Cmdletproviderattribute som i exemplet.

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
  {

}
}

Implementera NewDrive

Metoden System.Management.Automation.Provider.Drivecmdletprovider.Newdrive* anropas av Windows PowerShell-motorn när en användare anropar cmdleten Microsoft.PowerShell.Commands.NewPSDriveCommand och anger namnet på din provider. Parametern PSDriveInfo skickas av Windows PowerShell motorn och metoden returnerar den nya enheten till Windows PowerShell motorn. Den här metoden måste deklareras i klassen som skapades ovan.

Metoden kontrollerar först att både enhetsobjektet och enhetsroten som skickades finns och returnerar om null någon av dem inte gör det. Den använder sedan en konstruktor för den interna klassen AccessDBPSDriveInfo för att skapa en ny enhet och en anslutning till Access-databasen som enheten representerar.

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;
    }

Följande är den interna klassen AccessDBPSDriveInfo som innehåller konstruktorn som används för att skapa en ny enhet och som innehåller tillståndsinformation för enheten.

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; }
    }
  }

Implementera RemoveDrive

Metoden System.Management.Automation.Provider.Drivecmdletprovider.Removedrive* anropas av Windows PowerShell-motorn när en användare anropar cmdleten Microsoft.PowerShell.Commands.RemovePSDriveCommand. Metoden i den här providern stänger anslutningen till Access-databasen.

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;
    }