2011-01-11 25 views
5

Czy można przypisać niektóre Atrybuty metadanych do makr PowerShell? Mam zestaw makr i chcę je enkapsulować do grup logicznych. Wyobrażam sobie coś takiego:Atrybuty Powershell?

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

a następnie przekazać wszystkie załadowane makr w czasie rzeczywistym i filtrować je jak:

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

Będę wdzięczny za wszelką pomoc

Odpowiedz

5

Ciekawe pytanie ... Nie nie ma takich atrybutów funkcji, AFAIK. Ale wydaje mi się, że istnieje pół-hackowy sposób, który wykorzystuje atrybuty pomocy oparte na komentarzach (być może nawet nie jest w ogóle hacky, ale nie jestem do końca pewien).

<# 
.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 {} 
} 

wyjściowa:

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

Być może takie podejście może być użyteczne w niektórych scenariuszach.

Zobacz także sekcja KOMENTARZ-OPARCIU Słowa kluczowe pomagają w pomoc:

man about_Comment_Based_Help 

UPDATE Choć odpowiedź powyżej została zaakceptowana, nadal nie jestem bardzo z niego zadowolony. Oto inne podejście, które zdecydowanie nie jest hacky. Ma także zaletę, patrz komentarze. Takie podejście wykorzystuje dodatkowe aliasy o konwencjonalnych nazwach.

# 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

Porządkowanie i grupowanie poleceń jest ciągłym dylematem w PowerShell. Jest to coś, co zawsze trzeba będzie zarządzać. Jednak istnieją pewne najlepsze praktyki dotyczące nazywania cmdletów i funkcji, które mogą działać, jeśli jesteś sumienny. Prawdopodobnie zauważyłeś, że wszystkie cmdlety są w formacie czasownik-rzeczownik. IE Get-Process, Set-Item itd. Wiele osób dodaje trzecią część do polecenia, które grupuje rzeczowniki razem. Na przykład w świecie usługi Active Directory nie masz get-user, ale raczej get-aduser.

Jedną z rzeczy, które możesz zrobić, i nie musi to być najładniejsza rzecz, jest nazwanie funkcji testu urządzenia za pomocą 2 lub 3 wybranych sekwencji liter. Powiedzmy, że wybrałeś coś niewiarygodnie oryginalnego, jak UT do testu jednostkowego. Czynność byłaby wtedy

function Do-UTSomething { "Something was done" } 

Kiedy już wszystkie swoje funkcje UT, można skorzystać z polecenia Get-polecenia iterację nich jak tak

Get-Command *UT* -commandtype function 

Ponadto, jeśli pójść nieco dalej i zapakuj je do modułu, możesz zrobić lepiej i sortować według tego modułu.

Get-Command -module MyUnitTest 

można dostać wszelkiego rodzaju informacje na temat modułów za pomocą

help about_modules 
+0

dzięki za sugestię, ale to nie był mój punkt. Mam już nazwy konwentów i makropoleceń utworzonych tam, gdzie nie ma możliwości ich zmiany (ponieważ istnieje wiele innych zależnych makr, które ich używają) –