Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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
Přidejte sestavení System.Management.Automation jako odkaz na projekt.
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).
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;
}