views:

261

answers:

1

I have the following code:

function HideTemplates($File, $Templates)
{
  foreach ($Template in $Templates)
  {
    Write-Host $Template[0] $Template[1] $Template[2]
  }
}

HideTemplates "test.xml" @(("one", "two", "three"))
HideTemplates "test.xml" @(("four", "five", "six"), ("seven", "eight", "nine"))

It prints:

o n e
t w o
t h r
four five six
seven eight nine

I want it to print:

one two three
four five six
seven eight nine

Am I doing something wrong in my code? Is there a way to force PowerShell to tread a multi-dimensional array with a single item differently?

+1  A: 

Call your function like so:

HideTemplates "test.xml" (,("one", "two", "three"))
HideTemplates "test.xml" (,("four", "five", "six"),("seven", "eight", "nine"))

An array subexpression ie @() does nothing if the contents are already an array. Use the comma operator instead which will always create an array with one element around whatever follows it. Note that you have to add an extra set of parens otherwise this:

HideTemplates "test.xml",("one", "two", "three")

Would be considered a single argument of type array instead of two arguments.

Keith Hill
Thanks--that worked great. I'd tried adding an extra comma at the end--(("one","two"),) --but that didn't work.
Jim