Przewodnik Szybki start dotyczący dostawcy programu Windows PowerShell

W tym temacie opisano sposób tworzenia dostawcy Windows PowerShell, który ma podstawowe funkcje tworzenia nowego dysku. Aby uzyskać ogólne informacje o dostawcach, zobacz Windows PowerShell Provider Overview (Omówienie dostawcy). Aby uzyskać przykłady dostawców z pełniejszą funkcjonalnością, zobacz Przykłady dostawców.

Pisanie podstawowego dostawcy

Najbardziej podstawową funkcjonalnością dostawcy Windows PowerShell jest tworzenie i usuwanie dysków. W tym przykładzie implementowane są metody System.Management.Automation.Provider.Drivecmdletprovider.Newdrive* i System.Management.Automation.Provider.Drivecmdletprovider.Removedrive* klasy System.Management.Automation.Provider.Drivecmdletprovider. Zobaczysz również, jak zadeklarować klasę dostawcy.

Podczas pisania dostawcy można określić domyślne dyski, które są tworzone automatycznie, gdy dostawca jest dostępny. Należy również zdefiniować metodę tworzenia nowych dysków, które korzystają z tego dostawcy.

Przykłady podane w tym temacie są oparte na przykładzie AccessDBProviderSample02, który jest częścią większego przykładu reprezentującego bazę danych programu Access jako dysk Windows PowerShell danych.

Konfigurowanie projektu

W Visual Studio projektu biblioteki klas o nazwie AccessDBProviderSample. Wykonaj poniższe kroki, aby skonfigurować projekt tak, aby Windows PowerShell, a dostawca zostanie załadowany do sesji podczas kompilowania i uruchamiania projektu.

Konfigurowanie projektu dostawcy
  1. Dodaj zestaw System.Management.Automation jako odwołanie do projektu.

  2. Kliknij Project > AccessDBProviderWłasne > debugowania. W projekcie startowym kliknij pozycję Uruchom program zewnętrzny i przejdź do pliku wykonywalnego programu Windows PowerShell (zazwyczaj c:\Windows\System32\WindowsPowerShell\v1.0 \ .powershell.exe).

  3. W obszarze Opcje uruchamiania wprowadź następujące informacje w polu Argumenty wiersza polecenia: -noexit -command "[reflection.assembly]::loadFrom(AccessDBProviderSample.dll' ) | import-module"

Deklarowanie klasy dostawcy

Nasz dostawca pochodzi od klasy System.Management.Automation.Provider.Drivecmdletprovider. Większość dostawców, którzy zapewniają rzeczywiste funkcje (dostęp do elementów i manipulowanie nimi, nawigowanie po magazynie danych oraz pobieranie i ustawianie zawartości elementów) pochodzi z klasy System.Management.Automation.Provider.Navigationcmdletprovider.

Oprócz określenia, że klasa pochodzi od klasy System.Management.Automation.Provider.Drivecmdletprovider,należy udekorować ją za pomocą klasy System.Management.Automation.Provider.Cmdletproviderattribute, jak pokazano w przykładzie.

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
  {

}
}

Implementowanie usługi NewDrive

Metoda System.Management.Automation.Provider.Drivecmdletprovider.Newdrive* jest wywoływana przez aparat Windows PowerShell, gdy użytkownik wywołuje polecenie cmdlet Microsoft.PowerShell.Commands.NewPSDriveCommand, określając nazwę dostawcy. Parametr PSDriveInfo jest przekazywany przez aparat Windows PowerShell, a metoda zwraca nowy dysk do Windows PowerShell aparatu. Ta metoda musi być zadeklarowana w klasie utworzonej powyżej.

Metoda najpierw sprawdza, czy istnieje zarówno obiekt dysku, jak i główny katalog główny dysku, który został przekazany, i zwraca, jeśli którykolwiek null z nich nie. Następnie używa konstruktora klasy wewnętrznej AccessDBPSDriveInfo do utworzenia nowego dysku i połączenia z bazą danych programu Access, która reprezentuje dysk.

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

Poniżej przedstawiono wewnętrzną klasę AccessDBPSDriveInfo, która zawiera konstruktor używany do tworzenia nowego dysku i zawiera informacje o stanie dysku.

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

Implementowanie usługi RemoveDrive

Metoda System.Management.Automation.Provider.Drivecmdletprovider.Removedrive* jest wywoływana przez aparat Windows PowerShell, gdy użytkownik wywołuje polecenie cmdlet Microsoft.PowerShell.Commands.RemovePSDriveCommand. Metoda tego dostawcy zamyka połączenie z bazą danych programu Access.

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