Aracılığıyla paylaş


Bir gezinti sağlayıcısı yazma

Bu konu, iç içe kapsayıcıları (çok düzeyli veri depoları), öğeleri taşımayı ve göreli yolları destekleyen bir Windows PowerShell sağlayıcısının yöntemlerinin nasıl uygulandığını açıklar. Gezinti sağlayıcısı, System.Management.Automation.Provider.NavigationCmdletProvider sınıfından türetilmelidir.

Bu konudaki örneklerde yer alan sağlayıcı, veri deposu olarak bir Access veritabanı kullanır. Veritabanıyla etkileşime geçmek için kullanılan çeşitli yardımcı yöntemler ve sınıflar vardır. Yardımcı yöntemleri içeren tam örnek için bkz. AccessDBProviderSample05.

Windows PowerShell sağlayıcıları hakkında daha fazla bilgi için bkz. Windows PowerShell Sağlayıcısına Genel Bakış.

Gezinti yöntemlerini uygulama

System.Management.Automation.Provider.NavigationCmdletProvider sınıfı iç içe kapsayıcıları, göreli yolları ve öğeleri taşımayı destekleyen yöntemler uygular. Bu yöntemlerin tam listesi için bkz. NavigationCmdletProvider Methods.

Uyarı

Bu konu, Windows PowerShell Sağlayıcısı Hızlı Başlangıçbilgileri temel alır. Bu konu, bir sağlayıcı projesinin nasıl ayarlanacağına veya sürücüleri oluşturup kaldıran System.Management.Automation.Provider.DriveCmdletProvider sınıfından devralınan yöntemlerin nasıl uygulanacağıyla ilgili temel bilgileri kapsamaz. Bu konu, System.Management.Automation.Provider.ItemCmdletProvider veya System.Management.Automation.Provider.ContainerCmdletProvider sınıfları tarafından kullanıma sunulan yöntemlerin nasıl uygulandığını da kapsamaz. Öğe cmdlet'lerinin nasıl uygulandığını gösteren bir örnek için bkz. Öğe sağlayıcısı yazma. Kapsayıcı cmdlet'lerinin nasıl uygulandığını gösteren bir örnek için bkz. Kapsayıcı sağlayıcısı yazma.

Sağlayıcı sınıfını bildirme

System.Management.Automation.Provider.NavigationCmdletProvider sınıfından türetilen sağlayıcıyı bildirin ve System.Management.Automation.Provider.CmdletProviderAttributeile süsleyin.

[CmdletProvider("AccessDB", ProviderCapabilities.None)]
   public class AccessDBProvider : NavigationCmdletProvider
   {

   }

IsItemContainer Uygulama

System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* yöntemi, belirtilen yoldaki öğenin kapsayıcı olup olmadığını denetler.

protected override bool IsItemContainer(string path)
      {
         if (PathIsDrive(path))
         {
             return true;
         }

         string[] pathChunks = ChunkPath(path);
         string tableName;
         int rowNumber;

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

         if (type == PathType.Table)
         {
            foreach (DatabaseTableInfo ti in GetTables())
            {
                if (string.Equals(ti.Name, tableName, StringComparison.OrdinalIgnoreCase))
                {
                    return true;
                }
            } // foreach (DatabaseTableInfo...
         } // if (pathChunks...

         return false;
      }

GetChildName Uygulama

System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* yöntemi, belirtilen yolda alt öğenin name özelliğini alır. Belirtilen yoldaki öğe bir kapsayıcının alt öğesi değilse, bu yöntem yolu döndürmelidir.

protected override string GetChildName(string path)
       {
           if (PathIsDrive(path))
           {
               return path;
           }

           string tableName;
           int rowNumber;

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

           if (type == PathType.Table)
           {
               return tableName;
           }
           else if (type == PathType.Row)
           {
               return rowNumber.ToString(CultureInfo.CurrentCulture);
           }
           else
           {
               ThrowTerminatingInvalidPathException(path);
           }

           return null;
       }

GetParentPath Uygulama

System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* yöntemi, belirtilen yolda öğenin üst öğesinin yolunu alır. Belirtilen yoldaki öğe veri deposunun köküyse (yani üst öğesi yoksa), bu yöntem kök yolu döndürmelidir.

protected override string GetParentPath(string path, string root)
       {
           // If root is specified then the path has to contain
           // the root. If not nothing should be returned
           if (!String.IsNullOrEmpty(root))
           {
               if (!path.Contains(root))
               {
                   return null;
               }
           }

           return path.Substring(0, path.LastIndexOf(pathSeparator, StringComparison.OrdinalIgnoreCase));
       }

MakePath Uygulama

System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* yöntemi, sağlayıcı-iç yol oluşturmak için belirtilen üst yol ile belirtilen alt yolu birleştirir (sağlayıcıların destekleyebilecekleri yol türleri hakkında bilgi için bkz. Windows PowerShell Sağlayıcısına Genel Bakış. Kullanıcı Microsoft.PowerShell.Commands.JoinPathCommand cmdlet'ini çağırdığında PowerShell altyapısı bu yöntemi çağırır.

protected override string MakePath(string parent, string child)
       {
           string result;

           string normalParent = NormalizePath(parent);
           normalParent = RemoveDriveFromPath(normalParent);
           string normalChild = NormalizePath(child);
           normalChild = RemoveDriveFromPath(normalChild);

           if (String.IsNullOrEmpty(normalParent) && String.IsNullOrEmpty(normalChild))
           {
               result = String.Empty;
           }
           else if (String.IsNullOrEmpty(normalParent) && !String.IsNullOrEmpty(normalChild))
           {
               result = normalChild;
           }
           else if (!String.IsNullOrEmpty(normalParent) && String.IsNullOrEmpty(normalChild))
           {
               if (normalParent.EndsWith(pathSeparator, StringComparison.OrdinalIgnoreCase))
               {
                   result = normalParent;
               }
               else
               {
                   result = normalParent + pathSeparator;
               }
           } // else if (!String...
           else
           {
               if (!normalParent.Equals(String.Empty) &&
                   !normalParent.EndsWith(pathSeparator, StringComparison.OrdinalIgnoreCase))
               {
                   result = normalParent + pathSeparator;
               }
               else
               {
                   result = normalParent;
               }

               if (normalChild.StartsWith(pathSeparator, StringComparison.OrdinalIgnoreCase))
               {
                   result += normalChild.Substring(1);
               }
               else
               {
                   result += normalChild;
               }
           } // else

           return result;
       }

NormalizeRelativePath Uygulama

System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* yöntemi path ve basepath parametreleri alır ve path parametresine eşdeğer ve basepath parametresine göre normalleştirilmiş bir yol döndürür.

protected override string NormalizeRelativePath(string path,
                                                            string basepath)
       {
           // Normalize the paths first
           string normalPath = NormalizePath(path);
           normalPath = RemoveDriveFromPath(normalPath);
           string normalBasePath = NormalizePath(basepath);
           normalBasePath = RemoveDriveFromPath(normalBasePath);

           if (String.IsNullOrEmpty(normalBasePath))
           {
               return normalPath;
           }
           else
           {
               if (!normalPath.Contains(normalBasePath))
               {
                   return null;
               }

               return normalPath.Substring(normalBasePath.Length + pathSeparator.Length);
           }
       }

MoveItem Uygulama

System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* yöntemi bir öğeyi belirtilen yoldan belirtilen hedef yola taşır. Kullanıcı Microsoft.PowerShell.Commands.MoveItemCommand cmdlet'ini çağırdığında PowerShell altyapısı bu yöntemi çağırır.

protected override void MoveItem(string path, string destination)
       {
           // Get type, table name and rowNumber from the path
           string tableName, destTableName;
           int rowNumber, destRowNumber;

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

           PathType destType = GetNamesFromPath(destination, out destTableName,
                                    out destRowNumber);

           if (type == PathType.Invalid)
           {
               ThrowTerminatingInvalidPathException(path);
           }

           if (destType == PathType.Invalid)
           {
               ThrowTerminatingInvalidPathException(destination);
           }

           if (type == PathType.Table)
           {
               ArgumentException e = new ArgumentException("Move not supported for tables");

               WriteError(new ErrorRecord(e, "MoveNotSupported",
                   ErrorCategory.InvalidArgument, path));

               throw e;
           }
           else
           {
               OdbcDataAdapter da = GetAdapterForTable(tableName);
               if (da == null)
               {
                   return;
               }

               DataSet ds = GetDataSetForTable(da, tableName);
               DataTable table = GetDataTable(ds, tableName);

               OdbcDataAdapter dda = GetAdapterForTable(destTableName);
               if (dda == null)
               {
                   return;
               }

               DataSet dds = GetDataSetForTable(dda, destTableName);
               DataTable destTable = GetDataTable(dds, destTableName);
               DataRow row = table.Rows[rowNumber];

               if (destType == PathType.Table)
               {
                   DataRow destRow = destTable.NewRow();

                   destRow.ItemArray = row.ItemArray;
               }
               else
               {
                   DataRow destRow = destTable.Rows[destRowNumber];

                   destRow.ItemArray = row.ItemArray;
               }

               // Update the changes
               if (ShouldProcess(path, "MoveItem"))
               {
                   WriteItemObject(row, path, false);
                   dda.Update(dds, destTableName);
               }
           }
       }

Ayrıca Bkz.

Kapsayıcı sağlayıcısı yazma

Windows PowerShell Sağlayıcısına Genel Bakış