Должен ли я реализовать интерфейс IPropertyCmdletProvider для командлета PowerShell? - PullRequest
0 голосов
/ 08 октября 2009

Я пишу NavigationCmdletProvider для PowerShell. С помощью переопределений GetItem и GetChildItems можно создавать различные типы объектов, которые записываются в конвейер.

Документы для IPropertyCmdletProvider интерфейса сообщают нам следующее:

Разработчики должны реализовать это интерфейс под следующим Условия:

  • Когда пользователи должны использовать командлеты, такие как Get-Property и Set-Property командлеты.
  • Для провайдеров, производных от ItemCmdletProvider, ContainerCmdletProvider, или Классы NavigationCmdletProvider.

Путаница:

По моему мнению, не так много полезной информации, потому что как бы пользователь узнал, если он должен использовать командлеты Get-Property и Set-Property? Я полагаю, что это до автора Cmdlet. Большая путаница (по крайней мере для меня) заключается в том, что командлет записывает объекты в конвейер; и эти объекты имеют открытые свойства, которые можно вызвать (то есть получить / установить); Какие преимущества имеет вызов Get-Property / Set-Property по сравнению с непосредственным манипулированием объектами?

Вопрос:

При каких обстоятельствах должен быть реализован интерфейс IPropertyCmdletProvider?

Я знаю, что я что-то здесь упускаю! Любая идея будет принята с благодарностью.

1 Ответ

3 голосов
/ 08 октября 2009

Ух ты, эти документы немного старые. Командлетов Get / Set-Property нет. Это должно относиться к командлетам Get / Set-ItemProperty. В случае RegistryProvider эти командлеты необходимы, поскольку это единственный способ получить доступ к значениям реестра. Таким образом, командлеты Get-Item / ChildItem возвращают только объекты RegistryKey и никогда не возвращают объект значения реестра (они не существуют в .NET). Вы должны использовать Get / Set-ItemProperty, чтобы получить / установить определенные regals под regkey.

OTOH провайдер FileSystem позволяет вам напрямую обращаться к контейнерам (каталогам) и листьям (файлам). Вы можете получить содержимое файла напрямую. Тем не менее, вы можете использовать Get-ItemProperty, если хотите получить LastWriteTime файла:

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, но он менее важен, если вы идете по пути, по которому пошел поставщик FileSystem, потому что вы можете легко получить доступ непосредственно к свойствам возвращаемых объектов по Get-Item / ChildItem.

...