Резюме: 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
Команда и ее результаты приведены на рисунке ниже.
Я указал список параметров провайдера FileSystem как ReferenceObject, а список параметров провайдера Certificate – как DifferenceObject. Значение поля SideIndicator указывает на параметры, добавленные определенным провайдером. Поскольку команда возвращает PSCustomObject, а тип свойства SideIndicator – NoteProperty, я могу его использовать с командлетом 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
Когда я запущу эту команду, выведется следующая информация.
Как вы можете видеть, провайдер Registry не добавляет каких-либо параметров для командлета Get-ChildItem. Даже наоборот — некоторые параметры исчезают. Если присмотреться к списку этих параметров — Attributes, Directory, File, Hidden, ReadOnly и System, то становится очевидно, что они предназначены для работы с файловой системой, а не с реестром.
Автор:
Ed Wilson, Microsoft Scripting Guy
Оригинал:
Страницы в социальных сетях:
Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell