AccessDBProviderSample02
This sample shows how to overwrite the NewDrive and RemoveDrive methods to support calls to the New-PSDrive and Remove-PSDrive cmdlets. The provider class in this sample derives from the DriveCmdletProvider class.
Demonstrates
Important |
|---|
Your provider class will most likely derive from one of the following classes and possibly implement other provider interfaces:
For more information about choosing which provider class to derive from based on provider features, see Designing Your Windows PowerShell Provider. |
This sample demonstrates the following:
Declaring the CmdletProvider attribute.
Defining a provider class that drives from the DriveCmdletProvider class.
Overwriting the NewDrive method to support creating new drives. (This sample does not show how to add dynamic parameters to the New-PSDrive cmdlet.)
Overwriting the RemoveDrive method to support removing existing drives.
Example
This sample shows how to overwrite the NewDrive and RemoveDrive methods. For this sample provider, when a drive is created its connection information is stored in an AccessDBPsDriveInfo object.
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 /// <summary> /// This sample implements a Windows PowerShell provider class /// that acts upon an Access database. /// </summary> /// <remarks> /// This example demonstrates only the drive overrides used to /// add and remove drives from the database.</remarks> [CmdletProvider("AccessDB", ProviderCapabilities.None)] public class AccessDBProvider : DriveCmdletProvider { #region Drive Manipulation /// <summary> /// The Windows PowerShell engine calls this method when the /// New-PSDrive cmdlet is run and the path to this provider is /// specified. This method creates a connection to the database /// file and sets the Connection property of the PSDriveInfo object. /// </summary> /// <param name="drive"> /// Information describing the drive to create. /// </param> /// <returns>An accessDBPSDriveInfo object that represents /// the new drive.</returns> 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; } // End NewDrive. /// <summary> /// The Windows PowerShell engine calls this method when the /// Remove-PSDrive cmdlet is run and the path to this provider is /// specified. This method closes the ODBC connection of the drive. /// </summary> /// <param name="drive">The drive to remove.</param> /// <returns>An accessDBPSDriveInfo object that represents /// the removed drive.</returns> 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; } // End RemoveDrive. #endregion Drive Manipulation } // End AccessDBProvider class. #endregion AccessDBProvider #region AccessDBPSDriveInfo /// <summary> /// Any state associated with the drive is held here. In this /// case, the state information is the connection to the database. /// </summary> 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; } } } // End AccessDBPSDriveInfo class. #endregion AccessDBPSDriveInfo }
