Weekend Scripter: Находим динамические параметры командлетов PowerShell – Hey, Scripting Guy! Blog

Резюме: Microsoft Scripting Guy, Ed Wilson рассказывает о получении информации о динамических параметрах для командлетов Windows PowerShell.

Экспериментируем с командлетом Get-Command

Просматривая файл справки для командлета Get-Command я натолкнулся на параметр –ArgumentList. Я могу использовать этот параметр для изменения контекста командлета Get-Command. Здорово.

Итак, я вызываю командлет Get-Command с параметром –Name, установленным в Get-ChildItem и параметром –ArgumentList, установленным в cert:, и выбираю свойство Definition. Как вы видите, первая попытка не увенчалась успехом.

PS C:\> Get-Command Get-ChildItem -ArgumentList cert: | select definition

Definition

———-

Ничего, я знаю, как решаются проблемы такого рода. Мне нужно получить содержимое этого свойства при помощи командлета Select-Object с параметром –ExpandProperty. В результате мы получим набор параметров, доступных для использования при работе с хранилищем сертификатов.

PS C:\> Get-Command Get-ChildItem -ArgumentList cert: | select -expand definition

Get-ChildItem [[-Path] ] [[-Filter] ] [-Include ] [-Exclude ] [-Recurse] [-Force] [-Name] [-UseTransaction] [-CodeSigningCert] [-SSLServerAuthentication] [-DnsName DnsNameRepresentation>] [-Eku ] [-ExpiringInDays ] []

Get-ChildItem [[-Filter] ] -LiteralPath [-Include ] [-Exclude ] [-Recurse] [-Force] [-Name] [-UseTransaction] [-CodeSigningCert] [-SSLServerAuthentication] [-DnsName ] [-Eku ] [-ExpiringInDays ] []

Что-ж, это весьма полезная команда. С ее помощью я могу получить список доступных параметров для определенного провайдера.

Теперь я хочу получить только параметры. Для этого в командлете Select-Object я выберу свойство Parameters.

PS C:\> Get-Command Get-ChildItem -ArgumentList cert: | select parameters

Parameters

———-

{[Path, System.Management.Automation.ParameterMetadata], [LiteralPath, System.Man…

Свойство Parameters содержит объект, точнее коллекцию объектов. Так что я еще раз воспользуюсь параметром –ExpandProperty.

PS C:\> Get-Command Get-ChildItem -ArgumentList cert: | select -ExpandProperty parameters

Key Value

— ——

Path System.Management.Automation.Parameter…

LiteralPath System.Management.Automation.Parameter…

Filter System.Management.Automation.Parameter…

Include System.Management.Automation.Parameter…

Exclude System.Management.Automation.Parameter…

Recurse System.Management.Automation.Parameter…

Force System.Management.Automation.Parameter…

Name System.Management.Automation.Parameter…

Verbose System.Management.Automation.Parameter…

Debug System.Management.Automation.Parameter…

ErrorAction System.Management.Automation.Parameter…

WarningAction System.Management.Automation.Parameter…

ErrorVariable System.Management.Automation.Parameter…

WarningVariable System.Management.Automation.Parameter…

OutVariable System.Management.Automation.Parameter…

OutBuffer System.Management.Automation.Parameter…

UseTransaction System.Management.Automation.Parameter…

CodeSigningCert System.Management.Automation.Parameter…

SSLServerAuthentication System.Management.Automation.Parameter…

DnsName System.Management.Automation.Parameter…

Eku System.Management.Automation.Parameter…

ExpiringInDays System.Management.Automation.Parameter…

Так как теперь информация представлена в виде объекта Generic.Dictionary, я могу воспользоваться его методами и свойствами. На самом деле меня интересует только одно свойство – Keys. Так что я помещу все выражение в скобки и укажу нужное мне свойство.

PS C:\> (Get-Command Get-ChildItem -ArgumentList cert: | select -ExpandProperty parameters).keys

Path

LiteralPath

Filter

Include

Exclude

Recurse

Force

Name

Verbose

Debug

ErrorAction

WarningAction

ErrorVariable

WarningVariable

OutVariable

OutBuffer

UseTransaction

CodeSigningCert

SSLServerAuthentication

DnsName

Eku

ExpiringInDays

Теперь я хочу отсортировать этот список, чтобы позже использовать его в качестве аргумента командлета Compare-Object. Так что я немного вернусь назад и сохраню полученный список в переменной. Я сделаю это как для провайдера Certificate, так и для провайдера FileSystem.

PS C:\> $cert = Get-Command Get-ChildItem -ArgumentList cert: | select -ExpandProperty parameters

PS C:\> $file = Get-Command Get-ChildItem -ArgumentList c: | select -ExpandProperty parameters

Теперь я отсортирую списки и сохраню результаты сортировки в еще одной паре переменных.

PS C:\> $certKeys = $cert.Keys | sort

PS C:\> $filekeys = $file.Keys | sort

Теперь воспользуемся командлетом Compare-Object для сравнения наборов параметров для двух разных провайдеров.

Compare-Object -ReferenceObject $filekeys -DifferenceObject $certKeys

Команда и ее результаты приведены на рисунке ниже.

01

Я указал список параметров провайдера FileSystem как ReferenceObject, а список параметров провайдера Certificate – как DifferenceObject. Значение поля SideIndicator указывает на параметры, добавленные определенным провайдером. Поскольку команда возвращает PSCustomObject, а тип свойства SideIndicatorNoteProperty, я могу его использовать с командлетом Where-Object. Следующая команда возвращает только параметры, добавленные провайдером Certificate (DifferenceObject).

PS C:\> Compare-Object -ReferenceObject $filekeys -DifferenceObject $certKeys | ? sideindicator -eq ‘=>’

InputObject SideIndicator

———— ————-

CodeSigningCert =>

DnsName =>

Eku =>

ExpiringInDays =>

SSLServerAuthentication =>

Сравниваем провайдер FileSystem с провайдером Registry

Указав в параметре –ArgumentList какой либо диск, я получу список параметров для использования с провайдером этого диска. Таким образом, если я укажу HKLM: — то получу список параметров для работы с реестром.

$reg = Get-Command Get-ChildItem -ArgumentList hklm: | select –ExpandProperty parameters

$file = Get-Command Get-ChildItem -ArgumentList c: | select -ExpandProperty parameters

$regKeys = $reg.Keys | sort

$filekeys = $file.Keys | sort

<

p style=»padding-left:30px;»>Compare-Object -ReferenceObject $filekeys -DifferenceObject $regKeys

Когда я запущу эту команду, выведется следующая информация.

02

Как вы можете видеть, провайдер Registry не добавляет каких-либо параметров для командлета Get-ChildItem. Даже наоборот — некоторые параметры исчезают. Если присмотреться к списку этих параметров — Attributes, Directory, File, Hidden, ReadOnly и System, то становится очевидно, что они предназначены для работы с файловой системой, а не с реестром.

Автор:

Ed Wilson, Microsoft Scripting Guy

Оригинал:

http://blogs.technet.com/b/heyscriptingguy/archive/2013/03/09/weekend-scripter-use-powershell-to-find-dynamic-parameters.aspx


Страницы в социальных сетях:

Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell


Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

w

Connecting to %s