As I continue to work on the 2nd edition of Managing Active Directory with Windows PowerShell: TFM, I find situations where I need a tool to get information out of Windows PowerShell. For example, the cmdlets in the Microsoft Active Directory module have a lot of parameters and I wanted to know some specifics. Now I could simply keep reading the full cmdlet help, but that gets kind of tedious. Instead I remembered I can use the Get-Command cmdlet to dig into the details.
ManageEngine ADManager Plus - Download Free Trial
Exclusive offer on ADManager Plus for US and UK regions. Claim now!
For example, here are the parameters for Get-Service.
PS C:\> (get-command get-service).parameters Key Value --- ----- Name System.Management.Automation.ParameterMetadata ComputerName System.Management.Automation.ParameterMetadata DependentServices System.Management.Automation.ParameterMetadata RequiredServices System.Management.Automation.ParameterMetadata DisplayName System.Management.Automation.ParameterMetadata Include System.Management.Automation.ParameterMetadata Exclude System.Management.Automation.ParameterMetadata InputObject System.Management.Automation.ParameterMetadata Verbose System.Management.Automation.ParameterMetadata Debug System.Management.Automation.ParameterMetadata ErrorAction System.Management.Automation.ParameterMetadata WarningAction System.Management.Automation.ParameterMetadata ErrorVariable System.Management.Automation.ParameterMetadata WarningVariable System.Management.Automation.ParameterMetadata OutVariable System.Management.Automation.ParameterMetadata OutBuffer System.Management.Automation.ParameterMetadata
The value, System.Management.Automation.ParameterMetadata is intriguing. The output is a dictionary object so I can check just a single parameter.
PS C:\> (get-command get-service).parameters.name Name : Name ParameterType : System.String[] ParameterSets : {[Default, System.Management.Automation.ParameterSetMetadata]} IsDynamic : False Aliases : {ServiceName} Attributes : {Default, System.Management.Automation.AliasAttribute} SwitchParameter : False
I can even take it a step further and get attribute information.
PS C:\> (get-command get-service).parameters.name.attributes Position : 0 ParameterSetName : Default Mandatory : False ValueFromPipeline : True ValueFromPipelineByPropertyName : True ValueFromRemainingArguments : False HelpMessage : HelpMessageBaseName : HelpMessageResourceId : TypeId : System.Management.Automation.ParameterAttribute AliasNames : {ServiceName} TypeId : System.Management.Automation.AliasAttribute
Now that I know where to go and how to get what I need, I can write a function to retrieve parameters for a given cmdlet or function.
Function Get-Parameter { <# .Synopsis Retrieve command parameter information. .Description Using Get-Command, this function will return information about parameters for any loaded cmdlet or function. The common parameters like Verbose and ErrorAction are omitted. Get-Parameter returns a custom object with the most useful information an administrator might need to know. Here is an example: Position : 0 Name : Name Type : System.String[] Aliases : {ServiceName} ValueFromPipeline : True Mandatory : False ParameterSet : Default .Parameter Command The name of a cmdlet or function. The parameter has an alias of Name. .Example PS C:\> get-parameter get-service Return parameter information for get-service .Example PS C:\Scripts> get-parameter mkdir | select Name,type Found 6 specific parameters for mkdir Name Type ---- ---- Path System.String[] Name System.String Value System.Object Force System.Management.Automation.SwitchParameter Credential System.Management.Automation.PSCredential UseTransaction System.Management.Automation.SwitchParameter .Example PS C:\Scripts> get-parameter get-wmiobject | sort parameterset | format-table -GroupBy ParameterSet -Property Name,Alias,Position,Type Found 18 non-common parameters for get-wmiobject ParameterSet: __AllParameterSets Name Alias Position Type ---- ----- -------- ---- ThrottleLimit System.Int32 Amended System.Management.Automation.SwitchParameter AsJob System.Management.Automation.SwitchParameter ParameterSet: class Name Alias Position Type ---- ----- -------- ---- Locale System.String Impersonation System.Management.ImpersonationLevel ParameterSet: list Name Alias Position Type ---- ----- -------- ---- Namespace System.String ComputerName System.String[] Authority System.String List System.Management.Automation.SwitchParameter Recurse System.Management.Automation.SwitchParameter ParameterSet: query Name Alias Position Type ---- ----- -------- ---- Filter System.String Property 1 System.String[] Class 0 System.String EnableAllPrivileges System.Management.Automation.SwitchParameter DirectRead System.Management.Automation.SwitchParameter ParameterSet: WQLQuery Name Alias Position Type ---- ----- -------- ---- Query System.String Credential System.Management.Automation.PSCredential Authentication System.Management.AuthenticationLevel .Inputs [string] .Outputs custom object .Link https://jdhitsolutions.com/blog/2010/07/get-parameter .Link Get-Command .Notes NAME: Get-Parameter VERSION: 1.2 AUTHOR: Jeffery Hicks LASTEDIT: July 20, 2010 Learn more with a copy of Windows PowerShell 2.0: TFM (SAPIEN Press 2010) #> Param( [Parameter(Position=0,Mandatory=$True, ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True, HelpMessage="Enter a cmdlet name")] [ValidateNotNullorEmpty()] [Alias("name")] [string]$command ) Process { #define the set of common parameters to exclude $common=@("Verbose", "Debug", "ErrorAction", "ErrorVariable", "WarningAction", "WarningVariable", "OutVariable", "OutBuffer", "WhatIf", "Confirm") Try { $data=(Get-Command -Name $command -errorAction "Stop").parameters } Catch { Write-Warning "Failed to find command $command" } #keep going if parameters were found if ($data.count -gt 0) { #$data is a hash table $params=$data.keys | where {$common -notcontains $_} $count=($params | measure-object).count #only keep going if non-common parameters were found write-host "Found $count non-common parameters for $command" ` -ForegroundColor Green if ($count -gt 0) { #get information from each parameter $params | foreach { $name=$_ $type=$data.item($name).ParameterType $aliases=$data.item($name).Aliases $attributes=$data.item($name).Attributes if ($attributes[0].position -ge 0) { $position=$attributes[0].position } else { $position=$null } #write a custom object to the pipeline New-Object -TypeName PSObject -Property @{ Name=$name Aliases=$aliases Mandatory=$attributes[0].mandatory Position=$position ValueFromPipeline=$attributes[0].ValueFromPipeline Type=$type ParameterSet=$attributes[0].ParameterSetName } } #foreach } #if $count } #if $data else { Write-Host "$command has no defined parameters" -ForegroundColor Red } } #process } #end function
The function has comment based help and examples so be sure to take a look. Otherwise the function is pretty straight forward. I use it with an alias, gpa.
PS C:\> gpa new-object
Found 5 non-common parameters for new-object
Position : 0
Name : TypeName
Type : System.String
Aliases : {}
ValueFromPipeline : False
Mandatory : True
ParameterSet : Net
Position : 0
Name : ComObject
Type : System.String
Aliases : {}
ValueFromPipeline : False
Mandatory : True
ParameterSet : Com
Position : 1
Name : ArgumentList
Type : System.Object[]
Aliases : {Args}
ValueFromPipeline : False
Mandatory : False
ParameterSet : Net
Position :
Name : Strict
Type : System.Management.Automation.SwitchParameter
Aliases : {}
ValueFromPipeline : False
Mandatory : False
ParameterSet : Com
Position :
Name : Property
Type : System.Collections.Hashtable
Aliases : {}
ValueFromPipeline :
Mandatory :
ParameterSet :
I'm sure it needs a few tweaks so let me know what works and what doesn't. You can download Get-Parameter.ps1 here.
I prefer this one myself:
http://poshcode.org/1344