Een itemprovider schrijven

In dit onderwerp wordt beschreven hoe u de methoden implementeert van een Windows PowerShell-provider die items in het gegevensopslag gebruikt en bewerkt. Voor toegang tot items moet een provider zijn afgeleid van de klasse System.Management.Automation.Provider.Itemcmdletprovider.

De provider in de voorbeelden in dit onderwerp gebruikt een Access-database als gegevensopslag. Er zijn verschillende helpermethoden en -klassen die worden gebruikt voor interactie met de database. Zie AccessDBProviderSample03 voor het volledige voorbeeld met de helpermethoden

Zie voor meer informatie Windows PowerShell providers Windows PowerShell Provider Overview.

Itemmethoden implementeren

De klasse System.Management.Automation.Provider.Itemcmdletprovider biedt verschillende methoden die kunnen worden gebruikt om de items in een gegevensopslag te openen en te bewerken. Zie ItemCmdletProvider Methodsvoor een volledige lijst van deze methoden. In dit voorbeeld implementeren we vier van deze methoden. System.Management.Automation.Provider.Itemcmdletprovider.Getitem* haalt een item op bij een opgegeven pad. System.Management.Automation.Provider.Itemcmdletprovider.Setitem* stelt de waarde van het opgegeven item in. System.Management.Automation.Provider.Itemcmdletprovider.Itemexists* controleert of er een item bestaat op het opgegeven pad. System.Management.Automation.Provider.Itemcmdletprovider.Isvalidpath* controleert een pad om te zien of het is toe te staan aan een locatie in het gegevensopslag.

Notitie

Dit onderwerp bouwt voort op de informatie in Windows PowerShell Provider QuickStart. In dit onderwerp worden niet de basisbeginselen besproken van het instellen van een providerproject of het implementeren van de methoden die zijn overgenomen van de klasse System.Management.Automation.Provider.Drivecmdletprovider voor het maken en verwijderen van stations.

De providerklasse declareren

Declareer de provider om af te leiden van de klasse System.Management.Automation.Provider.Itemcmdletprovider en versier deze met de klasse System.Management.Automation.Provider.Cmdletproviderattribute.

[CmdletProvider("AccessDB", ProviderCapabilities.None)]

   public class AccessDBProvider : ItemCmdletProvider
   {

  }

GetItem implementeren

System.Management.Automation.Provider.Itemcmdletprovider.Getitem* wordt aangeroepen door de PowerShell-engine wanneer een gebruiker de cmdlet Microsoft.PowerShell.Commands.GetItemCommand aanroept bij uw provider. De methode retourneert het item op het opgegeven pad. In het access-databasevoorbeeld controleert de methode of het item het station zelf, een tabel in de database of een rij in de database is. De methode verzendt het item naar de PowerShell-engine door de methode System.Management.Automation.Provider.Cmdletprovider.Writeitemobject* aan te roepen.

protected override void GetItem(string path)
      {
          // check if the path represented is a drive
          if (PathIsDrive(path))
          {
              WriteItemObject(this.PSDriveInfo, path, true);
              return;
          }// if (PathIsDrive...

           // Get table name and row information from the path and do
           // necessary actions
           string tableName;
           int rowNumber;

           PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

           if (type == PathType.Table)
           {
               DatabaseTableInfo table = GetTable(tableName);
               WriteItemObject(table, path, true);
           }
           else if (type == PathType.Row)
           {
               DatabaseRowInfo row = GetRow(tableName, rowNumber);
               WriteItemObject(row, path, false);
           }
           else
           {
               ThrowTerminatingInvalidPathException(path);
           }

       }

SetItem implementeren

De methode System.Management.Automation.Provider.Itemcmdletprovider.Setitem* wordt aangeroepen door de PowerShell-engine wanneer een gebruiker de cmdlet Microsoft.PowerShell.Commands.SetItemCommand aanroept. Hiermee stelt u de waarde van het item op het opgegeven pad.

In het access-databasevoorbeeld is het zinvol om de waarde van een item alleen in te stellen als dat item een rij is, dus de methode geeft NotSupportedException weer wanneer het item geen rij is.

protected override void SetItem(string path, object values)
       {
           // Get type, table name and row number from the path specified
           string tableName;
           int rowNumber;

           PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

           if (type != PathType.Row)
           {
               WriteError(new ErrorRecord(new NotSupportedException(
                     "SetNotSupported"), "",
                  ErrorCategory.InvalidOperation, path));

               return;
           }

           // Get in-memory representation of table
           OdbcDataAdapter da = GetAdapterForTable(tableName);

           if (da == null)
           {
               return;
           }
           DataSet ds = GetDataSetForTable(da, tableName);
           DataTable table = GetDataTable(ds, tableName);

           if (rowNumber >= table.Rows.Count)
           {
               // The specified row number has to be available. If not
               // NewItem has to be used to add a new row
               throw new ArgumentException("Row specified is not available");
           } // if (rowNum...

           string[] colValues = (values as string).Split(',');

           // set the specified row
           DataRow row = table.Rows[rowNumber];

           for (int i = 0; i < colValues.Length; i++)
           {
               row[i] = colValues[i];
           }

           // Update the table
           if (ShouldProcess(path, "SetItem"))
           {
               da.Update(ds, tableName);
           }

       }

ItemExists implementeren

De methode System.Management.Automation.Provider.Itemcmdletprovider.Itemexists* wordt aangeroepen door de PowerShell-engine wanneer een gebruiker de cmdlet Microsoft.PowerShell.Commands.TestPathCommand aanroept. De methode bepaalt of er een item op het opgegeven pad is. Als het item wel bestaat, geeft de methode het terug aan de PowerShell-engine door System.Management.Automation.Provider.Cmdletprovider.Writeitemobject*aan te roepen.

protected override bool ItemExists(string path)
       {
           // check if the path represented is a drive
           if (PathIsDrive(path))
           {
               return true;
           }

           // Obtain type, table name and row number from path
           string tableName;
           int rowNumber;

           PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

           DatabaseTableInfo table = GetTable(tableName);

           if (type == PathType.Table)
           {
               // if specified path represents a table then DatabaseTableInfo
               // object for the same should exist
               if (table != null)
               {
                   return true;
               }
           }
           else if (type == PathType.Row)
           {
               // if specified path represents a row then DatabaseTableInfo should
               // exist for the table and then specified row number must be within
               // the maximum row count in the table
               if (table != null && rowNumber < table.RowCount)
               {
                   return true;
               }
           }

           return false;

       }

IsValidPath implementeren

De methode System.Management.Automation.Provider.Itemcmdletprovider.Isvalidpath* controleert of het opgegeven pad syntactisch geldig is voor de huidige provider. Er wordt niet gekeken of er een item op het pad bestaat.

protected override bool IsValidPath(string path)
       {
           bool result = true;

           // check if the path is null or empty
           if (String.IsNullOrEmpty(path))
           {
               result = false;
           }

           // convert all separators in the path to a uniform one
           path = NormalizePath(path);

           // split the path into individual chunks
           string[] pathChunks = path.Split(pathSeparator.ToCharArray());

           foreach (string pathChunk in pathChunks)
           {
               if (pathChunk.Length == 0)
               {
                   result = false;
               }
           }
           return result;
       }

Volgende stappen

Een typische provider in de echte wereld is geschikt voor het ondersteunen van items die andere items bevatten en items verplaatsen van het ene pad naar het andere binnen het station. Zie Een containerprovider schrijven voor een voorbeeld van een provider die ondersteuning biedt voor containers. Zie Een navigatieprovider schrijven voor een voorbeeld van een provider die ondersteuning biedt voor het verplaatsen van items.

Zie ook

Een containerprovider schrijven

Een navigatieprovider schrijven

Overzicht van Windows PowerShell-providers