2011-01-11 2 views
5

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

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

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

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

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

ответ

5

Интересный вопрос ... Там нет таких атрибутов функций, 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 

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

Смотрите также раздел К.П-справочной KEYWORDS в помощь:

man about_Comment_Based_Help 

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

# 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

Организация и группировка команд является постоянной дилеммой в 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 
+0

спасибо за предложение, но это не моя точка. Я уже назвал convetions и созданный макрос, там, где нет возможности переименовать их (потому что есть много других зависимых макросов, которые их используют) –

Смежные вопросы