Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo argomento illustra come creare un provider di Windows PowerShell con funzionalità di base per la creazione di una nuova unità. Per informazioni generali sui provider, vedere Panoramica del provider Windows PowerShell. Per esempi di provider con funzionalità più complete, vedere esempi di provider .
Scrittura di un provider di base
La funzionalità più semplice di un provider di Windows PowerShell consiste nel creare e rimuovere unità. In questo esempio vengono implementati i metodi System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* e System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* della classe System.Management.Automation.Provider.DriveCmdletProvider. Si vedrà anche come dichiarare una classe provider.
Quando si scrive un provider, è possibile specificare unità unità predefinite create automaticamente quando il provider è disponibile. Si definisce anche un metodo per creare nuove unità che usano tale provider.
Gli esempi forniti in questo argomento si basano sull'esempio di AccessDBProviderSample02, che fa parte di un esempio più ampio che rappresenta un database di Access come unità di Windows PowerShell.
Configurazione del progetto
In Visual Studio creare un progetto di libreria di classi denominato AccessDBProviderSample. Completare i passaggi seguenti per configurare il progetto in modo che Venga avviato Windows PowerShell e che il provider venga caricato nella sessione, quando si compila e si avvia il progetto.
Configurare il progetto del provider
Aggiungere l'assembly System.Management.Automation come riferimento al progetto.
Fare clic su Project > AccessDBProviderSample Properties > Debug. In Start projectfare clic su Start external programe passare al file eseguibile di Windows PowerShell (in genere C:\Windows\System32\WindowsPowerShell\v1.0\.powershell.exe).
In Opzioni di avvioimmettere quanto segue nella casella argomenti della riga di comando:
-NoExit -Command "[Reflection.Assembly]::LoadFrom(AccessDBProviderSample.dll' ) | Import-Module"
Dichiarazione della classe del provider
Il provider deriva dalla classe System.Management.Automation.Provider.DriveCmdletProvider. La maggior parte dei provider che forniscono funzionalità reali (accesso e modifica di elementi, esplorazione dell'archivio dati e recupero e impostazione del contenuto degli elementi) derivano dalla classe System.Management.Automation.Provider.NavigationCmdletProvider.
Oltre a specificare che la classe deriva da System.Management.Automation.Provider.DriveCmdletProvider, è necessario decorarla con il System.Management.Automation.Provider.CmdletProviderAttribute come illustrato nell'esempio.
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
{
}
}
Implementazione di NewDrive
Il metodo System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* viene chiamato dal motore di Windows PowerShell quando un utente chiama il cmdlet Microsoft.PowerShell.Commands.NewPSDriveCommand specificando il nome del provider. Il parametro PSDriveInfo viene passato dal motore di Windows PowerShell e il metodo restituisce la nuova unità al motore di Windows PowerShell. Questo metodo deve essere dichiarato all'interno della classe creata in precedenza.
Il metodo controlla prima di tutto per assicurarsi che sia l'oggetto unità che la radice dell'unità passata esistano, restituendo null
se uno di essi non lo è. Usa quindi un costruttore della classe interna AccessDBPSDriveInfo per creare una nuova unità e una connessione al database di Access rappresentata dall'unità.
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;
}
Di seguito è riportata la classe interna AccessDBPSDriveInfo che include il costruttore usato per creare una nuova unità e contiene le informazioni sullo stato per l'unità.
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; }
}
}
Implementazione di RemoveDrive
Il metodo System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* viene chiamato dal motore di Windows PowerShell quando un utente chiama il cmdlet Microsoft.PowerShell.Commands.RemovePSDriveCommand. Il metodo in questo provider chiude la connessione al database di 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;
}