Атрибуты PowerShell? - PullRequest
       10

Атрибуты PowerShell?

5 голосов
/ 11 января 2011

возможно ли присвоить некоторые атрибуты метаданных макросам powershell?У меня есть набор макросов, и я хочу инкапсулировать их в логические группы.Я представляю что-то вроде:

[UnitTest]
function Do-Something()
{
...
}

, а затем передаю все загруженные макросы во время выполнения и отфильтрую их как:

$macrosInRuntime = Get-Item function: 
$unitTestMacros = $macrosInRuntime | 
    ? {$_.Attributes -contain "UnitTest"} # <-- ???
foreach ($macro in $unitTestMacros)
{
   ....
}

Я буду признателен за любую помощь

Ответы [ 2 ]

5 голосов
/ 11 января 2011

Интересный вопрос ... Нет таких атрибутов функций, AFAIK.Но я думаю, что есть полхакерский способ, который использует атрибуты справки на основе комментариев (возможно, даже не хакерский, но я не совсем уверен).

<#
.FUNCTIONALITY
    TEST1
#>
function Do-Something1
{}

<#
.FUNCTIONALITY
    TEST2
#>
function Do-Something2
{}

Get-ChildItem Function: | %{
    $fun = $_.Name
    try {
        Get-Help $fun -Functionality TEST* | %{
            switch($_.Functionality) {
                'TEST1' { "$fun is for test 1" }
                'TEST2' { "$fun is for test 2" }
            }
        }
    }
    catch {}
}

Вывод:

Do-Something1 is for test 1
Do-Something2 is for test 2

Возможно, этот подход может быть полезен в некоторых сценариях.

См. Также раздел КОММЕНТАРИИ НА ОСНОВЕ КОММЕНТАРИИ в справке:

man about_Comment_Based_Help

ОБНОВЛЕНИЕ Хотяответ выше принят, я все еще не совсем доволен им.Вот еще один подход, который определенно не является хакерским.Это также имеет преимущество, см. Комментарии.Этот подход использует дополнительные псевдонимы с обычными именами.

# Functions to be used in tests, with any names
function Do-Something1 { "Something1..." }
function Do-Something2 { "Something2..." }

# Aliases that define tests, conventional names are UnitTest-*.
# Note: one advantage is that an alias can be defined anywhere,
# right where a function is defined or somewhere else. The latter
# is suitable in scenarios when we cannot modify the source files
# (or just do not want to).
Set-Alias UnitTest-Do-Something1 Do-Something1
Set-Alias UnitTest-Do-Something2 Do-Something2

# Get UnitTest-* aliases and extract function names for tests.
Get-Alias UnitTest-* | Select-Object -ExpandProperty Definition

# Or we can just invoke aliases themselves.
Get-Alias UnitTest-* | % { & $_}
2 голосов
/ 11 января 2011

Организация и группировка команд - это постоянная дилемма в PowerShell.Это то, что всегда должно быть управляемым.Тем не менее, существуют некоторые рекомендации по именованию командлетов и функций, которые могут работать, если вы прилежны.Вы, наверное, заметили, что все командлеты имеют формат глагола-существительного.IE Get-Process, Set-Item и т. Д. Многие люди добавляют третью часть в команду, которая группирует существительные вместе.Например, в мире Active Directory у вас нет get-user, а скорее get-aduser.

Одна вещь, которую вы могли бы сделать, и это может быть не самой красивой вещью, - это назвать ваши функции модульного теста с какой-то последовательностью из 2 или 3 букв по вашему выбору.Допустим, вы выбрали что-то невероятно оригинальное, например UT, для модульного тестирования.Тогда ваша функция будет

function Do-UTSomething { "Something was done" }

После того, как вы получите все свои функции UT, вы можете использовать командлет Get-Command для их перебора, например:

Get-Command *UT* -commandtype function

Кроме того, если вы идетеЧуть дальше и упаковать их в модуль, вы могли бы сделать лучше и отсортировать по этому модулю.

Get-Command -module MyUnitTest

Вы можете получить все виды информации о модулях, используя

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