powershell: добавить pscustomobject в ArrayList, но все элементы переходят к 1-му свойству

Я только что создал простую функцию "f", которая добавляет элемент pscustomobject в список массивов, но при его отображении результат не такой, как я ожидал:

$c=New-Object System.Collections.ArrayList($null)
function f([string]$a1,[string]$a2)
{
    $c.Add([PSCustomObject]@{item1=$a1;item2=$a2})
}

f("kkk","aaa")
$c

результат:

item1                                item2
-----                                -----
kkk aaa

Мне кажется, что и "ккк", и "ааа" идут в item1, если я наберу

$c.item1

он печатает

kkk aaa

Почему? Я ожидаю, что item1 будет "kkk", а item2 - "aaa".


person Immanuel Kant    schedule 13.05.2015    source источник


Ответы (2)


взгляните на ошибки powershell здесь: https://stackoverflow.com/tags/powershell/info

PowerShell разделяет аргументы функций пробелами, а не запятыми.

для тех, кто не читает комментарии @TheMadTechnician дал вам два правильных способа вызова функции с аргументами в PS: f "kkk" "aaa" или f -a1 "kkk" -a2 "aaa"

person Loïc MICHEL    schedule 13.05.2015
comment
Наверное, было бы неплохо показать ему, как правильно передавать свои аргументы: f "kkk" "aaa" или f -a1 "kkk" -a2 "aaa" - person TheMadTechnician; 13.05.2015
comment
@TheMadTechnician, ваш комментарий должен быть ответом. - person Walter Mitty; 13.05.2015
comment
Спасибо за оперативный ответ, в течении 10 минут! Ух ты! - person Immanuel Kant; 13.05.2015

Хорошо, как было предложено, отвечая. Kayasax действительно дал правильный ответ, даже если он не помог вам решить проблему. Причина, по которой обе эти строки присваиваются первому свойству, заключается в том, что вы неправильно вызвали свою функцию. Вы фактически передали функции 1 аргумент, представляющий собой массив, содержащий две строки. Чтобы правильно передать несколько аргументов в функцию, либо укажите их по имени (полученное от переменной, которой вы назначаете параметр внутри функции, или любых объявленных псевдонимов), либо вы можете передать их без именования в том порядке, в котором они объявлены в функции, разделенные пробелом.

В вашем коде вы эффективно делаете это:

f -a1 ("kkk","aaa") -a2

Чтобы исправить проблему, вы можете либо передать аргументы по положению:

f "kkk" "aaa"

Или вы можете передать аргументы по имени (порядок не имеет значения при передаче по имени):

f -a1 "kkk" -a2 "aaa"

Выполнение любого из них приведет к желаемому результату.

person TheMadTechnician    schedule 13.05.2015
comment
Спасибо, это еще более подробно! - person Immanuel Kant; 13.05.2015
comment
@ImmanuelKant Вместо того, чтобы писать комментарий с благодарностью, вы должны проголосовать за этот ответ, если он вам помог, это способ пойти сюда, на SO - person Loïc MICHEL; 13.05.2015
comment
У него недостаточно репутации, чтобы голосовать, но он должен принять то, что он считает лучшим ответом на свой вопрос @ImmanuelKant. - person Ansgar Wiechers; 13.05.2015