Dela via


Snabbstart för Windows PowerShell-provider

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 Översikt över Windows PowerShell-providern. Exempel på leverantörer med mer fullständiga funktioner finns i Providerexempel.

Skriva en grundläggande provider

Den mest grundläggande funktionen hos en Windows PowerShell-provider är att skapa och ta bort enheter. I det här exemplet implementerar vi System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* och System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* metoder för System.Management.Automation.Provider.DriveCmdletProvider klass. Du ser också 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 providern.

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

Konfigurera projektet

I Visual Studio skapar du ett klassbiblioteksprojekt med namnet AccessDBProviderSample. Utför följande steg för att konfigurera projektet så att Windows PowerShell startas 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 på Project > AccessDBProviderSample Properties > Debug. I Starta projektklickar du på Starta externt programoch navigerar till den körbara Windows PowerShell-filen (vanligtvis C:\Windows\System32\WindowsPowerShell\v1.0\.powershell.exe).

  3. Under Startalternativanger 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 manipulerar objekt, navigerar i datalagret och hämtar och anger innehåll för objekt) kommer från klassen System.Management.Automation.Provider.NavigationCmdletProv ider.

Förutom att ange att klassen härleds från System.Management.Automation.Provider.DriveCmdletProvidermåste du dekorera den med System.Management.Automation.Provider.CmdletProviderAttribute enligt 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 Microsoft.PowerShell.Commands.NewPSDriveCommand cmdlet som anger namnet på providern. PSDriveInfo-parametern skickas av Windows PowerShell-motorn och metoden returnerar den nya enheten till Windows PowerShell-motorn. Den här metoden måste deklareras i den klass som skapades ovan.

Metoden kontrollerar först att både enhetsobjektet och enhetsroten som skickades finns och returnerar null om någon av dem inte gör det. Den använder sedan en konstruktor av 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åndsinformationen 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 Microsoft.PowerShell.Commands.RemovePSDriveCommand cmdlet. 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;
    }