本主題說明如何建立一個 Windows PowerShell 磁碟機提供者,提供透過 Windows PowerShell 磁碟機存取資料儲存的方式。 這類提供者也稱為 Windows PowerShell 磁碟機提供者。 提供者使用的 Windows PowerShell 磁碟機提供連接資料儲存的管道。
此處描述的 Windows PowerShell 磁碟機提供者提供存取 Microsoft Access 資料庫的存取權。 對於此提供者,Windows PowerShell 磁碟代表資料庫(可向磁碟機提供者新增任意數量的磁碟),磁碟的頂層容器代表資料庫中的資料表,容器的項目代表資料表中的列。
定義 Windows PowerShell 提供者類別
你的硬碟提供者必須定義一個 .NET 類別,該類別源自 System.Management.Automation.Provider.DriveCmdletProvider 基底類別。 以下是這個硬碟供應商的類別定義:
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : DriveCmdletProvider
請注意,在這個範例中, System.Management.Automation.Provider.CmdletProviderAttribute 屬性指定了使用者友善的提供者名稱,以及提供者在指令處理過程中向 Windows PowerShell 執行時所暴露的功能。 提供者能力的可能值由 系統管理自動化(System.Management.Automation.Provider.ProviderCapabilities )列舉定義。 此硬碟供應商不支援上述任何一項功能。
定義基礎功能
如《 設計你的 Windows PowerShell 提供者》中所述, System.Management.Automation.Provider.DriveCmdletProvider 類別源自 System.Management.Automation.Provider.CmdletProvider 基底類別,該類別定義了初始化與取消初始化提供者所需的方法。 若要實作新增會話特定初始化資訊及釋放提供者使用的資源的功能,請參見 建立基本 Windows PowerShell 提供者。 然而,大多數提供者(包括此處描述的提供者)都能使用 Windows PowerShell 提供的預設實作。
建立硬碟狀態資訊
所有 Windows PowerShell 提供者都被視為無狀態,這表示你的硬碟提供者需要建立 Windows PowerShell 執行環境在呼叫提供者時所需的狀態資訊。
對於此磁碟提供者,狀態資訊包含作為磁碟資訊一部分的資料庫連線。 這裡有一段程式碼,說明這些資訊如何儲存在描述硬碟的 System.Management.Automation.PSDriveinfo 物件中:
internal class AccessDBPSDriveInfo : PSDriveInfo
{
private OdbcConnection connection;
/// <summary>
/// ODBC connection information.
/// </summary>
public OdbcConnection Connection
{
get { return connection; }
set { connection = value; }
}
/// <summary>
/// Constructor that takes one argument
/// </summary>
/// <param name="driveInfo">Drive provided by this provider</param>
public AccessDBPSDriveInfo(PSDriveInfo driveInfo)
: base(driveInfo)
{ }
} // class AccessDBPSDriveInfo
建立磁碟機
為了讓 Windows PowerShell 執行環境建立磁碟機,磁碟提供者必須實作 System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* 方法。 以下程式碼展示了此硬碟提供者 System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* 方法的實作:
protected override PSDriveInfo NewDrive(PSDriveInfo drive)
{
// check if drive object is null
if (drive == null)
{
WriteError(new ErrorRecord(
new ArgumentNullException("drive"),
"NullDrive",
ErrorCategory.InvalidArgument,
null)
);
return null;
}
// check if drive root is not null or empty
// and if its 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;
} // NewDrive
你覆寫此方法的做法應該是:
確認 System.Management.Automation.PSDriveinfo.Root* 成員是否存在,且能與資料儲存連結。
建立一個磁碟機並填充連接成員,以支援
New-PSDrivecmdlet。驗證 System.Management.Automation.PSDriveinfo 物件的擬定硬碟。
修改描述硬碟的 System.Management.Automation.PSDriveinfo 物件,加入所需的效能或可靠性資訊,或為使用磁碟的使用者提供額外資料。
使用 System.Management.Automation.Provider.CmdletProvider.WriteError 方法處理失敗,然後回傳
null。此方法會回傳給該方法的磁碟資訊,或是提供者專屬版本。
將動態參數附加到 NewDrive
你的硬碟提供者支援的 New-PSDrive cmdlet 可能需要額外參數。 為了將這些動態參數附加到 cmdlet,提供者實作 了 System.Management.Automation.Provider.DriveCmdletProvider.NewDriveDynamicParameters* 方法。 此方法回傳一個物件,其屬性與欄位的解析屬性類似於 cmdlet 類別或 System.Management.Automation.RuntimeDefinedParameterDictionary 物件。
此硬碟供應商不會覆蓋此方法。 然而,以下程式碼顯示了此方法的預設實作:
移除硬碟
要關閉資料庫連線,磁碟提供者必須實作 System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* 方法。 此方法在清除任何業者特定資訊後,會關閉與硬碟的連線。
以下程式碼展示了此硬碟提供者系統管理 自動化(System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive*) 方法的實作:
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 ODBC connection to the drive
AccessDBPSDriveInfo accessDBPSDriveInfo = drive as AccessDBPSDriveInfo;
if (accessDBPSDriveInfo == null)
{
return null;
}
accessDBPSDriveInfo.Connection.Close();
return accessDBPSDriveInfo;
} // RemoveDrive
如果可以移除硬碟,方法應該會透過參數 drive 回傳傳遞給方法的資訊。 若無法移除磁碟機,該方法應寫入例外並返回 null。 如果你的提供者沒有覆寫這個方法,預設的實作會直接回傳作為輸入的磁碟機資訊。
初始化預設硬碟
你的硬碟提供者實作了 System.Management.Automation.Provider.DriveCmdletProvider.InitializeDefaultDrives* 的方法來掛載硬碟。 例如,若電腦加入網域,Active Directory 提供者可能會掛載磁碟以維持預設命名情境。
此方法回傳一組關於已初始化硬碟的磁碟資訊,或為空集合。 此方法的呼叫是在 Windows PowerShell 執行時呼叫 System.Management.Automation.Provider.CmdletProvider.Start* 方法以初始化提供者之後進行。
此磁碟提供者不會覆寫 System.Management.Automation.Provider.DriveCmdletProvider.InitializeDefaultDrives* 方法。 然而,以下程式碼顯示預設實作,回傳一個空磁碟收集:
關於實作 InitializeDefaultDrives 需要注意的事項
所有硬碟供應商都應該安裝根目錄,幫助使用者更容易被發現。 根目錄可能會列出作為其他掛載磁碟根的位置。 例如,Active Directory 提供者可能會建立一個磁碟,列出根分散式系統環境(DSE)屬性中的 namingContext 命名上下文。 這有助於使用者發現其他硬碟的掛載點。
程式碼範例
完整範例程式碼請參閱 AccessDbProviderSample02 程式碼範例。
測試 Windows PowerShell 磁碟機提供者
當您的 Windows PowerShell 提供者已在 Windows PowerShell 註冊後,您可以透過命令列執行支援的 cmdlet,包括任何透過衍生提供的 cmdlet,來測試它。 讓我們來測試樣品驅動器供應商。
執行
Get-PSProvidercmdlet 以取得提供者清單,以確保 AccessDB 磁碟提供者存在:附註>
Get-PSProvider會出現下列輸出:
Name Capabilities Drives ---- ------------ ------ AccessDB None {} Alias ShouldProcess {Alias} Environment ShouldProcess {Env} FileSystem Filter, ShouldProcess {C, Z} Function ShouldProcess {function} Registry ShouldProcess {HKLM, HKCU}透過存取作業系統管理工具中的資料來源部分,確保資料庫伺服器名稱(DSN)存在。 在 使用者 DSN 表格中,雙擊 MS Access 資料庫 並新增磁碟路徑
C:\ps\northwind.mdb。使用樣本驅動器提供者建立新硬碟:
New-PSDrive -Name mydb -Root C:\ps\northwind.mdb -PSProvider AccessDb`會出現下列輸出:
Name Provider Root CurrentLocation ---- -------- ---- --------------- mydb AccessDB C:\ps\northwind.mdb驗證連線。 因為連線是定義為磁碟機的成員,你可以用 Get-PDDrive cmdlet 檢查。
備註
使用者目前無法以硬碟形式與提供者互動,因為提供者需要容器功能來進行這種互動。 欲了解更多資訊,請參閱 建立 Windows PowerShell 容器提供者。
附註> (Get-PSDrive mydb)。連結
會出現下列輸出:
ConnectionString : Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\ps\northwind.mdb ConnectionTimeout : 15 Database : C:\ps\northwind DataSource : ACCESS ServerVersion : 04.00.0000 Driver : odbcjt32.dll State : Open Site : Container :拆下硬碟並退出外殼:
PS> Remove-PSDrive mydb PS> exit