Skip to main content

using throw inside param() block

Recently I had to write  a very restrictive script which takes few arguments like a filename, computername etc.
These parameters need to be compulsory otherwise the script should not run...

Below is the first function I came up with(nothing fancy):

function Test-AdvancedFunction {
     [CmdletBinding()]
      param(
           [Parameter(Position =0, Mandatory =$true )]
           [ValidateScript({Test-path $_})]
           [ System.String]
            $FileName

     )
     $Name
     ## Normal Script Code goes here
     }

In the above in the param() block a mandatory named argument is specified and has a ValidateScript attribute.

Everything looks great but the function needs to be very restrictive and it should fail when the parameter is not supplied to the function.
Right now because of making the parameter mandatory , I get a prompt to supply the value as below :



But I wanted my function to fail if the parameter is not specified cause I want to run my function non-interactively. 

I knew that the throw statement can be used to achieve this. Below is the info from about_throw topic.

USING THROW TO CREATE A MANDATORY PARAMETER

   You can use the Throw keyword to make a function parameter mandatory.

   This is an alternative to using the Mandatory parameter of the Parameter
   keyword. When you use the Mandatory parameter, the system prompts the user
   for the required parameter value. When you use the Throw keyword, the
   command stops and displays the error record.

So I used the throw statement to achieve what I needed, instead of the Mandatory Named Argument  :)

function Test-AdvancedFunction {
     [CmdletBinding()]
      param(
           [Parameter(Position =0 )]
           [ValidateScript({ Test-path $_})]
           [System.String]
           $FileName = $(throw "Filename not specified")

     )
      $FileName
      ## Normal Script Code goes here
     }


Now I can use validation as well as exit the function when the parameter is not specified  :

So in this way we can have a mandatory parameter which will exit the script/function if the parameter is not supplied while invoking the script/function rather than prompting user for the info.

Popular posts from this blog

Test connectivity via a specific network interface

Recently while working on a Private cloud implementation, I came across a scenario where I needed to test connectivity of a node to the AD/DNS via multiple network adapters.  Many of us would know that having multiple network routes is usually done to take care of redundancy. So that if a network adapter goes down, one can use the other network interface to reach out to the node. In order to make it easy for everyone to follow along, below is an analogy for the above scenario: My laptop has multiple network adapters (say Wi-Fi and Ethernet) connected to the same network. Now how do I test connectivity to a Server on the network only over say Wi-Fi network adapter?

PowerShell + SCCM : Run CM cmdlets remotely

Today I saw a tweet about using implicit remoting to load the Configuration Manager on my machine by Justin Mathews . It caught my eye as I have never really tried it, but theoretically it can be done. Note - The second tweet says "Cannot find a provider with the name CMSite", resolution to which is in the Troubleshooting section at the end.

PowerShell + WPF + GUI : Hide (Use) background PowerShell Console

Few years back, I had started wrapping my PowerShell scripts with some sort of GUI built using Windows Forms (used Primal Forms CE mostly). Things went fine for a while but then I stumbled across awesome posts by MVP Boe Prox on using WPF with PowerShell to do the same. (check Resources section) I had been procrastinating the idea of playing with WPF for a while but then had a great discussion with MVP Chendrayan (Chen) and got inspired to do it. One can use Visual Studio (Express Edition - which is free) to design the UI and then consume the XAML in PowerShell script...Isn't that Cool ! See resources section for links on that. Often when we write the Code to present a nice UI to the end user there is a PowerShell console running in the background. In this post I would like to share a trick to hide/show the background console window. This trick works with both Winforms and XAML. Note - PowerGUI & Visual Studio Express are absolutely FREE ! For the demo o...