Как создать свой объект в PowerShell

Пост чтоб ссылаться на него, а то часто спрашивают🙂

Самый красивый и правильный способ – использовать командлеты 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# код уже несколько сложнее.

комментариев 11 to “Как создать свой объект в PowerShell”

  1. blog reader Says:

    Расскажите пожалуйста ещё как можно подгрузить из GAC’а сборку и создать экземляр какого-нибудь типа из неё.
    А так же как из PowerShell лучше работать со статическими классами.
    И вообще как PowerShell может помочь разработчику на .NET ну или где про этом ожно почитать, а то везде рассмотриваются только различные сценарии с доступом к AD и другие темы по администрированию.

  2. Xaegr Says:

    Подгрузить сборку так:
    [system.reflection.assembly]::LoadWithPartialName(«system.drawing»)
    Ну и собственно статические методы так и вызываются🙂
    Создать из неё объект:
    new-object system.drawing.point -argumentlist 1,2
    Что еще интересно разработчику на .Net?🙂

  3. blog reader Says:

    А если како-то Exception вылетит — как его в PS поймать можно?
    Вообще была бы в идеале утилитка типа CSharp2PowerShell которая, собственно, занималась переработкой C# кода в PS-скрипт — цены бы ей не было🙂

  4. Xaegr Says:

    https://xaegr.wordpress.com/?s=errors
    Ну и Get-Help about_trap

    Конвертора такого я не видел, в любом случае он выдавал бы ужасный код🙂 Если вы предложите интересный кусок C# кода, я могу попробовать на его примере показать перевод на PS. Код должен включать много разных конструкций, быть не сложным для понимания, и главное — не большим🙂

  5. Т Says:

    Не всё так плохо🙂 CSharp2PowerShell делается легко . Довольно давно уже существует плагин для Reflector’а — PowerShellLanguage .

    http://reflectoraddins.codeplex.com/wikipage?title=PowerShellLanguage&referringTitle=Home

    Который позволяет преобразовывать любые .Net сборки на PowerShell язык . Преобразование очень даже не плохое и может хорошо помочь программистам освоить начальные знания по PoSH’у .

    Ну если вы (Xaegr) вызвались помогать программистам , то у меня для Вас вопрос🙂 …

  6. Т Says:

    Давно не могу понять . В новой версии .Net 4.0 , включена поддержка так называемого Dynamic Language Runtime (http://dlr.codeplex.com/) . Смысл этой технологии в том , что она помогает легко и красиво встраивать скриптовые языки в код своих программ (например в C#) . Это как раз то , что может сделать меня счастливым . MS широко разрекламировала эту технологию и поддержала интеграцию таких языков как Ruby и Python (и сейчас уже много других) .
    Внимание вопрос: почему PowerShell до сих пор не стоит в списке поддерживаемых скриптовых языков ? Я уже не говорю , что ожидал от MS , поддержку PoSH’а самым первым !..

  7. Xaegr Says:

    2 T: Спасибо за напоминание про Reflector, действительно прекрасный инструмент🙂 Но я хотел рассказать скорее о том как подобные преобразования делать вручную, благо это совсем не сложно. А надобность иногда возникает — например для конвертации примеров из MSDN.
    Что касается DLR, то как я понял это скорее механизм для _создания_ скриптовых языков (точнее специализированных языков для решения конкретных задач). И речь там идёт не о интеграции языков, а о написании своих реализаций IronRuby и IronPython🙂
    А PowerShell и так очень просто встраивать в свои программы. Я постараюсь рассказать подробнее при возможности🙂

  8. T Says:

    В принципе одно другому не мешает . Это прослойка , которая даёт скриптовым языкам всю мощь .Net (что действительно поощряет создание скриптовых языков) . Но с другой (и по моему не менее важной) стороны , это механизм , который позволяет встроить в своё бизнес приложение очень гибкий функционал , благодаря использованию внешних скриптов . И на практике вторая фишка намного более востребована . Так что я не понимаю , почему я не могу удобно настроить свою программу на PoSH’е (например как это сделано в ISE) .
    Да , я видел примеры встраивания PoSH’а , но после изящества и простоты DLR , все они выглядят нелепо . Мне кажется подобная дружба технологий была бы весьма очевидной , и отнюдь не противоречит ничему , а только дополняет друг-друга🙂

    ЗюЫю: пример встраивания PoSH’а в C# приложение от Вас будет очень полезен , ибо на русском таких статей всё ещё единицы

  9. Xaegr Says:

    >встроить в своё бизнес приложение очень гибкий функционал , благодаря использованию внешних скриптов
    Дык это и есть изначальная задача скриптовых языков🙂
    >Так что я не понимаю , почему я не могу удобно настроить свою программу на PoSH’е (например как это сделано в ISE) .
    Можете! И честно говоря я даже незнаю куда проще🙂 Так что возможно в DLR не стали реализовывать PS из за того что у него и так всё отлично🙂
    Беда в том что я уже несколько лет не писал на C#, и многое подзабыл. Кроме того у меня в ближайшее время крайне напряженный график, так что хорошего примера от меня ждать не стоит. Но вот буквально вчера появился простенький пример от другого PowerShell MVP🙂
    http://msgoodies.blogspot.com/2009/10/executing-powershell-code-from-within.html
    http://msgoodies.blogspot.com/2009/10/getting-powershell-v2-sdk.html
    Но я себе в todo тоже записал🙂

  10. Xaegr Says:

    Что касается настройки приложений. Была возможность предоставлять в пользование runspace’у PowerShell’а запущенного в вашей программе, выбранные переменные (инстансы классов например). И из PowerShell можно легко смотреть/изменять их свойства, и т.п.
    Например в irc-боте которого я когда то писал, был следующий механизм:
    При получении сообщения, вызывался код PS, и ему в использование предоставлялись инстансы классов $Msg с параметрами сообщения, $User представляющая пользователя отправившего сообщение, и $IrcBot, у которого были методы типа $IrcBot.SendMessage() Ну и остальные возможности PS🙂 Для бота не было ничего невозможного… Жаль я посеял все файлы🙂

  11. Т Says:

    А DLR проще потому что она единый стандарт для этого дела . Зачем учить тучу интерфейсов , если можно выучить общие принципы DLR и все скрипты тебе открыты . К тому же я считаю , что сейчас с DLR работать удобнее (легче и прозрачнее) , чем с PowerShell (последний SDK не пробывал , может ситуация и улучшилась)

    Спасибо за ссылки . Но всё же хотелось бы видеть и русские статьи по этому делу (не для себя прошу , а для народа)🙂 Я и не тревожил Вас с этим вопросом , потому что считаю , отсутствие такого материала на русском — это вина СиШарпников , а не ПоверШельников🙂


Обсуждение закрыто.

%d такие блоггеры, как: