Должен ли я реализовать интерфейс IPropertyCmdletProvider для командлета PowerShell?
-
20-09-2019 - |
Вопрос
Я пишу книгу NavigationCmdletProvider - навигационный модуль для PowerShell.Через Получить объект и GetChildItems ( Получить дочерние элементы) переопределяет, существуют различные типы объектов, которые записываются в конвейер.
Документы для ipropertycmdletпровайдер интерфейс сообщает нам следующее:
Разработчики должны реализовать этот интерфейс при соблюдении следующих условий:
- Когда пользователи должны использовать командлеты, такие как Get-Property и Set-Property командлеты.
- Для поставщиков, которые являются производными от классов ItemCmdletProvider, ContainerCmdletProvider или NavigationCmdletProvider.
Замешательство:
На мой взгляд, не так много полезной информации, потому что как пользователь узнает, если они должен использовать командлеты Get-Property и Set-Property?Я бы предположил, что это зависит от автора командлета.Большая путаница (по крайней мере, для меня) заключается в том, что командлет записывает объекты в конвейер;и у этих объектов есть открытые свойства, которые можно вызывать (т. е.получить/установить);какие преимущества имеет вызов Get-Property / Set-Property по сравнению с непосредственным манипулированием объектами?
Вопрос:
При каких обстоятельствах должен быть реализован интерфейс IPropertyCmdletProvider?
Я знаю, что здесь чего-то не хватает!Мы были бы очень признательны за любую информацию.
Решение
Ничего себе, эти документы немного устарели.Командлетов Get /Set-Property не существует.Это, должно быть, относится к командлетам Get/Set-ItemProperty.В случае RegistryProvider эти командлеты необходимы, поскольку это единственный способ получить доступ к значениям реестра.То есть командлеты Get-Item / ChildItem возвращают только объекты RegistryKey и никогда объект registry value (они не существуют в .NET).Вы должны использовать Get /Set-ItemProperty, чтобы получить / установить определенные регулярные значения в regkey.
OTOH поставщик файловой системы позволяет вам напрямую обращаться к контейнерам (dirs) и листьям (файлам).Вы можете получить содержимое файла напрямую.Тем не менее, вы можете использовать Get-ItemProperty, если хотите получить время последней записи файла:
PS> Get-ItemProperty -Path .\DotNetTypes.format.ps1xml -Name LastWriteTime
PSPath : Microsoft.PowerShell.Core\FileSystem::C:\Win
dows\System32\WindowsPowerShell\v1.0\DotNetT
ypes.format.ps1xml
PSParentPath : Microsoft.PowerShell.Core\FileSystem::C:\Win
dows\System32\WindowsPowerShell\v1.0
PSChildName : DotNetTypes.format.ps1xml
PSDrive : C
PSProvider : Microsoft.PowerShell.Core\FileSystem
LastWriteTime : 4/24/2009 11:21:46 AM
Однако обычно я бы не стал получать доступ к этому свойству таким образом.Я нахожу, что результат слишком подробный.Я бы сделал это:
PS> (Get-Item .\DotNetTypes.format.ps1xml).LastWriteTime
Friday, April 24, 2009 11:21:46 AM
Что касается рекомендаций, я бы сказал, что вам действительно нужно реализовать этот интерфейс, если вы используете подход RegistryProvider, но это менее важно, если вы пойдете по пути, по которому пошел поставщик файловой системы, потому что вы можете легко получить доступ непосредственно к свойствам объектов, возвращаемых Get-Item / ChildItem .