{"id":4046,"date":"2013-03-09T00:01:00","date_gmt":"2013-03-09T00:01:00","guid":{"rendered":"https:\/\/blogs.technet.microsoft.com\/heyscriptingguy\/2013\/03\/09\/weekend-scripter-use-powershell-to-find-dynamic-parameters\/"},"modified":"2013-03-09T00:01:00","modified_gmt":"2013-03-09T00:01:00","slug":"weekend-scripter-use-powershell-to-find-dynamic-parameters","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/scripting\/weekend-scripter-use-powershell-to-find-dynamic-parameters\/","title":{"rendered":"Weekend Scripter: Use PowerShell to Find Dynamic Parameters"},"content":{"rendered":"<p><strong>Summary<\/strong>: Microsoft Scripting Guy, Ed Wilson, talks about using Windows PowerShell to discover dynamic parameters for his favorite cmdlets.<\/p>\n<p>Microsoft Scripting Guy, Ed Wilson, is here. I submitted my session for SQL Saturday in Atlanta, Georgia. To be honest, I was not going to do so because it is only two weeks prior to TechEd in New Orleans&mdash;but hey, there are a lot of cool people that attend SQL Saturday. I think we will probably have an all-day Windows PowerShell track at SQL Saturday in Atlanta. We did last year, and it was an absolute blast. &nbsp;The question came up when I was on the PowerScripting podcast, and I have been mulling it over for a while. Finally, we decided to go. So the Scripting Wife and I will be at SQL Saturday in Atlanta (assuming they approve my session submission).<\/p>\n<h2>Playing around with Get-Command<\/h2>\n<p>Anyway, I was playing around with Windows PowerShell this morning, and I decided to go back and read the Help file content for <strong>Get-Command.<\/strong> I ran across the <strong>&ndash;ArgumentList<\/strong><em> <\/em>parameter. I can use it to change the context for the <strong>Get-Command<\/strong> cmdlet. Cool.&nbsp; <em>&nbsp;<\/em><\/p>\n<p style=\"padding-left: 30px\"><strong>Note<\/strong>&nbsp;&nbsp;&nbsp;I am constantly reading over the Help content for Windows PowerShell because I simply cannot remember everything about everything. There is a difference between reading content when looking for an answer to a particular problem and simply <em>grazing. <\/em>When I am looking for a specific answer, I find the answer and I leave to go solve my problem. When I am <em>grazing, <\/em>I take my time and sample a bit of everything. I believe both types of reading are necessary.<\/p>\n<p>OK, so I use the <strong>Get-Command<\/strong> cmdlet and the <strong>&ndash;ArgumentList<\/strong><em> <\/em>parameter to display the definition of the command. Unfortunately, the first attempt does not work too well as shown here.<\/p>\n<p style=\"padding-left: 30px\">PS C:\\&gt; Get-Command Get-ChildItem -ArgumentList cert: | select definition<\/p>\n<p style=\"padding-left: 30px\">&nbsp;<\/p>\n<p style=\"padding-left: 30px\">Definition<\/p>\n<p style=\"padding-left: 30px\">&#8212;&#8212;&#8212;-<\/p>\n<p style=\"padding-left: 30px\">&#8230;<\/p>\n<p>No problem; I know how to deal with this issue. I need to expand the object that is contained in the property. To do this, I use the <strong>Select-Object<\/strong> cmdlet and choose the <strong>&ndash;ExpandProperty<\/strong><em> <\/em>parameter. This results in a nice display of the parameter sets that are available when using the <strong>Get-Command<\/strong> cmdlet. These results are shown here.<\/p>\n<p style=\"padding-left: 30px\">PS C:\\&gt; Get-Command Get-ChildItem -ArgumentList cert: | select -expand definition<\/p>\n<p style=\"padding-left: 30px\">&nbsp;<\/p>\n<p style=\"padding-left: 30px\">Get-ChildItem [[-Path] &lt;string[]&gt;] [[-Filter] &lt;string&gt;] [-Include &lt;string[]&gt;] [-Excl<\/p>\n<p style=\"padding-left: 30px\">ude &lt;string[]&gt;] [-Recurse] [-Force] [-Name] [-UseTransaction] [-CodeSigningCert] [-S<\/p>\n<p style=\"padding-left: 30px\">SLServerAuthentication] [-DnsName &lt;DnsNameRepresentation&gt;] [-Eku &lt;string[]&gt;] [-Expir<\/p>\n<p style=\"padding-left: 30px\">ingInDays &lt;int&gt;] [&lt;CommonParameters&gt;]<\/p>\n<p style=\"padding-left: 30px\">&nbsp;<\/p>\n<p style=\"padding-left: 30px\">Get-ChildItem [[-Filter] &lt;string&gt;] -LiteralPath &lt;string[]&gt; [-Include &lt;string[]&gt;] [-E<\/p>\n<p style=\"padding-left: 30px\">xclude &lt;string[]&gt;] [-Recurse] [-Force] [-Name] [-UseTransaction] [-CodeSigningCert]<\/p>\n<p style=\"padding-left: 30px\">[-SSLServerAuthentication] [-DnsName &lt;DnsNameRepresentation&gt;] [-Eku &lt;string[]&gt;] [-Ex<\/p>\n<p style=\"padding-left: 30px\">piringInDays &lt;int&gt;] [&lt;CommonParameters&gt;]<\/p>\n<p>Well that is a command to keep in the back of my mind. I can get a nice display of a cmdlet parameter set on a per-provider basis by using the <strong>Get-Command<\/strong> cmdlet. Sweet!<\/p>\n<p>Now, I want to find only the parameters. To do this, I use the <strong>Select-Object<\/strong> cmdlet and choose parameters. The command and its output are shown here.<\/p>\n<p style=\"padding-left: 30px\">PS C:\\&gt; Get-Command Get-ChildItem -ArgumentList cert: | select parameters<\/p>\n<p style=\"padding-left: 30px\">&nbsp;<\/p>\n<p style=\"padding-left: 30px\">Parameters<\/p>\n<p style=\"padding-left: 30px\">&#8212;&#8212;&#8212;-<\/p>\n<p style=\"padding-left: 30px\">{[Path, System.Management.Automation.ParameterMetadata], [LiteralPath, System.Man&#8230;<\/p>\n<p>Ah, ha. The <strong>Parameters<\/strong> property returns an object&mdash;actually, a collection of objects. So once again, I will send the result to the <strong>ExpandProperty<\/strong> parameter. This is shown here.<\/p>\n<p style=\"padding-left: 30px\">PS C:\\&gt; Get-Command Get-ChildItem -ArgumentList cert: | select -ExpandProperty parameters<\/p>\n<p style=\"padding-left: 30px\">&nbsp;<\/p>\n<p style=\"padding-left: 30px\">Key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Value<\/p>\n<p style=\"padding-left: 30px\">&#8212;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&#8212;&#8211;<\/p>\n<p style=\"padding-left: 30px\">Path&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Management.Automation.Parameter&#8230;<\/p>\n<p style=\"padding-left: 30px\">LiteralPath&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Management.Automation.Parameter&#8230;<\/p>\n<p style=\"padding-left: 30px\">Filter&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Management.Automation.Parameter&#8230;<\/p>\n<p style=\"padding-left: 30px\">Include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Management.Automation.Parameter&#8230;<\/p>\n<p style=\"padding-left: 30px\">Exclude&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Management.Automation.Parameter&#8230;<\/p>\n<p style=\"padding-left: 30px\">Recurse&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Management.Automation.Parameter&#8230;<\/p>\n<p style=\"padding-left: 30px\">Force&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Management.Automation.Parameter&#8230;<\/p>\n<p style=\"padding-left: 30px\">Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Management.Automation.Parameter&#8230;<\/p>\n<p style=\"padding-left: 30px\">Verbose&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Management.Automation.Parameter&#8230;<\/p>\n<p style=\"padding-left: 30px\">Debug&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Management.Automation.Parameter&#8230;<\/p>\n<p style=\"padding-left: 30px\">ErrorAction&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Management.Automation.Parameter&#8230;<\/p>\n<p style=\"padding-left: 30px\">WarningAction&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Management.Automation.Parameter&#8230;<\/p>\n<p style=\"padding-left: 30px\">ErrorVariable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Management.Automation.Parameter&#8230;<\/p>\n<p style=\"padding-left: 30px\">WarningVariable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Management.Automation.Parameter&#8230;<\/p>\n<p style=\"padding-left: 30px\">OutVariable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Management.Automation.Parameter&#8230;<\/p>\n<p style=\"padding-left: 30px\">OutBuffer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Management.Automation.Parameter&#8230;<\/p>\n<p style=\"padding-left: 30px\">UseTransaction&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Management.Automation.Parameter&#8230;<\/p>\n<p style=\"padding-left: 30px\">CodeSigningCert&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Management.Automation.Parameter&#8230;<\/p>\n<p style=\"padding-left: 30px\">SSLServerAuthentication&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Management.Automation.Parameter&#8230;<\/p>\n<p style=\"padding-left: 30px\">DnsName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Management.Automation.Parameter&#8230;<\/p>\n<p style=\"padding-left: 30px\">Eku&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Management.Automation.Parameter&#8230;<\/p>\n<p style=\"padding-left: 30px\">ExpiringInDays&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Management.Automation.Parameter&#8230;<\/p>\n<p>Now the information is contained in a generic dictionary object. This means there are a number of additional methods and properties to deal with. Actually, I am only interested in the <strong>Keys<\/strong> property. So, I use the group and dot technique, and select only the <strong>Keys<\/strong>. This is shown here.<\/p>\n<p style=\"padding-left: 30px\">PS C:\\&gt; (Get-Command Get-ChildItem -ArgumentList cert: | select -ExpandProperty parameters).keys<\/p>\n<p style=\"padding-left: 30px\">Path<\/p>\n<p style=\"padding-left: 30px\">LiteralPath<\/p>\n<p style=\"padding-left: 30px\">Filter<\/p>\n<p style=\"padding-left: 30px\">Include<\/p>\n<p style=\"padding-left: 30px\">Exclude<\/p>\n<p style=\"padding-left: 30px\">Recurse<\/p>\n<p style=\"padding-left: 30px\">Force<\/p>\n<p style=\"padding-left: 30px\">Name<\/p>\n<p style=\"padding-left: 30px\">Verbose<\/p>\n<p style=\"padding-left: 30px\">Debug<\/p>\n<p style=\"padding-left: 30px\">ErrorAction<\/p>\n<p style=\"padding-left: 30px\">WarningAction<\/p>\n<p style=\"padding-left: 30px\">ErrorVariable<\/p>\n<p style=\"padding-left: 30px\">WarningVariable<\/p>\n<p style=\"padding-left: 30px\">OutVariable<\/p>\n<p style=\"padding-left: 30px\">OutBuffer<\/p>\n<p style=\"padding-left: 30px\">UseTransaction<\/p>\n<p style=\"padding-left: 30px\">CodeSigningCert<\/p>\n<p style=\"padding-left: 30px\">SSLServerAuthentication<\/p>\n<p style=\"padding-left: 30px\">DnsName<\/p>\n<p style=\"padding-left: 30px\">Eku<\/p>\n<p style=\"padding-left: 30px\">ExpiringInDays<\/p>\n<p>Groovy. Now all I need to do is sort my list of properties so I can feed the results to <strong>Compare-Object<\/strong>. So, I back up a bit and I store the expanded parameters in a variable. I do this for the Certificate provider and for the FileSystem provider. These two commands are shown here.<\/p>\n<p style=\"padding-left: 30px\">PS C:\\&gt; $cert = Get-Command Get-ChildItem -ArgumentList cert: | select -ExpandProperty parameters<\/p>\n<p style=\"padding-left: 30px\">PS C:\\&gt; $file = Get-Command Get-ChildItem -ArgumentList c: | select -ExpandProperty parameters<\/p>\n<p>Now, I want to sort the keys, and store the sorted list of keys in a variable. The following two commands do this for me.<\/p>\n<p style=\"padding-left: 30px\">PS C:\\&gt; $certKeys = $cert.Keys | sort<\/p>\n<p style=\"padding-left: 30px\">PS C:\\&gt; $filekeys = $file.Keys | sort<\/p>\n<p>Now it is time to use the <strong>Compare-Object<\/strong> cmdlet to compare the two lists of provider-specific parameters for the <strong>Get-ChildItem<\/strong> cmdlet. This command is shown here.<\/p>\n<p style=\"padding-left: 30px\">Compare-Object -ReferenceObject $filekeys -DifferenceObject $certKeys<\/p>\n<p>Following are the commands and the output associated with the commands.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/29\/2019\/02\/7065.HSG-3-9-13-01.png\"><img decoding=\"async\" title=\"Image of command output\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/29\/2019\/02\/7065.HSG-3-9-13-01.png\" alt=\"Image of command output\" \/><\/a><\/p>\n<p>If I keep my comparisons consistent&mdash;that is, I use the FileSystem provider as my <strong>ReferenceObject<\/strong>, and I use the other providers for the <strong>DifferenceObject<\/strong>, the output will be consistent. The <strong>SideIndicator =&gt;<\/strong> will always point to new parameters added by the different PS Provider. Because the returned difference object is a PSCUSTOM object, it means that <strong>SideIndicator<\/strong><em> <\/em>is a <strong>NoteProperty<\/strong>, and I can use it in a <strong>Where-Object<\/strong> statement. The following command returns only parameters added by <strong>DifferenceObject<\/strong> (my collection of Certificate provider-specific parameters).<\/p>\n<p style=\"padding-left: 30px\">PS C:\\&gt; Compare-Object -ReferenceObject $filekeys -DifferenceObject $certKeys | ? sideindicator -eq &#8216;=&gt;&#8217;<\/p>\n<p style=\"padding-left: 30px\">&nbsp;<\/p>\n<p style=\"padding-left: 30px\">InputObject&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SideIndicator<\/p>\n<p style=\"padding-left: 30px\">&#8212;&#8212;&#8212;&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8212;&#8212;&#8212;&#8212;-<\/p>\n<p style=\"padding-left: 30px\">CodeSigningCert&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&gt;<\/p>\n<p style=\"padding-left: 30px\">DnsName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&gt;<\/p>\n<p style=\"padding-left: 30px\">Eku&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&gt;<\/p>\n<p style=\"padding-left: 30px\">ExpiringInDays&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&gt;<\/p>\n<p style=\"padding-left: 30px\">SSLServerAuthentication&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&gt;<\/p>\n<h2>Comparing Get-ChildItem with the Registry provider<\/h2>\n<p>Any drive I pass to the <strong>&ndash;ArgumentList<\/strong><em> <\/em>parameter causes <strong>Get-Command<\/strong> to return provider-specific parameters. Therefore, I can use HKLM: as my drive to return Registry provider parameters. The following code illustrates the technique.<\/p>\n<p style=\"padding-left: 30px\">$reg = Get-Command Get-ChildItem -ArgumentList hklm: | select &ndash;ExpandProperty parameters<\/p>\n<p style=\"padding-left: 30px\">$file = Get-Command Get-ChildItem -ArgumentList c: | select -ExpandProperty parameters<\/p>\n<p style=\"padding-left: 30px\">$regKeys = $reg.Keys | sort<\/p>\n<p style=\"padding-left: 30px\">$filekeys = $file.Keys | sort<\/p>\n<p style=\"padding-left: 30px\">&nbsp;Compare-Object -ReferenceObject $filekeys -DifferenceObject $regKeys<\/p>\n<p>When I run the command, the following output displays.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/29\/2019\/02\/5670.HSG-3-9-13-02.png\"><img decoding=\"async\" title=\"Image of command output\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/29\/2019\/02\/5670.HSG-3-9-13-02.png\" alt=\"Image of command output\" \/><\/a><\/p>\n<p>I can see from the previous output that there are no added parameters to <strong>Get-ChildItem<\/strong> when it is used on the registry drives. Instead, I see that a number of parameters are actually removed. This makes sense when reviewing the missing parameters: <strong>Attributes<\/strong>, <strong>Directory<\/strong>, <strong>File<\/strong>, <strong>Hidden<\/strong>, <strong>ReadOnly<\/strong>, and <strong>System<\/strong>. These are related to files and folders, not to registry keys.<\/p>\n<p>I invite you to follow me on <a href=\"http:\/\/bit.ly\/scriptingguystwitter\" target=\"_blank\">Twitter<\/a> and <a href=\"http:\/\/bit.ly\/scriptingguysfacebook\" target=\"_blank\">Facebook<\/a>. If you have any questions, send email to me at <a href=\"mailto:scripter@microsoft.com\" target=\"_blank\">scripter@microsoft.com<\/a>, or post your questions on the <a href=\"http:\/\/bit.ly\/scriptingforum\" target=\"_blank\">Official Scripting Guys Forum<\/a>. See you tomorrow. Until then, peace.<\/p>\n<p><strong>Ed Wilson, Microsoft Scripting Guy<\/strong>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Summary: Microsoft Scripting Guy, Ed Wilson, talks about using Windows PowerShell to discover dynamic parameters for his favorite cmdlets. Microsoft Scripting Guy, Ed Wilson, is here. I submitted my session for SQL Saturday in Atlanta, Georgia. To be honest, I was not going to do so because it is only two weeks prior to TechEd [&hellip;]<\/p>\n","protected":false},"author":596,"featured_media":87096,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[414,3,4,61,45],"class_list":["post-4046","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-scripting","tag-providers","tag-scripting-guy","tag-scripting-techniques","tag-weekend-scripter","tag-windows-powershell"],"acf":[],"blog_post_summary":"<p>Summary: Microsoft Scripting Guy, Ed Wilson, talks about using Windows PowerShell to discover dynamic parameters for his favorite cmdlets. Microsoft Scripting Guy, Ed Wilson, is here. I submitted my session for SQL Saturday in Atlanta, Georgia. To be honest, I was not going to do so because it is only two weeks prior to TechEd [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts\/4046","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/users\/596"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/comments?post=4046"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts\/4046\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/media\/87096"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/media?parent=4046"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/categories?post=4046"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/tags?post=4046"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}