Пост чтоб ссылаться на него, а то часто спрашивают 🙂
Самый красивый и правильный способ – использовать командлеты New-Object, и Add-Member:
$obj = New-Object psobject
$obj | Add-Member -type noteproperty -name Prop1 -Value "Abc"
$obj | Add-Member -type noteproperty -name Prop2 -Value 123
К сожалению этот способ относительно громоздкий, и при написании “ad-hoc” скриптов, или в интерактивной консоли, часто используют командлет Select-Object. Он оставляет от переданного ему объекта только указанные свойства. Причем свойства можно указывать даже отсутствующие у объекта раньше 🙂 А вместо имён свойств можно использовать специальные хеш-таблицы в которых еще и указывать их значения 🙂
$o = 0 | Select-Object @{name="Prop1";expression={"Abc"}}, @{n="Prop2";e={123}}
Мы передаём на Select-Object объект 0 (ноль), впрочем можно использовать и любой другой, например "" (пустую строку). Ни одно из свойств исходного объекта мы не указываем и они удаляются. Зато добавляем пару новых 🙂
Ну и до кучи – хэш-таблицы (hashtable). Это не объекты, но ведут себя в некоторых случаях довольно похоже.
$h = @{prop1="Abc";prop2=123}
$h["prop3"]=456
$h.prop1 = "Def"
Обратите внимание на такую фичу – к свойствам хеш-таблиц можно обращаться как к массивам по индексу — $h["свойство"], так и как к объектам: $h.свойство.
Upd: Спасибо Вадиму за напоминание, в PowerShell 2.0 можно еще вот так легко создать свой класс с помощью кода C#, и затем его экземпляр:
Add-Type @'
public class MyClass
{
public string prop1 = "blabla";
public bool prop2 = true;
}
'@
$Object = New-Object MyClass
Аналогично можно сделать и в 1.0, но там вызывать C# код уже несколько сложнее.