2011-01-11 15 views
5

¿es posible asignar algunos atributos de metadatos a las macros powershell? Tengo el conjunto de macros y quiero encapsularlas en grupos lógicos. Me imagino algo como:Atributos Powershell?

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

y luego pasar todas las macros cargadas en tiempo de ejecución y filtrarlas como:

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

estaré agradecido por cualquier ayuda

Respuesta

5

Interesante pregunta ... Hay no hay tales atributos de funciones, AFAIK. Pero creo que hay una manera medio hacky que usa atributos de ayuda basados ​​en comentarios (tal vez ni siquiera hacky pero no estoy seguro).

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

Salida:

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

Tal vez este enfoque podría ser útil en algunos escenarios.

Ver también los PALABRAS CLAVE Ayuda basada en comentarios en la sección de ayuda:

man about_Comment_Based_Help 

ACTUALIZACIÓN Aunque la respuesta anterior es aceptada, todavía no estoy muy contento con él. Aquí hay otro enfoque que definitivamente no es hacky. También tiene una ventaja, ver los comentarios. Este enfoque utiliza alias adicionales con nombres convencionales.

# 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

La organización y agrupación de comandos es un dilema constante en PowerShell. Es algo que siempre tendrá que ser manejado. Sin embargo, existen algunas prácticas recomendadas para nombrar cmdlets y funciones que pueden funcionar si es diligente. Probablemente hayas notado que todos los cmdlets están en el formato verb-noun. IE Get-Process, Set-Item, etc. Lo que mucha gente hace es agregar una tercera parte al comando que agrupa los sustantivos. Por ejemplo, en el mundo de Active Directory, no tiene get-user, sino más bien get-aduser.

Una cosa que podría hacer, y puede no ser la más bonita, es nombrar las funciones de prueba de su unidad con una secuencia de 2 o 3 letras de su elección. Digamos que elegiste algo increíblemente original como UT para la prueba unitaria. Su función sería entonces

function Do-UTSomething { "Something was done" } 

Una vez que tenga todas sus funciones UT, puede usar el cmdlet Get-Command para iterar a través de ellos al igual que

Get-Command *UT* -commandtype function 

Además, si vas un poco más allá y paquete en un módulo, podría hacer una mejor y ordenar por ese módulo.

Get-Command -module MyUnitTest 

Usted puede obtener todo tipo de información sobre los módulos mediante el uso de

help about_modules 
+0

gracias por la sugerencia, pero esto no fue mi punto. Ya he creado convetions y macro set creados donde no hay forma de cambiarles el nombre (porque hay muchas otras macros dependientes que los están usando) –