2009-12-30 12 views
11

Procedura per riprodurre:Impossibile creare un alias PowerShell in un modulo di script

Creare un modulo TestAlias ​​in \ WindowsPowerShell \ Modules \ TestAlias ​​\ TestAlias.psm1 con la seguente funzione e alias:

function foo 
{ write-output 'foo' } 


New-Alias -name bar -value foo 

da una sessione di PowerShell:

import-module TestAlias 
bar 

il termine 'bar' non è riconosciuto come il nome di un cmdlet, una funzione, fil di script e, o un programma eseguibile ...

risposta

9

Usa Export-ModuleMember nel file PSM1 di esportare l'Alias ​​

Export-ModuleMember -function foo -Alias bar 
11

È possibile utilizzare

Export-ModuleMember -Function * -Alias * 

di esportare tutte le funzioni e gli alias.

Per impostazione predefinita, i moduli di Windows PowerShell esportano solo comandi (funzioni o cmdlet) e non variabili o alias.

Entrerò un po 'più in dettaglio sul perché questo sia.

Le risposte brevi sono che gli alias, pur essendo convenienti quando si scrivono uno strato, sono un ostacolo alla comprensione di uno script o di un modulo. Sono la ciliegina sulla torta di un buon cmdlet, ma la cosa principale da esporre è la buona cmdlet. Gli alias rendono più difficile per un utente leggere il tuo script per capire cosa stai cercando di fare (Set-Content è molto più facile da capire di sc). Le variabili possono essere anche peggio da esporre, in quanto possono essere facilmente impostate su valori inaspettati e poiché c'è molto poco per aiutare un utente del modulo a capire che sono lì. Poiché i comandi sono facilmente individuabili (Get-Command -Module FOO) e sono più facili da esplorare (con Get-Help), il valore predefinito che un modulo esporterà sono solo i comandi. Come con la maggior parte delle altre cose in PowerShell, è possibile sovrascriverlo se si sceglie, ma i comandi predefiniti sono l'unica cosa che viene esportata da un modulo.

Spero che questo aiuti

+0

Sono d'accordo con il punto sul alias rendere gli script più difficile da capire. Non mi piace nemmeno vedere i post del blog con% e?. Normalmente non userei alias con i moduli, tuttavia ho una libreria di funzioni Powershell V1 esistente che ho convertito in un modulo V2 e ho avuto bisogno di cambiare alcuni nomi di funzioni per supportare la creazione di alcuni privati. In modo che qualsiasi vecchio script basato sulle funzioni non si rompa ho creato alette nel modulo. –

+0

Il punto principale degli alias nei moduli è consentire i verbi che sono naturali al dominio che sono diversi dai normali verbi individuabili. – Chriseyre2000

+2

In realtà questo è il motivo per cui gli alias non avvisano sulla convenzione di denominazione, non sul "punto principale". Il team di IIS aveva già spedito cmdlet che non erano conformi alla convenzione e dovevano essere sottoposti a un alias per consentire la compatibilità. L'uso all'ingrosso di questi alias per rompere la convenzione di denominazione è sconsigliato, ma in qualche modo ampiamente visto (F5, AWS e FIM, solo per citarne alcuni). Per favore affidatevi a domande "sul punto": ho lavorato sulla maggior parte delle linee guida mentre ero nel team PowerShell @ Microsoft. –

Problemi correlati