Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом разделе описывается создание поставщика навигации 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, его можно проверить, выполнив поддерживаемые командлеты в командной строке, включая командлеты, доступные путем производных. В этом примере тестируется пример поставщика навигации.
Запустите новую оболочку и используйте командлет
Set-Location
, чтобы задать путь для указания базы данных Access.Set-Location mydb:
Теперь запустите командлет
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
Используйте командлет
Set-Location
еще раз, чтобы задать расположение таблицы данных Employees.Set-Location Employees
Теперь используйте командлет
Get-Location
для получения пути к таблице Employees.Get-Location
Path ---- mydb:\Employees
Теперь используйте командлет
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
Теперь можно запустить командлет
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
Используйте командлет
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
PowerShell