{"id":6211,"date":"2008-05-08T19:42:00","date_gmt":"2008-05-08T19:42:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/powershell\/2008\/05\/08\/fun-with-script-cmdlets\/"},"modified":"2019-02-18T13:15:57","modified_gmt":"2019-02-18T20:15:57","slug":"fun-with-script-cmdlets","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/powershell\/fun-with-script-cmdlets\/","title":{"rendered":"Fun with Script Cmdlets"},"content":{"rendered":"<h2><font face=\"Cambria\" color=\"#365f91\" size=\"5\"><\/font>&nbsp;<\/h2>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">Script Cmdlets are one of the coolest things about the newer version of PowerShell.<span>&nbsp; <\/span>A Script cmdlet allows you to use all of the variety of cmdlet parameter sets inside of PowerShell functions. <\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">Since Script Cmdlets are PowerShell functions, and the PowerShell engine prefers to run functions rather than commands, you can use Script Cmdlets to override an existing cmdlet.<span>&nbsp; <\/span>You might want to do this to add or remove parameters from a cmdlet you use often.<span>&nbsp; <\/span>Also, you might just want to see what a cmdlet\u2019s parameters look like in a script cmdlet, so you can go write your own.<\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">Luckily, Powershell<span>&nbsp; <\/span>has a way to generate script cmdlets from an existing cmdlet.<span>&nbsp; <\/span>Below is a script cmdlet, called New-ScriptCmdlet, that I\u2019ll use to create other script cmdlets.<\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">You can use this to create new script cmdlets from existing cmdlets in a couple of different ways:<\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\"># Create a new PowerShell cmdlet from an existing cmdlet<\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">Get-Command Get-Command | New-ScriptCmdlet Get-Command <span>&nbsp;<\/span>| Set-Content Get-Command.ps1<\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\"># Create a new PowerShell cmdlet from an existing cmdlet\u2019s type<\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">[Microsoft.PowerShell.Commands.GetProcessCommand] | New-ScriptCmdlet Get-Process | Set-Content Get-Process.ps1<\/font><\/p>\n<p class=\"MsoNormal\"># Creates a new PowerShell cmdlet from a random existing command and puts it into a file of the same name<\/p>\n<p class=\"MsoNormal\">&nbsp;Get-Command | Get-Random | Foreach-Object {<br \/>&nbsp;&nbsp;&nbsp; $cmdlet = $_<br \/>&nbsp;&nbsp;&nbsp; $scriptCmdlet&nbsp; = $cmdlet | New-ScriptCmdlet $cmdlet.Name<br \/>&nbsp;&nbsp;&nbsp; $scriptCmdlet | Set-Content &#8220;$($cmdlet.Name).ps1&#8221;<br \/>}<\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">Hope this helps,<\/font><\/p>\n<div>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">James Brundage [MSFT]<\/font><\/p>\n<\/div>\n<p class=\"MsoNormal\"><span><font size=\"3\">function New-ScriptCmdlet()<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">{<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">cmdlet `<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><span>&nbsp;<\/span>-DefaultParameterSet Type<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><span>&nbsp;&nbsp;&nbsp; <\/span>param(<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><span>&nbsp;&nbsp;&nbsp; <\/span>[Parameter(ParameterSetName=&#8221;Type&#8221;,ValueFromPipeline=$true,Position=1)]<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><span>&nbsp;&nbsp;&nbsp; <\/span>[Type]<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><span>&nbsp;&nbsp;&nbsp; <\/span>$type,<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><span>&nbsp;&nbsp;&nbsp; <\/span><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><span>&nbsp;&nbsp;&nbsp; <\/span>[Parameter(ParameterSetName=&#8221;CommandInfo&#8221;,ValueFromPipeline=$true,Position=1)]<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><span>&nbsp;&nbsp;&nbsp; <\/span>[Management.Automation.CmdletInfo]<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><span>&nbsp;&nbsp;&nbsp; <\/span>$commandInfo,<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><span>&nbsp;&nbsp;&nbsp; <\/span>[Parameter(Position=0)]<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><span>&nbsp;&nbsp;&nbsp; <\/span>[string]<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><span>&nbsp;&nbsp;&nbsp; <\/span>$name<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><span>&nbsp;&nbsp;&nbsp; <\/span>)<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><span>&nbsp;&nbsp;&nbsp; <\/span>Process<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><span>&nbsp;&nbsp;&nbsp; <\/span>{<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>if (! $type) {<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>if ($commandInfo.ImplementingType) { $type = $commandInfo.ImplementingType }<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>}<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>if ((! $type) -and (! $commandInfo)) {<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">@&#8221;<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">$(if ($name) { &#8216;function &#8216; + $name + &#8216;() {&#8216; })<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">cmdlet `<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">param()<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">begin {}<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">process {}<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">end {}<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">$(if ($name) {&#8216;}&#8217; })<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&#8220;@<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>} else {<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>if (! ($type.IsSubclassOf([Management.Automation.Cmdlet]))) {<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>throw &#8220;Must provide a cmdlet to create a proxy&#8221;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>}<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>$commandMetaData = New-Object Management.Automation.CommandMetadata $type<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>$proxyCommand =<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">@&#8221;<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">$(if ($name) { &#8216;function &#8216; + $name + &#8216;() {&#8216; })<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">$([Management.Automation.ProxyCommand]::Create($commandMetaData))<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">$(if ($name) {&#8216;}&#8217; })<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&#8220;@<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>$executionContext.InvokeCommand.NewScriptBlock($proxyCommand)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>}<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\"><span>&nbsp;&nbsp;&nbsp; <\/span>}<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">}<\/font><\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp; Script Cmdlets are one of the coolest things about the newer version of PowerShell.&nbsp; A Script cmdlet allows you to use all of the variety of cmdlet parameter sets inside of PowerShell functions. Since Script Cmdlets are PowerShell functions, and the PowerShell engine prefers to run functions rather than commands, you can use Script [&hellip;]<\/p>\n","protected":false},"author":600,"featured_media":13641,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[168,180,278,302],"class_list":["post-6211","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-powershell","tag-get-command","tag-get-random","tag-proxy","tag-scriptcmdlet"],"acf":[],"blog_post_summary":"<p>&nbsp; Script Cmdlets are one of the coolest things about the newer version of PowerShell.&nbsp; A Script cmdlet allows you to use all of the variety of cmdlet parameter sets inside of PowerShell functions. Since Script Cmdlets are PowerShell functions, and the PowerShell engine prefers to run functions rather than commands, you can use Script [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/posts\/6211","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/users\/600"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/comments?post=6211"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/posts\/6211\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/media\/13641"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/media?parent=6211"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/categories?post=6211"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/tags?post=6211"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}