Tìm kiếm trang web

Bắt đầu nhanh nhà cung cấp Windows PowerShell


Chủ đề này giải thích cách tạo nhà cung cấp Windows PowerShell có chức năng cơ bản là tạo ổ đĩa mới. Để biết thông tin chung về nhà cung cấp, hãy xem Tổng quan về nhà cung cấp Windows PowerShell. Để biết ví dụ về các nhà cung cấp có chức năng hoàn chỉnh hơn, hãy xem Mẫu nhà cung cấp.

Viết một nhà cung cấp cơ bản

Chức năng cơ bản nhất của nhà cung cấp Windows PowerShell là tạo và xóa ổ đĩa. Trong ví dụ này, chúng tôi triển khai các phương thức System.Manager.Automation.Provider.Drivecmdletprovider.Newdrive* và System.Man Management.Automation.Provider.Drivecmdletprovider.Removedrive* của lớp System.Man Management.Automation.Provider.Drivecmdletprovider. Bạn cũng sẽ thấy cách khai báo một lớp nhà cung cấp.

Khi viết một nhà cung cấp, bạn có thể chỉ định các ổ đĩa mặc định được tạo tự động khi có nhà cung cấp. Bạn cũng xác định phương pháp tạo ổ đĩa mới sử dụng nhà cung cấp đó.

Các ví dụ được cung cấp trong chủ đề này dựa trên mẫu AccessDBProviderSample02, là một phần của mẫu lớn hơn đại diện cho cơ sở dữ liệu Access dưới dạng ổ đĩa Windows PowerShell.

Thiết lập dự án

Trong Visual Studio, tạo dự án Thư viện lớp có tên AccessDBProviderSample. Hoàn thành các bước sau để đặt cấu hình dự án của bạn để Windows PowerShell khởi động và nhà cung cấp sẽ được tải vào phiên khi bạn xây dựng và khởi động dự án của mình.

Định cấu hình dự án nhà cung cấp
  1. Thêm tập hợp System.Man Management.Automation làm tài liệu tham khảo cho dự án của bạn.

  2. Nhấp vào Dự án > Thuộc tính mẫu AccessDBProvider > Gỡ lỗi. Trong Bắt đầu dự án, hãy nhấp vào Bắt đầu chương trình bên ngoài và điều hướng đến tệp thực thi Windows PowerShell (thường là c:\Windows\System32\WindowsPowerShell\v1.0\.powershell.exe) .

  3. Trong Tùy chọn bắt đầu, hãy nhập thông tin sau vào hộp Đối số dòng lệnh: -noexit -command "[reflection.assembly]::loadFrom(AccessDBProviderSample.dll' ) | mô-đun nhập"

Khai báo lớp nhà cung cấp

Nhà cung cấp của chúng tôi xuất phát từ lớp System.management.Automation.Provider.Drivecmdletprovider. Hầu hết các nhà cung cấp cung cấp chức năng thực sự (truy cập và thao tác các mục, điều hướng kho dữ liệu cũng như nhận và thiết lập nội dung của các mục) đều xuất phát từ lớp System.Manager.Automation.Provider.Navigationcmdletprovider.

Ngoài việc chỉ định rằng lớp bắt nguồn từ System.Man Management.Automation.Provider.Drivecmdletprovider, bạn phải trang trí nó bằng System.Man Management.Automation.Provider.Cmdletproviderattribute như trong ví dụ.

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
  {

}
}

Triển khai NewDrive

Phương thức System.management.Automation.Provider.Drivecmdletprovider.Newdrive* được công cụ Windows PowerShell gọi khi người dùng gọi lệnh ghép ngắn Microsoft.PowerShell.Commands.NewPSDriveCommand chỉ định tên nhà cung cấp của bạn. Tham số PSDriveInfo được truyền bởi công cụ Windows PowerShell và phương thức này trả về ổ đĩa mới cho công cụ Windows PowerShell. Phương thức này phải được khai báo trong lớp được tạo ở trên.

Trước tiên, phương thức này sẽ kiểm tra để đảm bảo cả đối tượng ổ đĩa và gốc ổ đĩa đã được truyền đều tồn tại, trả về null nếu một trong hai đối tượng đó không tồn tại. Sau đó, nó sử dụng hàm tạo của lớp bên trong AccessDBPSDriveInfo để tạo ổ đĩa mới và kết nối tới cơ sở dữ liệu Access mà ổ đĩa đó đại diện.

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

Sau đây là lớp bên trong AccessDBPSDriveInfo bao gồm hàm tạo được sử dụng để tạo ổ đĩa mới và chứa thông tin trạng thái cho ổ đĩa.

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

Triển khai RemoveDrive

Phương thức System.management.Automation.Provider.Drivecmdletprovider.Removedrive* được công cụ Windows PowerShell gọi khi người dùng gọi lệnh ghép ngắn Microsoft.PowerShell.Commands.RemovePSDriveCommand. Phương thức trong nhà cung cấp này sẽ đóng kết nối với cơ sở dữ liệu 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;
    }

Bài viết liên quan