Sdílet prostřednictvím


Rychlý start zprostředkovatele Windows PowerShellu

Toto téma vysvětluje, jak vytvořit zprostředkovatele Windows PowerShellu, který má základní funkce vytvoření nové jednotky. Obecné informace o poskytovateli naleznete v tématu Přehled zprostředkovatele Prostředí Windows PowerShell. Příklady poskytovatelů s ucelenějšími funkcemi najdete v tématu Ukázky poskytovatelů.

Zápis základního zprostředkovatele

Nejzásadnější funkcí poskytovatele Windows PowerShellu je vytvoření a odebrání jednotek. V tomto příkladu implementujeme System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* a System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* metody System.Management.Provider.DriveCmdletProvider třídy. Také se dozvíte, jak deklarovat třídu zprostředkovatele.

Při zápisu zprostředkovatele můžete určit výchozí jednotky, které se vytvoří automaticky, když je poskytovatel k dispozici. Definujete také metodu pro vytvoření nových jednotek, které používají daného poskytovatele.

Příklady uvedené v tomto tématu jsou založené na ukázce AccessDBProviderSample02, která je součástí větší ukázky představující accessovou databázi jako jednotku Windows PowerShellu.

Nastavení projektu

V sadě Visual Studio vytvořte projekt knihovny tříd s názvem AccessDBProviderSample. Provedením následujících kroků nakonfigurujte projekt tak, aby se spustil Windows PowerShell a poskytovatel se načte do relace při sestavování a spuštění projektu.

Konfigurace projektu zprostředkovatele
  1. Přidejte sestavení System.Management.Automation jako odkaz na projekt.

  2. Klepněte na tlačítko Project > AccessDBProviderSample Vlastnosti > Ladění. V Spustit projektklikněte na Spustit externí programa přejděte do spustitelného souboru Windows PowerShellu (obvykle C:\Windows\System32\WindowsPowerShell\v1.0\.powershell.exe).

  3. V části Možnosti spuštěnízadejte do argumentů příkazového řádku následující pole: -NoExit -Command "[Reflection.Assembly]::LoadFrom(AccessDBProviderSample.dll' ) | Import-Module"

Deklarace třídy zprostředkovatele

Náš poskytovatel pochází z System.Management.Automation.Provider.DriveCmdletProvider třídy. Většina poskytovatelů, kteří poskytují skutečné funkce (přístup k položkám a manipulaci s nimi, navigace v úložišti dat a získávání a nastavení obsahu položek) jsou odvozeny od System.Management.Automation.Provider.NavigationCmdletProvider třídy.

Kromě určení, že třída je odvozena z System.Management.Automation.Provider.DriveCmdletProvider, musíte jej ozdobit pomocí System.Management.Automation.Provider.CmdletProviderAttribute, jak je znázorněno v příkladu.

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
  {

}
}

Implementace NewDrivu

Metoda System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* volá modul Windows PowerShellu, když uživatel volá Microsoft.PowerShell.Commands.NewPSDriveCommand rutinu určující název vašeho poskytovatele. Parametr PSDriveInfo předá modul Windows PowerShellu a metoda vrátí novou jednotku modulu Windows PowerShellu. Tato metoda musí být deklarována v rámci třídy vytvořené výše.

Metoda nejprve zkontroluje, zda existují objekt jednotky i kořen jednotky, které byly předány, vrací null pokud některý z nich není. Potom pomocí konstruktoru interní třídy AccessDBPSDriveInfo vytvoří novou jednotku a připojení k databázi Accessu, která jednotka představuje.

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

Následuje interní třída AccessDBPSDriveInfo, která obsahuje konstruktor použitý k vytvoření nové jednotky a obsahuje informace o stavu jednotky.

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

Implementace RemoveDrivu

Metoda System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* volá modul Windows PowerShellu, když uživatel volá Microsoft.PowerShell.Commands.RemovePSDriveCommand rutiny. Metoda v tomto poskytovateli zavře připojení k databázi Accessu.

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