Snelstartgids voor Windows PowerShell-providers

In dit onderwerp wordt uitgelegd hoe u een Windows PowerShell provider met basisfunctionaliteit voor het maken van een nieuw station. Zie overzicht van Windows PowerShell provider voor algemene informatie over providers. Zie Provider samples (Voorbeelden van providers) voor voorbeelden van providers met een volledigere functionaliteit.

Een basisprovider schrijven

De meest eenvoudige functionaliteit van een Windows PowerShell provider is het maken en verwijderen van stations. In dit voorbeeld implementeren we de methoden System.Management.Automation.Provider.Drivecmdletprovider.Newdrive* en System.Management.Automation.Provider.Drivecmdletprovider.Removedrive* van de klasse System.Management.Automation.Provider.Drivecmdletprovider. U ziet ook hoe u een providerklasse declareer.

Wanneer u een provider schrijft, kunt u standaardstations opgeven die automatisch worden gemaakt wanneer de provider beschikbaar is. U definieert ook een methode voor het maken van nieuwe stations die gebruikmaken van die provider.

De voorbeelden in dit onderwerp zijn gebaseerd op het AccessDBProviderSample02-voorbeeld, dat deel uitmaakt van een groter voorbeeld dat een Access-database als een Windows PowerShell vertegenwoordigt.

Het project instellen

Maak Visual Studio een klassebibliotheekproject met de naam AccessDBProviderSample. Voltooi de volgende stappen om uw project zo te configureren dat Windows PowerShell start en de provider in de sessie wordt geladen wanneer u uw project bouwt en start.

Het providerproject configureren
  1. Voeg de assembly System.Management.Automation toe als een verwijzing naar uw project.

  2. Klik Project > AccessDBProviderSample-eigenschappen om > fouten op te sporen. Klik in Project starten op Extern programma starten en navigeer naar het uitvoerbare Windows PowerShell (meestal c:\Windows\System32\WindowsPowerShell\v1.0 \ .powershell.exe).

  3. Voer onder Startopties het volgende in het vak Opdrachtregelargumenten in: -noexit -command "[reflection.assembly]::loadFrom(AccessDBProviderSample.dll' ) | import-module"

De providerklasse declareren

Onze provider is afgeleid van de klasse System.Management.Automation.Provider.Drivecmdletprovider. De meeste providers die echte functionaliteit bieden (het openen en bewerken van items, het navigeren door het gegevensopslag en het verkrijgen en instellen van inhoud van items) zijn afgeleid van de klasse System.Management.Automation.Provider.Navigationcmdletprovider.

Naast het opgeven dat de klasse is afgeleid van System.Management.Automation.Provider.Drivecmdletprovider,moet u deze inrichten met de System.Management.Automation.Provider.Cmdletproviderattribute, zoals weergegeven in het voorbeeld.

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
  {

}
}

NewDrive implementeren

De methode System.Management.Automation.Provider.Drivecmdletprovider.Newdrive* wordt aangeroepen door de Windows PowerShell-engine wanneer een gebruiker de cmdlet Microsoft.PowerShell.Commands.NewPSDriveCommand aanroept en de naam van uw provider opgeeft. De parameter PSDriveInfo wordt doorgegeven door de Windows PowerShell engine en de methode retourneert het nieuwe station naar de Windows PowerShell engine. Deze methode moet worden gedeclareerd in de klasse die hierboven is gemaakt.

De methode controleert eerst of zowel het object station en de hoofdmap van het station die zijn doorgegeven bestaan, retourneren als een null van beide niet. Vervolgens wordt een constructor van de interne klasse AccessDBPSDriveInfo gebruikt om een nieuw station te maken en een verbinding met de Access-database die het station vertegenwoordigt.

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

Hier volgt de interne klasse AccessDBPSDriveInfo die de constructor bevat die wordt gebruikt om een nieuw station te maken en de statusinformatie voor het station bevat.

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

RemoveDrive implementeren

De methode System.Management.Automation.Provider.Drivecmdletprovider.Removedrive* wordt aangeroepen door de Windows PowerShell-engine wanneer een gebruiker de cmdlet Microsoft.PowerShell.Commands.RemovePSDriveCommand aanroept. Met de methode in deze provider wordt de verbinding met de Access-database gesloten.

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