Przewodnik Szybki start dotyczący dostawcy programu Windows PowerShell
W tym temacie wyjaśniono, jak utworzyć dostawcę programu Windows PowerShell, który ma podstawowe funkcje tworzenia nowego dysku. Aby uzyskać ogólne informacje o dostawcach, zobacz Omówienie dostawcy programu Windows PowerShell. Aby zapoznać się z przykładami dostawców z bardziej pełną funkcjonalnością, zobacz Provider Samples.
Pisanie podstawowego dostawcy
Najbardziej podstawową funkcją dostawcy programu Windows PowerShell jest tworzenie i usuwanie dysków. W tym przykładzie implementujemy System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* i System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* metod 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 korzystających z tego dostawcy.
Przykłady przedstawione 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 programu Windows PowerShell.
Konfigurowanie projektu
W programie Visual Studio utwórz projekt Biblioteka klas o nazwie AccessDBProviderSample. Wykonaj poniższe kroki, aby skonfigurować projekt tak, aby program Windows PowerShell został uruchomiony, a dostawca zostanie załadowany do sesji podczas kompilowania i uruchamiania projektu.
Konfigurowanie projektu dostawcy
Dodaj zestaw System.Management.Automation jako odwołanie do projektu.
Kliknij pozycję Project > AccessDBProviderSample Properties > Debug. W Start projectkliknij pozycję Start external programi przejdź do pliku wykonywalnego programu Windows PowerShell (zazwyczaj C:\Windows\System32\WindowsPowerShell\v1.0\.powershell.exe).
W obszarze Opcje uruchamianiawprowadź następujące polecenie w polu Argumenty wiersza polecenia:
-NoExit -Command "[Reflection.Assembly]::LoadFrom(AccessDBProviderSample.dll' ) | Import-Module"
Deklarowanie klasy dostawcy
Nasz dostawca pochodzi z klasy System.Management.Automation.Provider.DriveCmdletProvider. Większość dostawców, którzy zapewniają rzeczywiste funkcje (uzyskiwanie dostępu do elementów i manipulowanie nimi, nawigowanie po magazynie danych oraz pobieranie i ustawianie zawartości elementów) pochodzą z klasy System.Management.Automation.Provider.NavigationCmdletProvider.
Oprócz określenia, że klasa pochodzi z System.Management.Automation.Provider.DriveCmdletProvider, należy ozdobić ją 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 programu Windows PowerShell, gdy użytkownik wywołuje Microsoft.PowerShell.Commands.NewPSDriveCommand polecenie cmdlet określające nazwę dostawcy. Parametr PSDriveInfo jest przekazywany przez aparat programu Windows PowerShell, a metoda zwraca nowy dysk do aparatu programu Windows PowerShell. Ta metoda musi być zadeklarowana w klasie utworzonej powyżej.
Metoda najpierw sprawdza, czy zarówno obiekt dysku, jak i katalog główny dysku, który został przekazany, zwraca null
, jeśli którykolwiek 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óry 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 znajduje się wewnętrzna klasa AccessDBPSDriveInfo zawierająca konstruktor używany do utworzenia 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 programu Windows PowerShell, gdy użytkownik wywołuje polecenie cmdlet Microsoft.PowerShell.Commands.RemovePSDriveCommand. Metoda w tym 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;
}