Есть ли лучший способ получить семантику «класса» в Powershell (определение пользовательских типов)? - PullRequest
2 голосов
/ 11 августа 2010

Я строю систему автоматизации с использованием Powershell и хотел бы определить пользовательские типы .Net, чтобы я мог структурировать свое приложение аналогично другому написанному мной коду.

Сначала я попытался использовать ' Add-Type ' для импорта типов из файлов c # в мое приложение, но я обнаружил, что это очень болезненно для отладки, так как тип .net можно загрузить только один раз во за сеанс Powershell. Это означает, что при возникновении ошибок одно изменение в моем коде требует от меня перезапуска приложения (возможно, я использую C #).

В настоящий момент я моделирую типы в Powershell, используя фабричные функции, которые динамически генерируют объекты PSO с нужной мне семантикой. Это работает, но очень многословно, и я не могу объявить закрытые переменные или методы для инкапсуляции.

Есть ли более простой способ добиться того, чего я хочу?

Если нет ....

Я как-то лаю не на том дереве, желая написать свой код Powershell, используя абстрактные типы данных?

Есть ли лучший способ структурировать мою систему, о которой я должен знать?

Могу ли я достичь некоторой инкапсуляции с тем, что я делаю сейчас?

1 Ответ

2 голосов
/ 12 августа 2010

1) Я не пробовал, но этот проект выглядит многообещающе: PSClass - объектно-ориентированные сценарии в Powershell . Некоторые функции, которые он предлагает:

PsClass в настоящее время реализован в Powershell в одном файле. Делает это прост в использовании. Поддерживает следующие концепции ОО.

  • Наследование
  • Полиморфизм
  • Инкапсуляция
  • Конструкторы с параметрами
  • Примечания - переменные для чтения и записи
  • Методы - скриптовые блоки
  • Свойства с использованием блоков сценариев Get и необязательным набором блоков сценариев
  • Статические и частные заметки и методы

2) Вы можете использовать пользовательские модули, например:

$o = New-Module -AsCustomObject -Function GetVar, AddToVar {
    $script:var = 1
    function checkRange { if ($var -gt 3 -or $var -lt 0) { throw 'not in range <0,3>' } }
    function GetVar { $script:var }
    function AddToVar { param($add) checkRange; $script:var += $add; $script:var }
}
$o.GetVar()
$o.AddToVar(2)
$o.AddToVar(1)
$o.GetVar()
$o.checkRange()
$o | gm

Попробуйте скопировать его на ваш ide / console и запустить. $script:var является закрытым членом, который может использоваться только из функций GetVar, AddToVar. checkRange также является приватным.


Лично я бы не использовал PowerShell для такой задачи, если бы мне нужен был настоящий ООП (доступно в C #). PowerShell имеет некоторую поддержку объектов, но очень плохо для ООП.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...