Powershell: двухмерные массивы

Следующее работает как ожидалось:

$values = @( ("a", "b"), ("c", "d") )
foreach($value in $values)
{
  write-host "Value 0 =" $value[0]
  write-host "Value 1 =" $value[1]
}

который приводит (1) в:

Value 0 = a
Value 1 = b
Value 0 = c
Value 1 = d

Но если я изменю переменную $values ​​на:

$values = @( ("a", "b") )

результат (2) равен:

Value 0 = a
Value 1 =
Value 0 = b
Value 1 =

тогда как я ожидал, что результатом (3) будет:

Value 0 = a
Value 1 = b

Изменение значения $для:

$values = @( ("a"), ("b") )

дает тот же результат, что и результат (2) выше. Это очень разные представления данных.

script, который я пишу, должен иметь возможность обрабатывать двумерные массивы, где первое измерение имеет длину от 0 до N. Я хотел бы иметь возможность написать script, чтобы, элемент уровня должен быть добавлен (или удален), что мне не нужно менять логику script; Я хотел бы иметь возможность просто редактировать "данные".

Итак, мой вопрос: как мне обозначить двумерный массив, чтобы показанный цикл foreach работал корректно, когда первое измерение массива имеет длину 1?

get-host отвечает:

Name             : ConsoleHost
Version          : 2.0
InstanceId       : 2338657f-e474-40d8-9b95-7e2b5f6a8acf
UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture   : en-US
CurrentUICulture : en-US
PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
IsRunspacePushed : False
Runspace         : System.Management.Automation.Runspaces.LocalRunspace

Ответ 1

Это еще один случай, когда поведение обработки массива PowerShell может привести к неожиданным результатам.

Я думаю, вам нужно использовать трюк с запятой (оператор массива), чтобы получить желаемый результат:

$values = @( ,("a", "b") )
foreach($value in $values)
{
  write-host "Value 0 =" $value[0]
  write-host "Value 1 =" $value[1]
}

Результат:

Value 0 = a
Value 1 = b

На самом деле все, что вам нужно, это:

$values = ,("a", "b")

В этой статье объясняется более подробная информация о работе с массивами PowerShell:

http://blogs.msdn.com/b/powershell/archive/2007/01/23/array-literals-in-powershell.aspx