2009-12-30 5 views
11

Pasos para reproducir:No se puede crear un alias de PowerShell en un módulo de script

crear un módulo TestAlias ​​en \ WindowsPowerShell \ Modules \ TestAlias ​​\ TestAlias.psm1 con la siguiente función y alias:

function foo 
{ write-output 'foo' } 


New-Alias -name bar -value foo 

desde una sesión de PowerShell:

import-module TestAlias 
bar 

el término 'bar' no se reconoce como el nombre de un cmdlet, función, fil guión E o programa ejecutable ...

Respuesta

9

Uso Export-ModuleMember en el archivo PSM1 para exportar el alias

Export-ModuleMember -function foo -Alias bar 
11

Puede utilizar

Export-ModuleMember -Function * -Alias * 

para exportar todas las funciones y alias.

De manera predeterminada, los módulos de Windows PowerShell solo exportan comandos (funciones o cmdletS) y no variables o alias.

Voy a entrar en un poco más de detalle acerca de por qué es esto.

Las respuestas cortas son que los alias, aunque son convenientes cuando se escriben líneas, son una barrera para entender un script o un módulo. Son la guinda del pastel de un buen cmdlet, pero lo más importante para exponer es el buen cmdlet. Los alias dificultan que un usuario que lea la secuencia de comandos descubra lo que intenta hacer (Set-Content es mucho más fácil de entender que sc). Las variables pueden ser aún peores para exponer, ya que pueden establecerse fácilmente en valores inesperados y ya que hay muy poco para ayudar a un usuario de su módulo a darse cuenta de que están allí. Debido a que los comandos son fácilmente detectables (Get-Command -Module FOO) y más fáciles de explorar (con Get-Help), el valor predeterminado que exportará un módulo son solo los comandos. Al igual que con la mayoría de las otras cosas en PowerShell, puede anularlo si lo desea, pero por defecto los comandos son lo único que se exporta desde un módulo.

Espero que esto ayude

+0

Estoy de acuerdo con su punto sobre alias haciendo que los guiones sean más difíciles de entender. No me gusta ver publicaciones de blog con% y? Normalmente no usaría alias con módulos, sin embargo, tengo una biblioteca de funciones de Powershell V1 existente que convertí a un módulo de V2 y necesitaba cambiar algunos nombres de funciones para poder hacer algo de privacidad. Para que todos los scripts antiguos basados ​​en las funciones no se rompan, creo alaises en el módulo. –

+0

El punto principal de los alias en los módulos es permitir que los verbos que son naturales del dominio sean diferentes a los verbos normales detectables. – Chriseyre2000

+2

En realidad, esta es la razón por la que los alias no advierten sobre la convención de nombres, no el "punto principal". El equipo de IIS ya había enviado cmdlets que no se ajustaban a las convenciones, y se les tenía que asignar un alias para permitir la compatibilidad. El uso al por mayor de estos alias para romper las convenciones de nomenclatura no se recomienda en gran medida, pero se lo ve ampliamente (F5, AWS y FIM, por nombrar algunos). Confíe en mí en las preguntas "puntuales": trabajé en la mayoría de las directrices mientras estaba en el equipo de PowerShell @ Microsoft. –

Cuestiones relacionadas