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

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

$c.item1

это печатает

kkk aaa

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

2 ответа

Посмотрите на полезные функции powershell здесь: https://stackru.com/tags/powershell/info

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

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

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

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

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

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

f "kkk" "aaa"

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

f -a1 "kkk" -a2 "aaa"

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

Другие вопросы по тегам