Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
В этой теме описывается, как создать провайдера Windows PowerShell, который может обрабатывать данные в хранилище данных. В этой теме элементы данных в хранилище называются «элементами» хранилища данных. В результате провайдер, способный обрабатывать данные в хранилище, называется поставщиком элементов Windows PowerShell.
Замечание
Вы можете скачать исходный файл на C# (AccessDBSampleProvider03.cs) для этого провайдера с помощью Microsoft Windows Software Development Kit for Windows Vista и .NET Framework 3.0 Runtime Components. Инструкции по скачиванию смотрите в разделе «Как установить Windows PowerShell» и «Скачать Windows PowerShell SDK».
Загруженные исходные файлы доступны в PowerShell Samples каталоге. Для получения дополнительной информации о других реализациях провайдеров Windows PowerShell см. раздел «Проектирование вашего провайдера Windows PowerShell».
Поставщик элементов Windows PowerShell, описанный в этой теме, получает элементы данных из базы данных Access. В этом случае «элемент» — это либо таблица в базе данных Access, либо строка в таблице.
Определение класса поставщика элементов Windows PowerShell
Поставщик элементов в Windows PowerShell должен определить класс .NET, который производится из базового класса System.Management.Automation.Provider.ItemCmdletProvider . Ниже приведено определение класса для поставщика элементов, описанного в этом разделе.
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : ItemCmdletProvider
Обратите внимание, что в этом определении класса атрибут System.Management.Automation.Provider.CmdletProviderAttribute включает два параметра. Первый параметр задаёт удобное для пользователя имя провайдера, используемое Windows PowerShell. Второй параметр определяет специфические для Windows PowerShell возможности, которые провайдер открывает в процессе выполнения Windows PowerShell во время обработки команд. Для этого провайдера нет дополнительных возможностей, специфичных для Windows PowerShell.
Определение базовой функциональности
Как описано в статье Design Your Windows PowerShell Provider, класс System.Management.Automation.Provider.DriveCmdletProvider происходит из нескольких других классов, предоставлявших разные функциональности провайдеров. Таким образом, поставщик элементов Windows PowerShell должен определить все функции, предоставляемые этими классами.
Для получения дополнительной информации о том, как реализовать функционал добавления информации о инициализации, специфичной для сессии, и для освобождения ресурсов, используемых провайдером, см. раздел Создание базового провайдера Windows PowerShell. Однако большинство провайдеров, включая описанного здесь, могут использовать стандартную реализацию этой функциональности, предоставляемую Windows PowerShell.
Прежде чем провайдер элементов Windows PowerShell сможет управлять элементами в хранилище, он должен реализовать методы базового класса System.Management.Automation.Provider.DriveCmdletProvider для доступа к хранилищу данных. Для получения дополнительной информации о реализации этого класса см. раздел «Создание провайдера дисков Windows PowerShell».
Проверка валидности пути
При поиске элемента данных среда выполнения Windows PowerShell предоставляет провайдеру путь Windows PowerShell, как определено в разделе «PSPath Concepts» в разделе How Windows PowerShell Works. Поставщик элементов Windows PowerShell должен проверить синтаксическую и семантическую достоверность любого переданного ему пути, реализовав метод System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath . Этот метод возвращается true , если путь валиден, и false в противном случае. Имейте в виду, что реализация этого метода не должна проверять существование элемента на пути, а только наличие его синтаксической и семантической корректности.
Вот реализация метода System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath для этого провайдера. Обратите внимание, что эта реализация вызывает вспомогательный метод NormalizePath для преобразования всех сепараторов на пути в однородный.
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;
} // IsValidPath
Определение существования предмета
После проверки пути время выполнения Windows PowerShell должно определить, существует ли элемент данных на этом пути. Для поддержки такого типа запроса провайдер элементов Windows PowerShell реализует метод System.Management.Automation.Provider.ItemCmdletProvider.ItemExists . Этот метод возвращает true элемент, находящийся по указанному пути, и false (по умолчанию) в противном случае.
Вот реализация метода System.Management.Automation.Provider.ItemCmdletProvider.ItemExists для этого провайдера. Обратите внимание, что этот метод вызывает вспомогательные методы PathIsDrive, ChunkPath и GetTable и использует объект DatabaseTableInfo , определённый провайдером.
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;
} // ItemExists
Что нужно помнить о внедрении ItemExists
К вашей реализации System.Management.Automation.Provider.ItemCmdletProvider.ItemExists могут применяться следующие условия:
- При определении класса провайдера поставщик элементов Windows PowerShell может объявить возможности провайдера ,
ExpandWildcardsFilter,Include, илиExclude, из перечисления System.Management.Automation.Provider.ProviderCapabilities. В таких случаях реализация метода System.Management.Automation.Provider.ItemCmdletProvider.ItemExists должна гарантировать, что путь, переданный к методу, соответствует требованиям указанных возможностей. Для этого метод должен получить доступ к соответствующим свойствам, например, к свойствам System.Management.Automation.Provider.CmdletProvider.Exclude и свойствам System.Management.Automation.Provider.CmdletProvider.Include . - Реализация этого метода должна обеспечивать любой доступ к элементу, который может сделать его видимым для пользователя. Например, если у пользователя есть доступ к записи файла через провайдера FileSystem (предоставленного Windows PowerShell), но нет доступа к чтению, файл всё равно существует, и System.Management.Automation.Provider.ItemCmdletProvider.ItemExists возвращает
true. Ваша реализация может потребовать проверки родительского элемента, чтобы узнать, можно ли пересчитать дочерний элемент.
Прикрепление динамических параметров к Test-Path cmdlet
Иногда Test-Path cmdlet, вызывающий System.Management.Automation.Provider.ItemCmdletProvider.ItemExists , требует дополнительных параметров, которые динамически задаются во время выполнения. Для предоставления этих динамических параметров поставщик элементов Windows PowerShell должен реализовать метод System.Management.Automation.Provider.ItemCmdletProvider.ItemExistsDynamicParameters . Этот метод извлекает динамические параметры элемента по указанному пути и возвращает объект с свойствами и полями с атрибутами разбора, похожими на класс cmdlet или объект System.Management.Automation.RuntimeDefinedParameterDictionary . Runtime Windows PowerShell использует возвращённый объект для добавления параметров в Test-Path cmdlet.
Этот провайдер элементов Windows PowerShell не реализует этот метод. Однако следующий код является стандартной реализацией этого метода.
Получение предмета
Чтобы получить элемент, провайдер элементов Windows PowerShell должен переопределить метод System.Management.Automation.Provider.ItemCmdletProvider.GetItem для поддержки вызовов из cmdlet Get-Item . Этот метод записывает элемент с помощью метода System.Management.Automation.Provider.CmdletProvider.WriteItemObject .
Вот реализация метода System.Management.Automation.Provider.ItemCmdletProvider.GetItem для этого провайдера. Обратите внимание, что этот метод использует методы помощников GetTable и GetRow для получения элементов, которые либо являются таблицами в базе данных Access, либо строками в таблице данных.
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);
}
} // GetItem
Что нужно помнить при внедрении GetItem
К реализации System.Management.Automation.Provider.ItemCmdletProvider.GetItem могут применяться следующие условия:
При определении класса провайдера поставщик элементов Windows PowerShell может объявить возможности провайдера ,
ExpandWildcardsFilter,Include, илиExclude, из перечисления System.Management.Automation.Provider.ProviderCapabilities. В таких случаях реализация System.Management.Automation.Provider.ItemCmdletProvider.GetItem должна гарантировать, что путь, переданный методу, соответствует этим требованиям. Для этого метод должен получить доступ к соответствующим свойствам, например, к свойствам System.Management.Automation.Provider.CmdletProvider.Exclude и свойствам System.Management.Automation.Provider.CmdletProvider.Include .По умолчанию переопределения этого метода не должны получать объекты, обычно скрытые от пользователя, если только свойство System.Management.Automation.Provider.CmdletProvider.Force не установлено на
true. Например, метод System.Management.Automation.Provider.ItemCmdletProvider.GetItem для провайдера FileSystem проверяет свойство System.Management.Automation.Provider.CmdletProvider.Force перед попыткой вызова System.Management.Automation.Provider.CmdletProvider.WriteItemObject для скрытых или системных файлов.
Прикрепление динамических параметров к Get-Item cmdlet
Иногда cmdlet Get-Item требует дополнительных параметров, которые динамически задаются во время выполнения. Для предоставления этих динамических параметров поставщик элементов Windows PowerShell должен реализовать метод System.Management.Automation.Provider.ItemCmdletProvider.GetItemDynamicParameters . Этот метод извлекает динамические параметры элемента по указанному пути и возвращает объект с свойствами и полями с атрибутами разбора, похожими на класс cmdlet или объект System.Management.Automation.RuntimeDefinedParameterDictionary . Runtime Windows PowerShell использует возвращённый объект для добавления параметров в Get-Item cmdlet.
Этот провайдер не реализует этот метод. Однако следующий код является стандартной реализацией этого метода.
Установка предмета
Для установки элемента провайдер элементов Windows PowerShell должен переопределить метод System.Management.Automation.Provider.ItemCmdletProvider.SetItem для поддержки вызовов из Set-Item cmdlet. Этот метод устанавливает значение элемента на указанном пути.
Этот провайдер не предоставляет переопределения для метода System.Management.Automation.Provider.ItemCmdletProvider.SetItem (System.Management.Automation.Provider.Item ). Однако ниже приведена стандартная реализация этого метода.
Что нужно помнить при внедрении SetItem
Следующие условия могут применяться к вашей реализации System.Management.Automation.Provider.ItemCmdletProvider.SetItem:
При определении класса провайдера поставщик элементов Windows PowerShell может объявить возможности провайдера ,
ExpandWildcardsFilter,Include, илиExclude, из перечисления System.Management.Automation.Provider.ProviderCapabilities. В таких случаях реализация System.Management.Automation.Provider.ItemCmdletProvider.SetItem должна гарантировать, что путь, переданный к методу, соответствует этим требованиям. Для этого метод должен получить доступ к соответствующим свойствам, например, к свойствам System.Management.Automation.Provider.CmdletProvider.Exclude и свойствам System.Management.Automation.Provider.CmdletProvider.Include .По умолчанию переопределения этого метода не должны устанавливать или записывать объекты, скрытые от пользователя, если свойство System.Management.Automation.Provider.Provider.CmdletProvider.Force не установлено на
true. Ошибка должна быть отправлена в метод System.Management.Automation.Provider.CmdletProvider.WriteError , если путь представляет собой скрытый элемент, а System.Management.Automation.Provider.Provider.CmdletProvider.Force установлен наfalse.Ваша реализация метода System.Management.Automation.Provider.ItemCmdletProvider.SetItem должна вызывать System.Management.Automation.Provider.CmdletProvider.ShouldProcess и проверять его возвращаемое значение перед внесением изменений в хранилище данных. Этот метод используется для подтверждения выполнения операции при внесении изменений в хранилище данных, например, при удалении файлов. Метод System.Management.Automation.Provider.CmdletProvider.ShouldProcess отправляет пользователю имя ресурса, который нужно изменить, при этом среда выполнения Windows PowerShell учитывает любые командные строки или переменные предпочтений при определении того, что должно отображаться.
После вызова System.Management.Automation.Provider.CmdletProvider.ShouldProcess возвращается
true, метод System.Management.Automation.Provider.ItemCmdletProvider.SetItem должен вызывать метод System.Management.Automation.Provider.CmdletProvider.ShouldContinue . Этот метод отправляет пользователю сообщение, чтобы получить обратную связь и проверить, следует ли продолжать операцию. Вызов System.Management.Automation.Provider.CmdletProvider.ShouldContinue позволяет дополнительно проверить потенциально опасные модификации системы.
Извлечение динамических параметров для SetItem
Иногда cmdlet Set-Item требует дополнительных параметров, которые динамически задаются во время выполнения. Для предоставления этих динамических параметров поставщик элементов Windows PowerShell должен реализовать метод System.Management.Automation.Provider.ItemCmdletProvider.SetItemDynamicParameters . Этот метод извлекает динамические параметры элемента по указанному пути и возвращает объект с свойствами и полями с атрибутами разбора, похожими на класс cmdlet или объект System.Management.Automation.RuntimeDefinedParameterDictionary . Runtime Windows PowerShell использует возвращённый объект для добавления параметров в Set-Item cmdlet.
Этот провайдер не реализует этот метод. Однако следующий код является стандартной реализацией этого метода.
Очистка предмета
Для очистки элемента провайдер элементов Windows PowerShell реализует метод System.Management.Automation.Provider.ItemCmdletProvider.ClearItem для поддержки вызовов из Clear-Item cmdlet. Этот метод стирает элемент данных на указанном пути.
Этот провайдер не реализует этот метод. Однако следующий код является стандартной реализацией этого метода.
Что нужно помнить при внедрении ClearItem
К реализации System.Management.Automation.Provider.ItemCmdletProvider.ClearItem могут применяться следующие условия:
При определении класса провайдера поставщик элементов Windows PowerShell может объявить возможности провайдера ,
ExpandWildcardsFilter,Include, илиExclude, из перечисления System.Management.Automation.Provider.ProviderCapabilities. В таких случаях реализация System.Management.Automation.Provider.ItemCmdletProvider.ClearItem должна гарантировать, что путь, переданный к методу, соответствует этим требованиям. Для этого метод должен получить доступ к соответствующим свойствам, например, к свойствам System.Management.Automation.Provider.CmdletProvider.Exclude и свойствам System.Management.Automation.Provider.CmdletProvider.Include .По умолчанию переопределения этого метода не должны устанавливать или записывать объекты, скрытые от пользователя, если свойство System.Management.Automation.Provider.Provider.CmdletProvider.Force не установлено на
true. Ошибка должна быть отправлена в метод System.Management.Automation.Provider.CmdletProvider.WriteError , если путь представляет элемент, скрытый от пользователя, а System.Management.Automation.Provider.CmdletProvider.Force установлен наfalse.Ваша реализация метода System.Management.Automation.Provider.ItemCmdletProvider.SetItem должна вызывать System.Management.Automation.Provider.CmdletProvider.ShouldProcess и проверять его возвращаемое значение перед внесением изменений в хранилище данных. Этот метод используется для подтверждения выполнения операции при внесении изменений в хранилище данных, например, при удалении файлов. Метод System.Management.Automation.Provider.CmdletProvider.ShouldProcess отправляет пользователю имя ресурса, который нужно изменить, вместе с Windows PowerShell runtime, и обрабатывает любые командные настройки или переменные предпочтений при определении того, что должно отображаться.
После вызова System.Management.Automation.Provider.CmdletProvider.ShouldProcess возвращается
true, метод System.Management.Automation.Provider.ItemCmdletProvider.SetItem должен вызывать метод System.Management.Automation.Provider.CmdletProvider.ShouldContinue . Этот метод отправляет пользователю сообщение, чтобы получить обратную связь и проверить, следует ли продолжать операцию. Вызов System.Management.Automation.Provider.CmdletProvider.ShouldContinue позволяет дополнительно проверить потенциально опасные модификации системы.
Получить динамические параметры для ClearItem
Иногда cmdlet Clear-Item требует дополнительных параметров, которые динамически задаются во время выполнения. Для предоставления этих динамических параметров поставщик элементов Windows PowerShell должен реализовать метод System.Management.Automation.Provider.ItemCmdletProvider.ClearItemDynamicParameters . Этот метод извлекает динамические параметры элемента по указанному пути и возвращает объект с свойствами и полями с атрибутами разбора, похожими на класс cmdlet или объект System.Management.Automation.RuntimeDefinedParameterDictionary . Runtime Windows PowerShell использует возвращённый объект для добавления параметров в Clear-Item cmdlet.
Этот поставщик элементов не реализует этот метод. Однако следующий код является стандартной реализацией этого метода.
Выполнение действия по умолчанию для предмета
Провайдер элементов Windows PowerShell может реализовать метод System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction для поддержки вызовов из Invoke-Item cmdlet, что позволяет провайдеру выполнить действие по умолчанию для элемента на указанном пути. Например, провайдер FileSystem может использовать этот метод для вызова ShellExecute для конкретного элемента.
Этот провайдер не реализует этот метод. Однако следующий код является стандартной реализацией этого метода.
Что нужно помнить при реализации InvokeDefaultAction
К реализации System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction могут применяться следующие условия:
При определении класса провайдера поставщик элементов Windows PowerShell может объявить возможности провайдера ,
ExpandWildcardsFilter,Include, илиExclude, из перечисления System.Management.Automation.Provider.ProviderCapabilities. В таких случаях реализация System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction должна гарантировать, что путь, переданный методу, соответствует этим требованиям. Для этого метод должен получить доступ к соответствующим свойствам, например, к свойствам System.Management.Automation.Provider.CmdletProvider.Exclude и свойствам System.Management.Automation.Provider.CmdletProvider.Include .По умолчанию перенастройки этого метода не должны устанавливать или записывать объекты, скрытые от пользователя, если только свойство System.Management.Automation.Provider.CmdletProvider.Force не установлено на
true. Ошибка должна быть отправлена в метод System.Management.Automation.Provider.CmdletProvider.WriteError , если путь представляет элемент, скрытый от пользователя, а System.Management.Automation.Provider.CmdletProvider.Force установлен наfalse.
Получить динамические параметры для InvokeDefaultAction
Иногда cmdlet Invoke-Item требует дополнительных параметров, которые динамически задаются во время выполнения. Для предоставления этих динамических параметров поставщик элементов Windows PowerShell должен реализовать метод System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultActionDynamicParameters . Этот метод извлекает динамические параметры элемента по указанному пути и возвращает объект с свойствами и полями с атрибутами разбора, похожими на класс cmdlet или объект System.Management.Automation.RuntimeDefinedParameterDictionary . В процессе выполнения Windows PowerShell возвращённый объект добавлены для добавления динамических параметров в Invoke-Item cmdlet.
Этот поставщик элементов не реализует этот метод. Однако следующий код является стандартной реализацией этого метода.
Реализация вспомогательных методов и классов
Этот поставщик элементов реализует несколько вспомогательных методов и классов, которые используются в публичных методах переопределения, определённых Windows PowerShell. Код для этих вспомогательных методов и классов показан в разделе «Пример кода ».
Метод NormalizePath
Этот поставщик элементов реализует вспомогательный метод NormalizePath , чтобы обеспечить согласованный формат пути. Указанный формат использует обратную косую черту (\) в качестве разделителя.
Метод PathIsDrive
Этот поставщик элементов реализует вспомогательный метод PathIsDrive , чтобы определить, действительно ли указанный путь является именем диска.
Метод ChunkPath
Этот поставщик элементов реализует вспомогательный метод ChunkPath , который разбивает указанный путь, чтобы провайдер мог определить его отдельные элементы. Он возвращает массивы, состоящий из элементов пути.
Метод GetTable
Этот поставщик элементов реализует вспомогательный метод GetTables , который возвращает объект DatabaseTableInfo , представляющий информацию о таблице, указанной в вызове.
Метод GetRow
Метод System.Management.Automation.Provider.ItemCmdletProvider.GetItem этого провайдера вызывает метод помощника GetRows. Этот вспомогательный метод получает объект DatabaseRowInfo , который представляет информацию о указанной строке в таблице.
Класс DatabaseTableInfo
Этот поставщик элементов определяет класс DatabaseTableInfo , который представляет коллекцию информации в таблице данных в базе данных. Этот класс похож на класс System.IO.Directoryinfo .
Провайдер примера элементов определяет метод DatabaseTableInfo.GetTables , который возвращает коллекцию объектов информации таблицы, определяющих таблицы в базе данных. Этот метод включает блок try/catch, чтобы любая ошибка базы данных отображалась как строка с нулём записей.
Класс DatabaseRowInfo
Этот поставщик элементов определяет вспомогательный класс DatabaseRowInfo , который представляет строку в таблице базы данных. Этот класс похож на класс System.IO.FileInfo .
Примерный провайдер определяет метод DatabaseRowInfo.GetRows для возврата коллекции объектов информации о строках для указанной таблицы. Этот метод включает блок try/catch для ловли исключений. Любые ошибки приведут к отсутствию информации о строке.
Пример кода
Полный пример кода см. AccessDbProviderSample03 Code Sample03.
Определение типов объектов и форматирования
При написании провайдера может потребоваться добавить элементы к существующим объектам или определить новые. После завершения создайте файл Types, который Windows PowerShell сможет использовать для идентификации членов объекта, а также файл Format, который определяет, как объект отображается. Для получения дополнительной информации см. раздел «Расширение типов объектов и форматирования».
Создание провайдера Windows PowerShell
Посмотрите, как зарегистрировать cmdlet, провайдеров и хост-приложения.
Тестирование провайдера Windows PowerShell
Когда этот поставщик элементов Windows PowerShell зарегистрирован в Windows PowerShell, вы можете протестировать только базовую и дисковую функциональность провайдера. Для тестирования манипуляции элементами необходимо также реализовать функциональность контейнера, описанную в разделе «Реализация контейнера Windows PowerShell Provider».
См. также
- Windows PowerShell SDK
- Руководство программиста Windows PowerShell
- Создание провайдеров Windows PowerShell
- Проектирование вашего провайдера Windows PowerShell
- Расширение типов объектов и форматирование
- Как работает Windows PowerShell
- Создание контейнерного провайдера Windows PowerShell
- Создание провайдера Windows PowerShell для Drive
- Как зарегистрировать cmdlet, провайдеров и хост-приложений