Passing multiple values to a single PowerShell script parameter

PowershellParameters

Powershell Problem Overview


I have a script to which I pass server name(s) in $args.

This way I can do stuff to this (these) server(s) using foreach:

.\script.ps1 host1 host2 host3

foreach ($i in $args)
{
    Do-Stuff $i
}

I'd like to add a named optional parameter called vlan. I've tried:

Param(
    [string]$vlan
)

foreach ($i in $args)
{
    Write-Host $i
}
Write-Host $vlan

It works if you pass a -vlan parameter but if you don't then the script auto assigns the last server name to $vlan.

So, how can you pass single or multiple parameters plus an optional named parameter to a PowerShell script?

Ideally, here are valid examples:

.\script.ps1 host1
.\script.ps1 host1 host2 host3
.\script.ps1 host1 host2 -vlan office

Powershell Solutions


Solution 1 - Powershell

The easiest way is probably to use two parameters: One for hosts (can be an array), and one for vlan.

param([String[]] $Hosts, [String] $VLAN)

Instead of

foreach ($i in $args)

you can use

foreach ($hostName in $Hosts)

If there is only one host, the foreach loop will iterate only once. To pass multiple hosts to the script, pass it as an array:

myScript.ps1 -Hosts host1,host2,host3 -VLAN 2

...or something similar.

Solution 2 - Powershell

One way to do it would be like this:

 param(
       [Parameter(Position=0)][String]$Vlan,
       [Parameter(ValueFromRemainingArguments=$true)][String[]]$Hosts
    ) ...

This would allow multiple hosts to be entered with spaces.

Solution 3 - Powershell

Parameters take input before arguments. What you should do instead is add a parameter that accepts an array, and make it the first position parameter. ex:

param(
    [Parameter(Position = 0)]
    [string[]]$Hosts,
    [string]$VLAN
    )

foreach ($i in $Hosts)  
{ 
    Do-Stuff $i
}

Then call it like:

.\script.ps1 host1, host2, host3 -VLAN 2

Notice the comma between the values. This collects them in an array

Solution 4 - Powershell

I was having issues doing this in my yml file and then I found this link and adding "-Command" to the front of my script solved it:

https://michlstechblog.info/blog/powershell-passing-an-array-to-a-script-at-command-line/

Solution 5 - Powershell

I call a scheduled script who must connect to a list of Server this way:

Powershell.exe -File "YourScriptPath" "Par1,Par2,Par3"

Then inside the script:

param($list_of_servers)
...
Connect-Viserver $list_of_servers.split(",")

The split operator returns an array of string

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionjcarpioView Question on Stackoverflow
Solution 1 - PowershellBill_StewartView Answer on Stackoverflow
Solution 2 - PowershellNitzView Answer on Stackoverflow
Solution 3 - PowershellFrode F.View Answer on Stackoverflow
Solution 4 - PowershellPaul FabbroniView Answer on Stackoverflow
Solution 5 - PowershellBR1COPView Answer on Stackoverflow