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 

5 Answers

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.

2

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.

5

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

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:

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

2

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy