Complex parameters in Windows PowerShell scripting

Passing and handling parameter in Windows PowerShell script

Like in any other language, in PowerShell we also want to reuse our code and execute same set of operations with different parameters. PowerShell has great support for parameters which can be used in PowerShell script invocation.
If you want your script to accept parameters you need to declare them in the script file. The following is parameter declaration sample and it contains few options which will be explained.

Param( [Parameter(Mandatory=$True, Position=1)]
[string]$logFolder, [Parameter(Mandatory=$True)] [int]$fileAge, [switch]$deleteFile ) Write-Output $logFolder
Write-Output  $fileAge
Write-Output  $deleteFile

Now let's explain the keywords from the sample above

  • Mandatory - Script will not execute unless parameter value is passed 
  • Position - If you do not specify the parameter name in the script call, this is the index of the parameter from which value will be taken
  • [string],[int],[switch] - Data type of the parameter. Data types will be explain in this article.

Switch parameter type

Let's invoke the script from above and see the output

C:\> powershell.exe -command test.ps1 -logFolder c:\logs\ -fileAge 30


You will notice that for the last parameter you have the following output


This is the purpose of switch parameter type. It returns false if the parameter is present or not. If you change the previous call to the following you will get the different output

C:\> powershell.exe -command test.ps1 -logFolder c:\logs\ -fileAge 30


Position attribute

This attribute tells powershell that you are exception this parameter at specific position and it will be fetched even if you do not declare the parameter name in the script file invocation

C:\> powershell.exe -file d:\temp\params.ps1 c:\logs\ -fileAge 30 -deleteFile

Parameter types

Invoking powershell script file supports pretty much all types of data you can use for powershell code functions parameters


32-bit signed integer 
[long]   64-bit signed integer
[string]  Fixed-length string of Unicode characters 
[char]   Unicode 16-bit character 
[bool]   True/false value
[byte]   8-bit unsigned integer 
[double]   Double-precision 64-bit floating point number
[decimal]   128-bit decimal value 
[single]   Single-precision 32-bit floating point number 
[array]   Array of values 
[xml]   Xmldocument object 
[hashtable]   Hashtable object (similar to a Dictionary object)

Invoking script with simple types is trivial and does not need any special explanation. The tough part is invoking script with complex types. These are types marked with blue color in previous list. So let's start with them one by one.

Array type parameters

[String[]] $fruits

Write-Output $fruits.Count

foreach($fruit in $fruits){
    Write-Output $fruit
C:\> powershell.exe -Command c:\temp\params-array.ps1 -fruits Banana,Kiwi,Orange


Xml type parameters


Moe efficient way to deal with XML is to pass the path and then open the document inside the PowerShell script rather than sending whole document as a parameter which may lead to issues because of the XML document complexity

[Parameter(Mandatory=$True, Position=1)]


foreach($fruit in $xmlDoc.SelectNodes("/fruits/fruit")){
    Write-Output $fruit.InnerXml
C:\> powershell.exe -command c:\temp\param-xml.ps1 -xmlDoc "'<fruits><fruit>Banana</fruit><fruit>Kiwi</fruit><fruit>Orange</fruit></fruits>'"


Hashtable type parameters


Write-Output $myObject.FirstName
Write-Output $myObject.LastName
Write-Output $myObject.Email
C:\> powershell.exe -Command c:\temp\params-object.ps1 -myObject "@{FirstName='Dejan';LastName='Stojanovic';Email=''}"





Purpose of the code contained in snippets or available for download in this article is solely for learning and demo purposes. Author will not be held responsible for any failure or damages caused due to any other usage.

About the author


Dejan is a passionate Software Architect/Developer. He is highly experienced in .NET programming platform including ASP.NET MVC and WebApi. He likes working on new technologies and exciting challenging projects

CONNECT WITH DEJAN  Loginlinkedin Logintwitter Logingoogleplus Logingoogleplus


read more


read more


read more

Umbraco CMS

read more

Comments for this article