Создание поставщика контейнеров Windows PowerShell
в этом разделе описывается создание поставщика Windows PowerShell, который может работать с хранилищами данных с несколькими уровнями. Для этого типа хранилища данных верхний уровень хранилища содержит корневые элементы, а каждый последующий уровень называется узлом дочерних элементов. Разрешая пользователю работать с этими дочерними узлами, пользователь может выполнять иерархическую работу через хранилище данных.
поставщики, которые могут работать с многоуровневые хранилищами данных, называются поставщиками контейнеров Windows PowerShell. однако имейте в виду, что поставщик контейнера Windows PowerShell можно использовать только при наличии одного контейнера (без вложенных контейнеров) с элементами в нем. при наличии вложенных контейнеров необходимо реализовать Windows PowerShellный поставщик навигации. дополнительные сведения о реализации поставщика навигации Windows PowerShell см. в разделе создание поставщика навигации Windows PowerShell.
Примечание
исходный файл C# (AccessDBSampleProvider04. cs) для этого поставщика можно скачать с помощью пакета средств разработки Microsoft Windows Software Development Kit для компонентов среды выполнения Windows Vista и платформа .NET Framework 3,0. инструкции по загрузке см. в статье установка Windows PowerShell и загрузка пакета SDK для Windows PowerShell. Скачанные исходные файлы доступны в <PowerShell Samples> каталоге. дополнительные сведения о других реализациях поставщиков Windows PowerShell см. в разделе разработка поставщика Windows PowerShell.
поставщик контейнера Windows PowerShell, описанный здесь, определяет базу данных в качестве единого контейнера с таблицами и строками базы данных, определенными в качестве элементов контейнера.
Внимание!
Имейте в виду, что в этом проекте предполагается, что база данных имеет поле с ИДЕНТИФИКАТОРом Name, а тип поля — Лонгинтежер.
определение класса поставщика контейнера Windows PowerShell
поставщик контейнера Windows PowerShell должен определять класс .net, производный от базового класса System. Management. Automation. provider. контаинеркмдлетпровидер . ниже приведено определение класса для поставщика контейнера Windows PowerShell, описанного в этом разделе.
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : ContainerCmdletProvider
Обратите внимание, что в этом определении класса атрибут System. Management. Automation. Provider. кмдлетпровидераттрибуте включает два параметра. Первый параметр задает понятное имя для поставщика, используемого Windows PowerShell. второй параметр задает Windows PowerShell конкретные возможности, предоставляемые поставщиком для среды выполнения Windows PowerShell во время обработки команды. для этого поставщика нет Windows PowerShell конкретных возможностей, которые вы добавили.
Определение базовых функций
как описано в разделе проектирование поставщика Windows PowerShell, класс System. Management. Automation. Provider. контаинеркмдлетпровидер является производным от нескольких других классов, предоставилих различные функции поставщика. таким образом, поставщик контейнера Windows PowerShell должен определить все функциональные возможности, предоставляемые этими классами.
сведения о реализации функций для добавления сведений об инициализации для конкретного сеанса и освобождения ресурсов, используемых поставщиком, см. в разделе создание базового поставщика Windows PowerShell. Однако большинство поставщиков (включая описанный здесь поставщик) могут использовать реализацию этой функции по умолчанию, предоставляемую Windows PowerShell.
Чтобы получить доступ к хранилищу данных, поставщик должен реализовать методы базового класса System. Management. Automation. Provider. дривекмдлетпровидер . дополнительные сведения о реализации этих методов см. в разделе создание поставщика Windows PowerShell диска.
Чтобы управлять элементами хранилища данных, такими как получение, установка и очистка элементов, поставщик должен реализовать методы, предоставляемые базовым классом System. Management. Automation. Provider. итемкмдлетпровидер . дополнительные сведения о реализации этих методов см. в разделе создание поставщика Windows PowerShell элемента.
Получение дочерних элементов
чтобы получить дочерний элемент, поставщик контейнера Windows PowerShell должен переопределить метод System. Management. Automation. provider. контаинеркмдлетпровидер. жетчилдитемс * для поддержки вызовов из Get-ChildItem
командлета. Этот метод получает дочерние элементы из хранилища данных и записывает их в конвейер в виде объектов. Если recurse
указан параметр командлета, метод получает все дочерние элементы независимо от того, на каком уровне они находятся. Если recurse
параметр не указан, метод извлекает только один уровень дочерних элементов.
Ниже приведена реализация метода System. Management. Automation. Provider. контаинеркмдлетпровидер. жетчилдитемс * для этого поставщика. Обратите внимание, что этот метод получает дочерние элементы во всех таблицах базы данных, если путь указывает на базу данных Access, и получает дочерние элементы из строк этой таблицы, если путь указывает на таблицу данных.
protected override void GetChildItems(string path, bool recurse)
{
// If path represented is a drive then the children in the path are
// tables. Hence all tables in the drive represented will have to be
// returned
if (PathIsDrive(path))
{
foreach (DatabaseTableInfo table in GetTables())
{
WriteItemObject(table, path, true);
// if the specified item exists and recurse has been set then
// all child items within it have to be obtained as well
if (ItemExists(path) && recurse)
{
GetChildItems(path + pathSeparator + table.Name, recurse);
}
} // foreach (DatabaseTableInfo...
} // if (PathIsDrive...
else
{
// Get the table name, row number and type of path from the
// path specified
string tableName;
int rowNumber;
PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
if (type == PathType.Table)
{
// Obtain all the rows within the table
foreach (DatabaseRowInfo row in GetRows(tableName))
{
WriteItemObject(row, path + pathSeparator + row.RowNumber,
false);
} // foreach (DatabaseRowInfo...
}
else if (type == PathType.Row)
{
// In this case the user has directly specified a row, hence
// just give that particular row
DatabaseRowInfo row = GetRow(tableName, rowNumber);
WriteItemObject(row, path + pathSeparator + row.RowNumber,
false);
}
else
{
// In this case, the path specified is not valid
ThrowTerminatingInvalidPathException(path);
}
} // else
} // GetChildItems
Вопросы, связанные с реализацией Жетчилдитемс
Следующие условия могут применяться к реализации System. Management. Automation. Provider. контаинеркмдлетпровидер. жетчилдитемс *:
при определении класса поставщика Windows PowerShell поставщик контейнера может объявлять возможности поставщика експандвилдкардс, Filter, Include или Exclude из перечисления System. Management. Automation. provider. провидеркапабилитиес . В таких случаях реализация метода System. Management. Automation. Provider. контаинеркмдлетпровидер. жетчилдитемс * должна обеспечить соответствие пути, переданного методу, требованиям указанных возможностей. Для этого метод должен получить доступ к соответствующему свойству, например к свойствам System. Management. Automation. Provider. кмдлетпровидер. Exclude * и System. Management. Automation. Provider. кмдлетпровидер. include * .
Реализация этого метода должна учитывать любую форму доступа к элементу, который может сделать элемент видимым для пользователя. например, если пользователь имеет доступ на запись к файлу через поставщик FileSystem (предоставленный Windows PowerShell), но не имеет доступа на чтение, файл все еще существует, а System. Management. Automation. provider. итемкмдлетпровидер. итемексистс * возвращает
true
. Для реализации может потребоваться проверка родительского элемента, чтобы узнать, можно ли перечислить дочерний элемент.При записи нескольких элементов метод System. Management. Automation. Provider. контаинеркмдлетпровидер. жетчилдитемс * может занять некоторое время. Вы можете спроектировать поставщик для записи элементов с помощью метода System. Management. автоматизации. Provider. кмдлетпровидер. вритеитемобжект * по одному за раз. При использовании этого метода элементы будут представлены пользователю в потоке.
Реализация System. Management. Automation. Provider. контаинеркмдлетпровидер. жетчилдитемс * отвечает за предотвращение бесконечной рекурсии при наличии циклических ссылок и подобной. Для отражения такого условия должно быть создано соответствующее завершающее исключение.
Присоединение динамических параметров к командлету Get-ChildItem
Иногда Get-ChildItem
командлет, вызывающий System. Management. Automation. Provider. Контаинеркмдлетпровидер. жетчилдитемс * , требует дополнительных параметров, заданных динамически во время выполнения. чтобы предоставить эти динамические параметры, поставщик контейнера Windows PowerShell должен реализовать метод System. Management. автоматизации. provider. контаинеркмдлетпровидер. жетчилдитемсдинамикпараметерс * . Этот метод получает динамические параметры для элемента по указанному пути и возвращает объект со свойствами и полями с атрибутами синтаксического анализа, похожими на класс командлета или объект System. Management. Automation. рунтимедефинедпараметердиктионари . среда выполнения Windows PowerShell использует возвращаемый объект для добавления параметров в Get-ChildItem
командлет.
поставщик контейнеров Windows PowerShell не реализует этот метод. Однако приведенный ниже код является реализацией этого метода по умолчанию.
Получение имен дочерних элементов
чтобы получить имена дочерних элементов, поставщик контейнера Windows PowerShell должен переопределить метод System. Management. Automation. provider. контаинеркмдлетпровидер. жетчилднамес * для поддержки вызовов из Get-ChildItem
командлета, если его Name
параметр указан. Этот метод получает имена дочерних элементов для указанных пути или имен дочерних элементов для всех контейнеров, если returnAllContainers
указан параметр командлета. Дочернее имя — это конечная часть пути. Например, дочерним именем для пути c:\windows\system32\abc.dll является "abc.dll". Дочернее имя каталога c:\Windows\System32 — System32.
Ниже приведена реализация метода System. Management. Automation. Provider. контаинеркмдлетпровидер. жетчилднамес * для этого поставщика. Обратите внимание, что метод получает имена таблиц, если указанный путь указывает на базу данных Access (диск) и номера строк, если путь указывает на таблицу.
protected override void GetChildNames(string path,
ReturnContainers returnContainers)
{
// If the path represented is a drive, then the child items are
// tables. get the names of all the tables in the drive.
if (PathIsDrive(path))
{
foreach (DatabaseTableInfo table in GetTables())
{
WriteItemObject(table.Name, path, true);
} // foreach (DatabaseTableInfo...
} // if (PathIsDrive...
else
{
// Get type, table name and row number from path specified
string tableName;
int rowNumber;
PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
if (type == PathType.Table)
{
// Get all the rows in the table and then write out the
// row numbers.
foreach (DatabaseRowInfo row in GetRows(tableName))
{
WriteItemObject(row.RowNumber, path, false);
} // foreach (DatabaseRowInfo...
}
else if (type == PathType.Row)
{
// In this case the user has directly specified a row, hence
// just give that particular row
DatabaseRowInfo row = GetRow(tableName, rowNumber);
WriteItemObject(row.RowNumber, path, false);
}
else
{
ThrowTerminatingInvalidPathException(path);
}
} // else
} // GetChildNames
Вопросы, связанные с реализацией Жетчилднамес
Следующие условия могут применяться к реализации System. Management. Automation. Provider. контаинеркмдлетпровидер. жетчилдитемс *:
при определении класса поставщика Windows PowerShell поставщик контейнера может объявлять возможности поставщика експандвилдкардс, Filter, Include или Exclude из перечисления System. Management. Automation. provider. провидеркапабилитиес . В таких случаях реализация метода System. Management. Automation. Provider. контаинеркмдлетпровидер. жетчилдитемс * должна обеспечить соответствие пути, переданного методу, требованиям указанных возможностей. Для этого метод должен получить доступ к соответствующему свойству, например к свойствам System. Management. Automation. Provider. кмдлетпровидер. Exclude * и System. Management. Automation. Provider. кмдлетпровидер. include * .
Примечание
Исключение из этого правила возникает при
returnAllContainers
указании параметра командлета. В этом случае метод должен получить любое дочернее имя для контейнера, даже если оно не соответствует значениям свойств System. Management. Automation. Provider. кмдлетпровидер. Filter *, System. Management. Automation. Provider. кмдлетпровидер. include *или System. Management. Automation. Provider. кмдлетпровидер. Exclude * .По умолчанию переопределения этого метода не должны извлекать имена объектов, которые обычно скрыты от пользователя, если не указано свойство System. Management. Automation. Provider. кмдлетпровидер. Force * . Если указанный путь указывает на контейнер, свойство System. Management. Automation. Provider. кмдлетпровидер. Force * не является обязательным.
Реализация System. Management. Automation. Provider. контаинеркмдлетпровидер. жетчилднамес * отвечает за предотвращение бесконечной рекурсии при наличии циклических ссылок и подобной. Для отражения такого условия должно быть создано соответствующее завершающее исключение.
Присоединение динамических параметров к командлету Get-ChildItem (Name)
Иногда Get-ChildItem
командлету (с Name
параметром) требуются дополнительные параметры, заданные динамически во время выполнения. чтобы предоставить эти динамические параметры, поставщик контейнера Windows PowerShell должен реализовать метод System. Management. автоматизации. provider. контаинеркмдлетпровидер. жетчилднамесдинамикпараметерс * . Этот метод получает динамические параметры для элемента по указанному пути и возвращает объект со свойствами и полями с атрибутами синтаксического анализа, похожими на класс командлета или объект System. Management. Automation. рунтимедефинедпараметердиктионари . среда выполнения Windows PowerShell использует возвращаемый объект для добавления параметров в Get-ChildItem
командлет.
Этот метод не реализуется этим поставщиком. Однако приведенный ниже код является реализацией этого метода по умолчанию.
Переименование элементов
для переименования элемента поставщик контейнера Windows PowerShell должен переопределять метод System. Management. Automation. provider. контаинеркмдлетпровидер. ренамеитем * для поддержки вызовов из Rename-Item
командлета. Этот метод изменяет имя элемента по указанному пути на новое указанное имя. Новое имя всегда должно относиться к родительскому элементу (контейнеру).
Этот поставщик не переопределяет метод System. Management. Automation. Provider. контаинеркмдлетпровидер. ренамеитем * . Однако ниже приведена реализация по умолчанию.
Вопросы, связанные с реализацией Ренамеитем
Следующие условия могут применяться к реализации System. Management. Automation. Provider. контаинеркмдлетпровидер. ренамеитем *:
при определении класса поставщика Windows PowerShell поставщик контейнера может объявлять возможности поставщика експандвилдкардс, Filter, Include или Exclude из перечисления System. Management. Automation. provider. провидеркапабилитиес . В таких случаях реализация метода System. Management. Automation. Provider. контаинеркмдлетпровидер. жетчилдитемс * должна обеспечить соответствие пути, переданного методу, требованиям указанных возможностей. Для этого метод должен получить доступ к соответствующему свойству, например к свойствам System. Management. Automation. Provider. кмдлетпровидер. Exclude * и System. Management. Automation. Provider. кмдлетпровидер. include * .
Метод System. Management. Automation. Provider. контаинеркмдлетпровидер. ренамеитем * предназначен только для изменения имени элемента, а не для операций перемещения. Ваша реализация метода должна записать ошибку
newName
, если параметр содержит разделители пути, или, в противном случае, заставит элемент изменить его родительское расположение.По умолчанию переопределения этого метода не должны переименовывать объекты, если не указано свойство System. Management. Automation. Provider. кмдлетпровидер. Force * . Если указанный путь указывает на контейнер, свойство System. Management. Automation. Provider. кмдлетпровидер. Force * не является обязательным.
Реализация метода System. Management. Automation. Provider. контаинеркмдлетпровидер. ренамеитем * должна вызывать System. Management. Automation. Provider. кмдлетпровидер. ShouldProcess и проверять его возвращаемое значение перед внесением любых изменений в хранилище данных. Этот метод используется для подтверждения выполнения операции при внесении изменений в состояние системы, например при переименовании файлов. System. Management. Automation. Provider. кмдлетпровидер. ShouldProcess отправляет имя ресурса, который будет изменен пользователю, с Windows PowerShell среда выполнения учитывает все параметры командной строки или привилегированные переменные в определении того, что следует отображать.
После того как вызов метода System. Management. Automation. Provider. кмдлетпровидер. ShouldProcess возвращает
true
, метод System. Management. Automation. Provider. контаинеркмдлетпровидер. ренамеитем * должен вызвать метод System. Management. Automation. Provider. кмдлетпровидер. ShouldContinue . Этот метод отправляет пользователю сообщение с подтверждением, чтобы разрешить дополнительные отзывы, чтобы сказать, следует ли продолжать операцию. Поставщик должен вызывать System. Management. Automation. Provider. кмдлетпровидер. ShouldContinue в качестве дополнительной проверки потенциально опасной модификации системы.
Присоединение динамических параметров к командлету Rename-Item
Иногда Rename-Item
командлету требуются дополнительные параметры, которые задаются динамически во время выполнения. чтобы предоставить эти динамические параметры, Windows PowerShell поставщик контейнера должен реализовать метод System. Management. Automation. provider. контаинеркмдлетпровидер. ренамеитемдинамикпараметерс * . Этот метод получает параметры для элемента по указанному пути и возвращает объект со свойствами и полями с атрибутами синтаксического анализа, похожими на класс командлета или объект System. Management. Automation. рунтимедефинедпараметердиктионари . среда выполнения Windows PowerShell использует возвращаемый объект для добавления параметров в Rename-Item
командлет.
Этот метод не реализуется этим поставщиком контейнера. Однако приведенный ниже код является реализацией этого метода по умолчанию.
Создание новых элементов
Для создания новых элементов поставщик контейнера должен реализовать метод System. Management. Automation. Provider. контаинеркмдлетпровидер. newItem * для поддержки вызовов из New-Item
командлета. Этот метод создает элемент данных, расположенный по указанному пути. type
Параметр командлета содержит тип, определяемый поставщиком для нового элемента. Например, Поставщик FileSystem использует type
параметр со значением "File" или "Directory". newItemValue
Параметр командлета задает зависящее от поставщика значение для нового элемента.
Ниже приведена реализация метода System. Management. Automation. Provider. контаинеркмдлетпровидер. newItem * для этого поставщика.
protected override void NewItem( string path, string type, object newItemValue )
{
// Create the new item here after
// performing necessary validations
//
// WriteItemObject(newItemValue, path, false);
// Example
//
// if (ShouldProcess(path, "new item"))
// {
// // Create a new item and then call WriteObject
// WriteObject(newItemValue, path, false);
// }
} // NewItem
{
case 1:
{
string name = pathChunks[0];
if (TableNameIsValid(name))
{
tableName = name;
retVal = PathType.Table;
}
}
break;
case 2:
{
string name = pathChunks[0];
Вопросы, связанные с реализацией NewItem
Следующие условия могут применяться к реализации System. Management. Automation. Provider. контаинеркмдлетпровидер. newItem *:
Метод System. Management. Automation. Provider. контаинеркмдлетпровидер. newItem * должен выполнять сравнение строки, переданной в параметре, без учета регистра
type
. Он также должен позволять наименее неоднозначные совпадения. Например, для типов "File" и "Directory" для устранения неоднозначности требуется только первая буква. Еслиtype
параметр указывает тип, который поставщик не может создать, метод System. Management. Automation. Provider. Контаинеркмдлетпровидер. newItem * должен записать исключение типа ArgumentException с сообщением, указывающим типы, которые может создать поставщик.Для
newItemValue
параметра рекомендуется реализовать метод System. Management. Automation. Provider. Контаинеркмдлетпровидер. newItem * , чтобы принимать строки как минимум. Он также должен принять тип объекта, который извлекается методом System. Management. Automation. Provider. итемкмдлетпровидер. GetObject * для того же пути. Метод System. Management. Automation. Provider. контаинеркмдлетпровидер. newItem * может использовать метод System. Management. Automation. Languageprimitives. ConvertTo * для преобразования типов в нужный тип.Реализация метода System. Management. Automation. Provider. контаинеркмдлетпровидер. newItem * должна вызывать System. Management. Automation. Provider. кмдлетпровидер. ShouldProcess и проверять его возвращаемое значение перед внесением любых изменений в хранилище данных. После вызова метода System. Management. Automation. Provider. кмдлетпровидер. ShouldProcess возвращает значение true, метод System. Management. Automation. Provider. контаинеркмдлетпровидер. newItem * должен вызывать метод System. Management. Automation. Provider. кмдлетпровидер. ShouldContinue в качестве дополнительной проверки потенциально опасной модификации системы.
Присоединение динамических параметров к командлету New-Item
Иногда New-Item
командлету требуются дополнительные параметры, которые задаются динамически во время выполнения. Чтобы предоставить эти динамические параметры, поставщик контейнера должен реализовать метод System. Management. автоматизации. Provider. контаинеркмдлетпровидер. невитемдинамикпараметерс * . Этот метод получает параметры для элемента по указанному пути и возвращает объект со свойствами и полями с атрибутами синтаксического анализа, похожими на класс командлета или объект System. Management. Automation. рунтимедефинедпараметердиктионари . среда выполнения Windows PowerShell использует возвращаемый объект для добавления параметров в New-Item
командлет.
Этот метод не реализуется этим поставщиком. Однако приведенный ниже код является реализацией этого метода по умолчанию.
Удаление элементов
чтобы удалить элементы, поставщик Windows PowerShell должен переопределить метод System. Management. Automation. provider. контаинеркмдлетпровидер. Removeitem * для поддержки вызовов из Remove-Item
командлета. Этот метод удаляет элемент из хранилища данных по указанному пути. Если recurse
параметр Remove-Item
командлета имеет значение true
, метод удаляет все дочерние элементы независимо от их уровня. Если параметр имеет значение false
, метод удаляет только один элемент по указанному пути.
Этот поставщик не поддерживает удаление элементов. Однако следующий код является реализацией класса System. Management. Automation. Provider. контаинеркмдлетпровидер. RemoveItem *по умолчанию.
Вопросы, связанные с реализацией RemoveItem
Следующие условия могут применяться к реализации System. Management. Automation. Provider. контаинеркмдлетпровидер. newItem *:
при определении класса поставщика Windows PowerShell поставщик контейнера может объявлять возможности поставщика експандвилдкардс, Filter, Include или Exclude из перечисления System. Management. Automation. provider. провидеркапабилитиес . В таких случаях реализация метода System. Management. Automation. Provider. контаинеркмдлетпровидер. жетчилдитемс * должна обеспечить соответствие пути, переданного методу, требованиям указанных возможностей. Для этого метод должен получить доступ к соответствующему свойству, например к свойствам System. Management. Automation. Provider. кмдлетпровидер. Exclude * и System. Management. Automation. Provider. кмдлетпровидер. include * .
По умолчанию переопределения этого метода не должны удалять объекты, если свойство System. Management. Automation. Provider. кмдлетпровидер. Force * не имеет значение true. Если указанный путь указывает на контейнер, свойство System. Management. Automation. Provider. кмдлетпровидер. Force * не является обязательным.
Реализация System. Management. Automation. Provider. контаинеркмдлетпровидер. RemoveItem * отвечает за предотвращение бесконечной рекурсии при наличии циклических ссылок и подобной. Для отражения такого условия должно быть создано соответствующее завершающее исключение.
Реализация метода System. Management. Automation. Provider. контаинеркмдлетпровидер. RemoveItem * должна вызывать System. Management. Automation. Provider. кмдлетпровидер. ShouldProcess и проверять его возвращаемое значение перед внесением любых изменений в хранилище данных. После того как вызов метода System. Management. Automation. Provider. кмдлетпровидер. ShouldProcess возвращает
true
, метод System. Management. Automation. Provider. контаинеркмдлетпровидер. RemoveItem * должен вызывать метод System. Management. Automation. Provider. кмдлетпровидер. ShouldContinue в качестве дополнительной проверки потенциально опасной модификации системы.
Присоединение динамических параметров к командлету Remove-Item
Иногда Remove-Item
командлету требуются дополнительные параметры, которые задаются динамически во время выполнения. Чтобы предоставить эти динамические параметры, поставщик контейнера должен реализовать метод System. Management. Automation. Provider. контаинеркмдлетпровидер. ремовеитемдинамикпараметерс * для работы с этими параметрами. Этот метод получает динамические параметры для элемента по указанному пути и возвращает объект со свойствами и полями с атрибутами синтаксического анализа, похожими на класс командлета или объект System. Management. Automation. рунтимедефинедпараметердиктионари . среда выполнения Windows PowerShell использует возвращаемый объект для добавления параметров в Remove-Item
командлет.
Этот метод не реализуется этим поставщиком контейнера. Однако следующий код является реализацией класса System. Management. Automation. Provider. контаинеркмдлетпровидер. ремовеитемдинамикпараметерс *по умолчанию.
Запрос дочерних элементов
чтобы проверить существование дочерних элементов по указанному пути, поставщик контейнера Windows PowerShell должен переопределить метод System. Management. Automation. provider. контаинеркмдлетпровидер. хасчилдитемс * . Этот метод возвращает true
, если элемент имеет дочерние элементы, и false
в противном случае. Для неопределенного или пустого пути метод считает, что все элементы в хранилище данных являются дочерними, и возвращает true
.
Ниже приведено переопределение для метода System. Management. Automation. Provider. контаинеркмдлетпровидер. хасчилдитемс * . При наличии более двух частей пути, созданных вспомогательным методом Чункпас, метод возвращает false
, так как определены только контейнер базы данных и контейнер таблицы. дополнительные сведения об этом вспомогательном методе см. в описании метода чункпас в разделе создание поставщика Windows PowerShell элемента.
protected override bool HasChildItems( string path )
{
return false;
} // HasChildItems
ErrorCategory.InvalidOperation, tableName));
}
return results;
Вопросы, связанные с реализацией Хасчилдитемс
Следующие условия могут применяться к реализации System. Management. Automation. Provider. контаинеркмдлетпровидер. хасчилдитемс *:
- Если поставщик контейнеров предоставляет корень, который содержит интересные точки подключения, реализация метода System. Management. Automation. Provider. контаинеркмдлетпровидер. хасчилдитемс * должна возвращать,
true
когда для пути передается значение null или пустая строка.
Копирование элементов
Для копирования элементов поставщик контейнера должен реализовать метод System. Management. Automation. Provider. контаинеркмдлетпровидер. CopyItem для поддержки вызовов из Copy-Item
командлета. Этот метод копирует элемент данных из расположения, указанного path
параметром командлета, в расположение, указанное copyPath
параметром. Если recurse
указан параметр, метод копирует все подконтейнеры. Если параметр не указан, метод копирует только один уровень элементов.
Этот метод не реализуется этим поставщиком. Однако следующий код является реализацией класса System. Management. Automation. Provider. контаинеркмдлетпровидер. CopyItemпо умолчанию.
Вопросы, связанные с реализацией CopyItem
Следующие условия могут применяться к реализации System. Management. Automation. Provider. контаинеркмдлетпровидер. CopyItem:
при определении класса поставщика Windows PowerShell поставщик контейнера может объявлять возможности поставщика експандвилдкардс, Filter, Include или Exclude из перечисления System. Management. Automation. provider. провидеркапабилитиес . В таких случаях реализация метода System. Management. Automation. Provider. контаинеркмдлетпровидер. жетчилдитемс * должна обеспечить соответствие пути, переданного методу, требованиям указанных возможностей. Для этого метод должен получить доступ к соответствующему свойству, например к свойствам System. Management. Automation. Provider. кмдлетпровидер. Exclude * и System. Management. Automation. Provider. кмдлетпровидер. include * .
По умолчанию переопределения этого метода не должны копировать объекты поверх существующих объектов, если свойство System. Management. Automation. Provider. кмдлетпровидер. Force * не имеет значение
true
. Например, Поставщик FileSystem не копирует c:\temp\abc.txt в существующий файл c:\abc.txt, если свойство System. Management. Automation. Provider. кмдлетпровидер. Force * не имеет значениеtrue
. Если путь, указанный вcopyPath
параметре, существует и указывает на контейнер, свойство System. Management. Automation. Provider. Кмдлетпровидер. Force * не является обязательным. В этом случае System. Management. Automation. Provider. контаинеркмдлетпровидер. CopyItem должен скопировать элемент, указанныйpath
параметром, в контейнер, указанныйcopyPath
параметром в качестве дочернего.Реализация System. Management. Automation. Provider. контаинеркмдлетпровидер. CopyItem отвечает за предотвращение бесконечной рекурсии при наличии циклических ссылок и подобной. Для отражения такого условия должно быть создано соответствующее завершающее исключение.
Реализация метода System. Management. Automation. Provider. контаинеркмдлетпровидер. CopyItem должна вызывать System. Management. Automation. Provider. кмдлетпровидер. ShouldProcess и проверять его возвращаемое значение перед внесением любых изменений в хранилище данных. После вызова метода System. Management. Automation. Provider. кмдлетпровидер. ShouldProcess возвращает значение true, метод System. Management. Automation. Provider. контаинеркмдлетпровидер. CopyItem должен вызывать метод System. Management. Automation. Provider. кмдлетпровидер. ShouldContinue в качестве дополнительной проверки потенциально опасной модификации системы. Дополнительные сведения о вызове этих методов см. в разделе Rename Items.
Присоединение динамических параметров к командлету Copy-Item
Иногда Copy-Item
командлету требуются дополнительные параметры, которые задаются динамически во время выполнения. чтобы предоставить эти динамические параметры, поставщик контейнера Windows PowerShell должен реализовать метод System. Management. Automation. provider. контаинеркмдлетпровидер. копитемдинамикпараметерс * , чтобы обрабатывал эти параметры. Этот метод получает параметры для элемента по указанному пути и возвращает объект со свойствами и полями с атрибутами синтаксического анализа, похожими на класс командлета или объект System. Management. Automation. рунтимедефинедпараметердиктионари . среда выполнения Windows PowerShell использует возвращаемый объект для добавления параметров в Copy-Item
командлет.
Этот метод не реализуется этим поставщиком. Однако следующий код является реализацией класса System. Management. Automation. Provider. контаинеркмдлетпровидер. копитемдинамикпараметерс *по умолчанию.
Образец кода
Полный пример кода см. в разделе пример кода AccessDbProviderSample04.
создание поставщика Windows PowerShell
См. раздел Регистрация командлетов, поставщиков и ведущих приложений.
тестирование поставщика Windows PowerShell
когда поставщик Windows PowerShell зарегистрирован в Windows PowerShell, его можно проверить, запустив в командной строке поддерживаемые командлеты. Имейте в виду, что в следующем примере выходных данных используется вымышленная БД Access.
Выполните
Get-ChildItem
командлет, чтобы получить список дочерних элементов из таблицы Customers в базе данных Access.Get-ChildItem mydb:customers
Появится следующий результат.
PSPath : AccessDB::customers PSDrive : mydb PSProvider : System.Management.Automation.ProviderInfo PSIsContainer : True Data : System.Data.DataRow Name : Customers RowCount : 91 Columns :
Запустите
Get-ChildItem
командлет еще раз, чтобы получить данные таблицы.(Get-ChildItem mydb:customers).data
Появится следующий результат.
TABLE_CAT : c:\PS\northwind TABLE_SCHEM : TABLE_NAME : Customers TABLE_TYPE : TABLE REMARKS :
Теперь используйте
Get-Item
командлет для получения элементов в строке 0 в таблице данных.Get-Item mydb:\customers\0
Появится следующий результат.
PSPath : AccessDB::customers\0 PSDrive : mydb PSProvider : System.Management.Automation.ProviderInfo PSIsContainer : False Data : System.Data.DataRow RowNumber : 0
Повторное использование
Get-Item
для получения данных для элементов в строке 0.(Get-Item mydb:\customers\0).data
Появится следующий результат.
CustomerID : 1234 CompanyName : Fabrikam ContactName : Eric Gruber ContactTitle : President Address : 4567 Main Street City : Buffalo Region : NY PostalCode : 98052 Country : USA Phone : (425) 555-0100 Fax : (425) 555-0101
Теперь используйте
New-Item
командлет, чтобы добавить строку в существующую таблицу.Path
Параметр задает полный путь к строке и должен указывать номер строки, который больше, чем существующее число строк в таблице.Type
Параметр указывает "Row", чтобы указать добавляемый тип элемента. Наконец,Value
параметр задает разделенный запятыми список значений столбцов для строки.New-Item -Path mydb:\Customers\3 -ItemType "row" -Value "3,CustomerFirstName,CustomerLastName,CustomerEmailAddress,CustomerTitle,CustomerCompany,CustomerPhone, CustomerAddress,CustomerCity,CustomerState,CustomerZip,CustomerCountry"
Проверьте правильность операции создания элемента следующим образом.
PS mydb:\> cd Customers PS mydb:\Customers> (Get-Item 3).data
Появится следующий результат.
ID : 3 FirstName : Eric LastName : Gruber Email : ericgruber@fabrikam.com Title : President Company : Fabrikam WorkPhone : (425) 555-0100 Address : 4567 Main Street City : Buffalo State : NY Zip : 98052 Country : USA
См. также
создание поставщиков Windows PowerShell
Разработка поставщика Windows PowerShell
реализация поставщика Windows PowerShell элемента
реализация поставщика Windows PowerShell навигации
Регистрация командлетов, поставщиков и ведущих приложений
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по