Структуры или объекты в Powershell 2
-
22-07-2019 - |
Вопрос
Есть ли в последней версии Powershell возможность делать что-то вроде JavaScript:
var point = new Object();
point.x = 12;
point.y = 50;
Если нет, то какой эквивалент или обходной путь?
ОБНОВЛЯТЬ
Прочитать все комментарии
Решение
Синтаксис напрямую не поддерживается функциональностью командлета add-member.Некоторое время назад я обернул эту функциональность в функцию кортежа общего назначения.
Это даст вам возможность в одну строку создавать эти объекты.
$point = New-Tuple "x",12,"y",50
Вот код для New-Tuple
function New-Tuple()
{
param ( [object[]]$list= $(throw "Please specify the list of names and values") )
$tuple = new-object psobject
for ( $i= 0 ; $i -lt $list.Length; $i = $i+2)
{
$name = [string]($list[$i])
$value = $list[$i+1]
$tuple | add-member NoteProperty $name $value
}
return $tuple
}
Сообщение в блоге на эту тему: http://blogs.msdn.com/jaredpar/archive/2007/11/29/tuples-in-powershell.aspx#comments
Другие советы
Для простых способов во-первых, это хеш-таблица (доступна в V1).
$obj = @{}
$obj.x = 1
$obj.y = 2
Во-вторых, это PSObject (проще в V2).
$obj = new-object psobject -property @{x = 1; y =2}
Он дает вам примерно тот же объект, но psobjects удобнее, если вы хотите их сортировать/группировать/форматировать/экспортировать.
Извините, хотя выбранный ответ хорош, я не смог удержаться от хакерского ответа в одну строку:
New-Object PsObject | Select-Object x,y | %{$_.x = 12; $_.y = 50; $foo = $_; }
Вы можете сделать это следующим образом:
$point = New-Object Object |
Add-Member NoteProperty x ([int] 12) -passThru |
Add-Member NoteProperty y ([int] 15) -passThru
Что касается одного из ваших комментариев в другом месте, пользовательские объекты могут быть более полезными, чем хеш-таблицы, поскольку они лучше работают с командлетами, которые ожидают, что объекты будут иметь именованные свойства.Например:
$mypoints | Sort-Object y # mypoints sorted by y-value
Как создать объект в PowerShell
http://blogs.msdn.com/powershell/archive/2009/03/11/how-to-create-an-object-in-powershell.aspx
$point = "" | Select @{Name='x'; Expression={12}} ,@{Name='y'; Expression={15}}
или более интуитивно
$point = "" | Select x,y
$point.x=12; $point.y=15