Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Topik ini menjelaskan cara membuat penyedia Windows PowerShell yang memiliki fungsionalitas dasar untuk membuat drive baru. Untuk informasi umum tentang penyedia, lihat Gambaran Umum Penyedia Windows PowerShell. Untuk contoh penyedia dengan fungsionalitas yang lebih lengkap, lihat Sampel Penyedia .
Menulis penyedia dasar
Fungsionalitas paling mendasar dari penyedia Windows PowerShell adalah membuat dan menghapus drive. Dalam contoh ini, kami menerapkan System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* dan System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* metode System.Management.Automation.Provider.DriveCmdletProvider class. Anda juga akan melihat cara mendeklarasikan kelas penyedia.
Saat menulis penyedia, Anda dapat menentukan drive default-drive yang dibuat secara otomatis saat penyedia tersedia. Anda juga menentukan metode untuk membuat drive baru yang menggunakan penyedia tersebut.
Contoh yang disediakan dalam topik ini didasarkan pada sampel AccessDBProviderSample02, yang merupakan bagian dari sampel yang lebih besar yang mewakili database Access sebagai drive Windows PowerShell.
Menyiapkan proyek
Di Visual Studio, buat proyek Pustaka Kelas bernama AccessDBProviderSample. Selesaikan langkah-langkah berikut untuk mengonfigurasi proyek Anda sehingga Windows PowerShell akan dimulai, dan penyedia akan dimuat ke dalam sesi, saat Anda membangun dan memulai proyek Anda.
Mengonfigurasi proyek penyedia
Tambahkan rakitan System.Management.Automation sebagai referensi ke proyek Anda.
Klik Project > AccessDBProviderSample Properties > Debug. Di Mulai proyek, klik Mulai program eksternal, dan navigasikan ke Windows PowerShell yang dapat dieksekusi (biasanya C:\Windows\System32\WindowsPowerShell\v1.0\.powershell.exe).
Di bawah Opsi Mulai, masukkan yang berikut ini ke dalam kotak argumen baris Perintah:
-NoExit -Command "[Reflection.Assembly]::LoadFrom(AccessDBProviderSample.dll' ) | Import-Module"
Mendeklarasikan kelas penyedia
Penyedia kami berasal dari kelas System.Management.Automation.Provider.DriveCmdletProvider. Sebagian besar penyedia yang menyediakan fungsionalitas nyata (mengakses dan memanipulasi item, menavigasi penyimpanan data, dan mendapatkan dan mengatur konten item) berasal dari kelas System.Management.Automation.Provider.NavigationCmdletProvider.
Selain menentukan bahwa kelas berasal dari System.Management.Automation.Provider.DriveCmdletProvider, Anda harus menghiasnya dengan System.Management.Automation.Provider.CmdletProviderAttribute seperti yang ditunjukkan dalam contoh.
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
{
}
}
Menerapkan NewDrive
Metode System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* dipanggil oleh mesin Windows PowerShell saat pengguna memanggil cmdlet Microsoft.PowerShell.Commands.NewPSDriveCommand yang menentukan nama penyedia Anda. Parameter PSDriveInfo diteruskan oleh mesin Windows PowerShell, dan metode mengembalikan drive baru ke mesin Windows PowerShell. Metode ini harus dideklarasikan dalam kelas yang dibuat di atas.
Metode ini pertama-tama memeriksa untuk memastikan objek drive dan akar drive yang diteruskan ada, mengembalikan null
jika salah satunya tidak. Kemudian menggunakan konstruktor kelas internal AccessDBPSDriveInfo untuk membuat drive baru dan koneksi ke database Access yang diwakili drive.
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;
}
Berikut ini adalah kelas internal AccessDBPSDriveInfo yang menyertakan konstruktor yang digunakan untuk membuat drive baru, dan berisi informasi status untuk drive.
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; }
}
}
Menerapkan RemoveDrive
Metode System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* dipanggil oleh mesin Windows PowerShell saat pengguna memanggil cmdlet Microsoft.PowerShell.Commands.RemovePSDriveCommand. Metode dalam penyedia ini menutup koneksi ke database 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;
}