Поделиться через


Создание поставщика навигации Windows PowerShell

В этом разделе описывается создание поставщика навигации Windows PowerShell, который может перемещаться по хранилищу данных. Этот тип поставщика поддерживает рекурсивные команды, вложенные контейнеры и относительные пути.

Примечание.

Исходный файл C# (AccessDBSampleProvider05.cs) для этого поставщика можно скачать с помощью пакета средств разработки программного обеспечения Microsoft Windows для Windows Vista и .NET Framework 3.0. Инструкции по скачиванию см. в статье Установка Windows PowerShell и скачивание пакета SDK для Windows PowerShell. Скачанные исходные файлы доступны в каталоге>примеров PowerShell<. Дополнительные сведения о других реализациях поставщика Windows PowerShell см. в статье Проектированиепоставщика Windows PowerShell.

Поставщик, описанный здесь, позволяет пользователю обрабатывать базу данных Access как диск, чтобы пользователь мог перейти к таблицам данных в базе данных. При создании собственного поставщика навигации можно реализовать методы, которые могут создавать пути, необходимые для навигации, нормализовать относительные пути, перемещать элементы хранилища данных, а также методы, которые получают дочерние имена, получить родительский путь элемента и проверить, является ли элемент контейнером.

Осторожность

Помните, что в этом проекте предполагается, что база данных с полем с идентификатором имени и тип поля — LongInteger.

Определение поставщика Windows PowerShell

Поставщик навигации Windows PowerShell должен создать класс .NET, производный от базового класса System.Management.Automation.Provider.NavigationCmdletProvid er. Ниже приведено определение класса для поставщика навигации, описанного в этом разделе.

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

Обратите внимание, что в этом поставщике атрибут System.Management.Automation.Provider.КомандлетProviderAttribut e включает два параметра. Первый параметр задает понятное имя поставщика, используемого Windows PowerShell. Второй параметр указывает определенные возможности Windows PowerShell, предоставляемые поставщику во время выполнения Windows PowerShell во время обработки команд. Для этого поставщика нет дополнительных возможностей Windows PowerShell.

Определение базовых функций

Как описано в конструкторе поставщика PS, базовый класс System.Management.Automation.Provider.NavigationCmdletProvider является производным от нескольких других классов, которые предоставили различные функциональные возможности поставщика. Поэтому поставщик навигации Windows PowerShell должен определить все функциональные возможности, предоставляемые этими классами.

Сведения о реализации функций для добавления сведений о инициализации для конкретного сеанса и освобождения ресурсов, используемых поставщиком, см. в созданиипоставщика базовых PS. Однако большинство поставщиков (включая описанный здесь поставщик) могут использовать реализацию этой функции по умолчанию, предоставляемую Windows PowerShell.

Чтобы получить доступ к хранилищу данных с помощью диска Windows PowerShell, необходимо реализовать методы базового класса System.Management.Automation.Provider.DriveCmdletProvider. Дополнительные сведения о реализации этих методов см. в создании поставщика дисков Windows PowerShell.

Чтобы управлять элементами хранилища данных, такими как получение, настройка и очистка элементов, поставщик должен реализовать методы, предоставляемые базовым классом System.Management.Automation.Provider.ItemCmdletProvider. Дополнительные сведения о реализации этих методов см. в созданиипоставщика элементов Windows PowerShell.

Чтобы добраться до дочерних элементов или их имен, хранилища данных, а также методов, которые создают, копируют, переименовывают и удаляют элементы, необходимо реализовать методы, предоставляемые базовым классом System.Management.Automation.Provider.ContainerCmdletProvid er. Дополнительные сведения о реализации этих методов см. в создании поставщика контейнеров Windows PowerShell.

Создание пути Windows PowerShell

Поставщик навигации Windows PowerShell использует внутренний путь Windows PowerShell для навигации по элементам хранилища данных. Чтобы создать внутренний путь поставщика, поставщик должен реализовать метод System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* для поддержки вызовов из командлета Combine-Path. Этот метод объединяет родительский и дочерний путь в внутренний путь поставщика, используя разделитель пути для конкретного поставщика между родительскими и дочерними путями.

Реализация по умолчанию принимает пути с "/" или "\" в качестве разделителя пути, нормализует разделитель пути "\", объединяет родительские и дочерние части пути с разделителем между ними, а затем возвращает строку, содержащую объединенные пути.

Этот метод не реализуется поставщиком навигации. Однако следующий код является реализацией по умолчанию метода System.Management.Automation.Provider.NavigationCmdletProvider.MakePath*.

Что следует помнить о реализации MakePath

Следующие условия могут применяться к реализации System.Management.Automation.Provider.NavigationCmdletProvider.MakePath*:

  • Реализация метода System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* не должна проверять путь как юридический полный путь в пространстве имен поставщика. Помните, что каждый параметр может представлять только часть пути, и объединенные части могут не создавать полный путь. Например, метод System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* для поставщика Файловой системы может получать "windows\system32" в параметре parent и "abc.dll" в параметре child. Метод объединяет эти значения с разделителем "\" и возвращает "windows\system32\abc.dll", который не является полным путь к файловой системе.

    Это важно

    Части пути, указанные в вызове System.Management.Automation.Provider.NavigationCmdletProvider.MakePath*, могут содержать символы, недопустимые в пространстве имен поставщика. Эти символы, скорее всего, используются для расширения подстановочных знаков, и реализация этого метода не должна их удалять.

Получение родительского пути

Поставщики навигации Windows PowerShell реализуют метод System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* для получения родительской части указанного полного или частичного пути для конкретного поставщика. Метод удаляет дочернюю часть пути и возвращает родительскую часть пути. Параметр root указывает полный путь к корню диска. Этот параметр может быть пустым или пустым, если подключенный диск не используется для операции извлечения. Если указан корень, метод должен вернуть путь к контейнеру в том же дереве, что и корень.

Пример поставщика навигации не переопределяет этот метод, но использует реализацию по умолчанию. Он принимает пути, использующие как "/", так и "\" в качестве разделителей путей. Сначала он нормализует путь только разделителя "\", а затем разделяет родительский путь по последнему "\" и возвращает родительский путь.

Помните о реализации GetParentPath

Реализация метода System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* должна разделить путь лексически в разделитель пути для пространства имен поставщика. Например, поставщик FileSystem использует этот метод для поиска последнего "\" и возвращает все слева от разделителя.

Получение имени дочернего пути

Поставщик навигации реализует метод System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* для получения имени (конечного элемента) дочернего элемента, расположенного по указанному полному или частичному пути поставщика.

Пример поставщика навигации не переопределяет этот метод. Ниже показана реализация по умолчанию. Он принимает пути, использующие как "/", так и "\" в качестве разделителей путей. Сначала он нормализует путь только с разделителями "\", а затем разбивает родительский путь по последнему "\" и возвращает имя дочерней части пути.

Сведения о реализации GetChildName

Реализация метода System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* должна лексически разделить путь на разделитель пути. Если указанный путь не содержит разделителей путей, метод должен вернуть путь, не измененный.

Это важно

Путь, предоставленный в вызове этого метода, может содержать символы, которые являются незаконными в пространстве имен поставщика. Эти символы, скорее всего, используются для расширения подстановочных знаков или сопоставления регулярных выражений, и реализация этого метода не должна их удалять.

Определение того, является ли элемент контейнером

Поставщик навигации может реализовать метод System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer*, чтобы определить, указывает ли указанный путь на контейнер. Возвращает значение true, если путь представляет контейнер и значение false. Пользователь должен использовать этот метод, чтобы использовать командлет Test-Path для указанного пути.

В следующем коде показана реализация System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* реализации в нашем примере поставщика навигации. Метод проверяет правильность указанного пути, и если таблица существует, и возвращает значение true, если путь указывает контейнер.

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;
} // IsItemContainer

Сведения о реализации IsItemContainer

Класс поставщика навигации .NET может объявлять возможности поставщика expandWildcards, Filter, Include или Exclude из перечисления System.Management.Automation.Provider.ProviderCapabilities перечисления. В этом случае реализация System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* должна обеспечить соответствие пути требованиям. Для этого метод должен получить доступ к соответствующему свойству, например свойству System.Management.Automation.Provider.КомандлетProvider.Exclude*.

Перемещение элемента

В поддержку командлета Move-Item поставщик навигации реализует метод System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem*. Этот метод перемещает элемент, указанный параметром path, в контейнер по пути, указанному в параметре destination.

Пример поставщика навигации не переопределяет метод System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem*. Ниже приведена реализация по умолчанию.

Сведения о реализации MoveItem

Класс поставщика навигации .NET может объявлять возможности поставщика expandWildcards, Filter, Include или Exclude из перечисления System.Management.Automation.Provider.ProviderCapabilities перечисления. В этом случае реализация System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* должна обеспечить соответствие пути требованиям. Для этого метод должен получить доступ к соответствующему свойству, например свойству CmdletProvider.Exclude.

По умолчанию переопределения этого метода не должны перемещать объекты по существующим объектам, если для свойства System.Management.Automation.Provider.КомандлетProvider.Force* задано значение true. Например, поставщик FileSystem не будет копировать C:\temp\abc.txt по существующему файлу C:\bar.txt, если для свойства System.Management.Automation.Provider.CmdletProvider.Force* задано значение true. Если путь, указанный в параметре destination, существует и является контейнером, свойство System.Management.Automation.Provider.КомандлетProvider.Force* не требуется. В этом случае System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* должен переместить элемент, указанный параметром path, в контейнер, указанный параметром destination в качестве дочернего.

Реализация метода System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* должна вызывать метод System.Management.Automation.Provider.КомандлетProvider.ShouldProcess перед внесением изменений в хранилище данных. Этот метод используется для подтверждения выполнения операции при изменении состояния системы, например при удалении файлов. System.Management.Automation.Provider.КомандлетProvider.ShouldProcess отправляет имя ресурса, которое нужно изменить пользователю, при этом среда выполнения Windows PowerShell учитывает все параметры командной строки или переменные предпочтения при определении того, что должно отображаться пользователю.

После вызова System.Management.Automation.Provider.КомандлетProvider.ShouldProcess возвращает true, метод System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* должен вызывать метод System.Management.Automation.Provider.КомандлетProvider.ShouldContinue. Этот метод отправляет пользователю сообщение, чтобы разрешить обратную связь, если операция должна продолжаться. Поставщик должен вызывать System.Management.Automation.Provider.КомандлетProvider.ShouldContinue в качестве дополнительной проверки потенциально опасных изменений системы.

Присоединение динамических параметров к командлету Move-Item

Иногда командлету Move-Item требуются дополнительные параметры, предоставляемые динамически во время выполнения. Для предоставления этих динамических параметров поставщик навигации должен реализовать метод System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters*, чтобы получить необходимые значения параметров из элемента по указанному пути, и вернуть объект, имеющий свойства и поля с синтаксическим атрибутами, похожими на класс командлета или System.Management.Automation.RuntimeDefinedParameterDictionary.

Этот метод не реализуется поставщиком навигации. Однако следующий код является реализацией по умолчанию System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters*.

Нормализация относительного пути

Поставщик навигации реализует метод System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* для нормализации полного пути, указанного в параметре path относительно пути, заданного параметром basePath. Метод возвращает строковое представление нормализованного пути. Он записывает ошибку, если параметр path указывает несуществующий путь.

Пример поставщика навигации не переопределяет этот метод. Ниже приведена реализация по умолчанию.

Что следует помнить о реализации NormalizeRelativePath

Реализация System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* должна анализировать параметр path, но не обязательно использовать чисто синтаксический синтаксический анализ. Рекомендуется разработать этот метод, чтобы использовать путь для поиска сведений о пути в хранилище данных и создания пути, соответствующего синтаксису регистра и стандартизованного пути.

Пример кода

Полный пример кода см. в примере кода AccessDbProviderSample05.

Определение типов объектов и форматирования

Поставщик может добавлять элементы в существующие объекты или определять новые объекты. Дополнительные сведения см. врасширении типов объектов и форматировании.

Создание поставщика Windows PowerShell

Дополнительные сведения см. в разделе Регистрация командлетов, поставщиков иведущих приложений.

Тестирование поставщика Windows PowerShell

Если поставщик Windows PowerShell зарегистрирован в Windows PowerShell, его можно проверить, выполнив поддерживаемые командлеты в командной строке, включая командлеты, доступные путем производных. В этом примере тестируется пример поставщика навигации.

  1. Запустите новую оболочку и используйте командлет Set-Location, чтобы задать путь для указания базы данных Access.

    Set-Location mydb:
    
  2. Теперь запустите командлет Get-ChildItem, чтобы получить список элементов базы данных, которые являются доступными таблицами базы данных. Для каждой таблицы этот командлет также получает количество строк таблицы.

    Get-ChildItem | Format-Table RowCount, Name -AutoSize
    
    RowCount   Name
    --------   ----
         180   MSysAccessObjects
           0   MSysACEs
           1   MSysCmdbars
           0   MSysIMEXColumns
           0   MSysIMEXSpecs
           0   MSysObjects
           0   MSysQueries
           7   MSysRelationships
           8   Categories
          91   Customers
           9   Employees
        2155   Order Details
         830   Orders
          77   Products
           3   Shippers
          29   Suppliers
    
  3. Используйте командлет Set-Location еще раз, чтобы задать расположение таблицы данных Employees.

    Set-Location Employees
    
  4. Теперь используйте командлет Get-Location для получения пути к таблице Employees.

    Get-Location
    
    Path
    ----
    mydb:\Employees
    
  5. Теперь используйте командлет Get-ChildItem, который передан в командлет Format-Table. Этот набор командлетов извлекает элементы для таблицы данных Employees, которые являются строками таблицы. Они форматируются в соответствии с командлетом Format-Table.

    Get-ChildItem | Format-Table RowNumber, PSIsContainer, Data -AutoSize
    
    RowNumber   PSIsContainer   Data
    ---------   --------------   ----
    0           False            System.Data.DataRow
    1           False            System.Data.DataRow
    2           False            System.Data.DataRow
    3           False            System.Data.DataRow
    4           False            System.Data.DataRow
    5           False            System.Data.DataRow
    6           False            System.Data.DataRow
    7           False            System.Data.DataRow
    8           False            System.Data.DataRow
    
  6. Теперь можно запустить командлет Get-Item, чтобы получить элементы для строки 0 таблицы данных Employees.

    Get-Item 0
    
    PSPath        : AccessDB::C:\PS\Northwind.mdb\Employees\0
    PSParentPath  : AccessDB::C:\PS\Northwind.mdb\Employees
    PSChildName   : 0
    PSDrive       : mydb
    PSProvider    : System.Management.Automation.ProviderInfo
    PSIsContainer : False
    Data           : System.Data.DataRow
    RowNumber      : 0
    
  7. Используйте командлет Get-Item еще раз, чтобы получить данные сотрудника для элементов в строке 0.

    (Get-Item 0).Data
    
    EmployeeID      : 1
    LastName        : Davis
    FirstName       : Sara
    Title           : Sales Representative
    TitleOfCourtesy : Ms.
    BirthDate       : 12/8/1968 12:00:00 AM
    HireDate        : 5/1/1992 12:00:00 AM
    Address         : 4567 Main Street
                      Apt. 2A
    City            : Buffalo
    Region          : NY
    PostalCode      : 98052
    Country         : USA
    HomePhone       : (206) 555-9857
    Extension       : 5467
    Photo           : EmpID1.bmp
    Notes           : Education includes a BA in psychology from
                      Colorado State University. She also completed "The
                      Art of the Cold Call."  Nancy is a member of
                      Toastmasters International.
    ReportsTo       : 2
    

См. также

создание поставщиков Windows PowerShell

проектирование поставщика Windows PowerShell

расширения типов объектов и форматирования

реализация поставщика Windows PowerShell для контейнеров

Регистрация командлетов, поставщиков и ведущих приложений

руководство программиста Windows PowerShell

пакета SDK для Windows PowerShell