Anda di halaman 1dari 5

10/8/2015

LosMdulosenPowerShellV2.0

LosMdulosEnWindowsPowerShellv2.0
Losmdulos
Una muy interesante novedad que incorpora Powershell V 2.0 son los mdulos. Los mdulos permiten a los desarrolladores y
administradoresdividiryorganizarelcdigoenunidadesautocontenidasyreutilizables.Elcdigoprovenientedeunmduloseejecutaen
uncontextoqueestcontenidoenelpropiomduloynoafectaaloqueestfueradichodeunaformamsfcil:permitedefinirvariables,
alias,funciones,etc.,deformaprivadaopblica(quesepuedaninvocarslodesdeelpropiomdulo,privadas,o directamente desde la
lneadecomandosounscriptdePowershell,pblicas,unavezsehaimportadoelmdulo.Estosignificaquepodemoscrearunscriptyque
steseejecuteenunespaciodetrabajorestringido.
Pongamosunejemplo.VamosaconstruirunmduloquesebaseenunscriptdePowershellyquenosmuestrelosdiscoslgicosdeuna
lista de equipos recibida como parmetro en forma de array de cadenas. Al objeto de tipo Win32_LogicalDisk le agregaremos dos
propiedades,unaqueeslaexplicacinentextodesupropiedadDriveType,queesunaenumeracin,ylasegundapropiedadeselespacio
ocupado,obtenidoalrestarelespaciolibredelespaciototal.Veamosestescript:
#Declaramosunparmetrodeentradadetipoarraydecadenas,cuyovaloren
#casodeseromitidoes".":equipolocal
param([String[]]$Equipos=".")
Functionf_Ocupacion($Disco)
#EstafuncinrecibeunobjetoWin32_LogicalDiskydevuelvesuespacioocupado
{
Return$Disco.Size$Disco.FreeSpace
}
Functionf_Tipo($Disco)
#EstafuncinrecibeunobjetoWin32_LogicalDiskydevuelvecomocadenael
#valornumricoqueidentificaeltipodediscoquees
{
Switch($Disco.DriveType)
{
0{"Unknown"}
1{"NoRootDirectory"}
2{"RemovableDisk"}
3{"LocalDisk"}
4{"NetworkDrive"}
5{"CompactDisc"}
6{"RAMDisk"}
}
}
FunctionGetLogicalDisk($Equipos)
#Estafuncinrecibeunalistadeequiposydevuelvelosdiscoslgicosdelos
#mismos,agregandodospropiedades:Type,queeslatraduccinacadenadela
#propiedadnumricaDriveTypeyOccupiedSpacequeeselespacioendiscoqueest
#ocupado
{
ForEach($EquipoIn$Equipos)
{
$wmi_Discos=GetWmiObjectWin32_LogicalDisk
ForEach($wmi_DiscoIn$wmi_Discos)
{
$wmi_Disco|AddMemberNotePropertyType$(f_Tipo$wmi_Disco)
$wmi_Disco|AddMemberNotePropertyOccupiedSpace$(f_Ocupacion$wmi_Disco)
$wmi_Disco
}
}
}
#HacemosvisibledesdeelexteriordelmdulotanslolafuncinGetLogicalDisk
#lasotrasdos(f_Tipoyf_Ocupado)slosepodrnllamardesdedentrodelmdulo
ExportModuleMemberGetLogicalDisk
Estescriptlodebemosguardarnocomo*.ps1,sinocomo*.psm1.PorejemplolollamaremosLogicalDisk.psm1.Paraqueestemdulosea
cargado(yportantoquepodamosejecutarGetLogicalDiskcomootroCmdletmsdePowershell)debemosusarImportModule:
PS> Import-Module LogicalDisk
Aparentementenohabrpasadonada,perosiejecutamosGetLogicalDiskveremosquefunciona.
Enelejemplodeimportacinsevequenohemospuestolarutaynombredelfichero*.psm1porqu?Bueno,losmdulossepueden
importarcuandoestnencualquierubicacinsiseponesurutaynombresinembargo,silosubicamoscontenidosenunacarpetaconsu
propionombresinlaextensin(enelejemplologuardaramosenunacarpetadenombreLogicalDisk)ystacarpetalasituamosenunade
lasdosrutaspredeterminadas,podremosimportarelmdulocomohemosvistoantes,tansoloconponersunombre.Hehabladodedos
rutaspredeterminadasCulesson?EjecutemosdesdePowershell:

http://freyes.svetlian.com/Modulos.htm

1/5

10/8/2015

LosMdulosenPowerShellV2.0

PS> $env:PSModulePath
C:\Users\Mortadelo\Documents\WindowsPowerShell\Modules;C:\Windows\system32\WindowsPowerShell\v1.0\Modules\
EstecomandonosdevuelveunvalordePathcondosrutas:unaesladeusuarioyestensuperfil(losmdulosahcontenidosslopodrn
sercargadosporelusuariodueodelperfil),en%UserProfile%\Documents\WindowsPowershell\Modulesylaotraesladeequipoypuede
serutilizadaportodoslosusuariosdelequiposurutaes%WinDir%\System32\WindowsPowershell\v1.0\Modules.Estonoesinamovible,
puespodemosagregarmsrutasaPSModulePathoinclusocambiarporcompletoel valor de esta variable de entorno. En este ejemplo
supondremosquetenemosunacarpetac:\WindowsPowershell\ModulesylaagregamosalPath:
PS> $env:PSModulePath = $env:PSModulePath + ";C:\WindowsPowershell\Modules"
PS> $env:PSModulePath
C:\Users\Mortadelo\Documents\WindowsPowerShell\Modules;C:\Windows\system32\WindowsPowerShell\v1.0\Modules\;C:\WindowsP
owershell\Modules
UnavezagregadaesarutaalPath,podremosimportarlosmdulosqueestnenesacarpetacontenidosconsoloponerlosnombresdelas
carpetasqueloscontienen.
Sinosfijamos,esteprocederdePowershellconlosmdulosindicaunacosamuyinteresante:cualquierusuario,independientementedel
nivel de privilegios, podr cargar mdulos para as personalizar su consola, tan solo con tener acceso a la carpeta donde estos mdulos
estn.Hastaahoraeranecesariohacerinstalacionesquerequeranprovilegiosdeadministradorparaobtenerestomismoahorasloes
necesariotenerunacarpetaaccesibleparaunusuarionormalparaquestelosagregueasuconsola.
No es necesario que la carpeta de los mdulos se incluya en la variable de entorno PSModulePath pues pueden ser importados desde
cualquierubicacinpasndolarutacompletaalmdulo:
PS> Import-Module c:\PowerShell\Modulos\ObtenerDiscoLogico\ObtenerDiscoLogico.psm1
Noobstante,noesestaunaprcticarecomendable,espreferibletenerlocalizadoslosmdulosenrutasconcretasyquesepuedancargar
sinms.
NoslosepuedenespecificarscriptsdePowershellcomomduloslosposiblesorgenessondos:
Scripts*.psm1quepuedencontenerfunciones,alias,variables,etc.
Ensambladosde.Net(enformade*.dll)quepuedencontenerCmdlets,proveedores,PsSnapins,etc.

Losmanifiestos
Losmdulospuedenseracompaadosdeunmanifiesto,unficherodedatosdePowerShell(.psd1),quenospermite:
Definir prerrequisitos: otros mdulos, scripts, etc., que deben ser cargados antes que el propio mdulo, por necesitarlo para su
funcionamiento
Describirloscontenidosyatributosdelmdulo.
Limitarquesexportadoporlosms,ensamblados,etc.
Determinarcmoseprocesanloscomponentes.
Losmanifiestosnosonrequeridosporlosmdulos.
Los manifiestos pueden referenciar scripts (*.ps1), ficheros de mdulos (*.psm1), otros ficheros de manifiesto (*.psd1), ficheros de
formatos y tipos (*.ps1xml), ensamblados con proveedores y Cmdlets (*.dll), ficheros de recursos, ficheros de ayuda, referencias de
localizacionesdeficherosycualquierotrotipodearchivoorecursoqueseaincludocomopartedelmdulo.Incluso se puede incluir un
catlogodeficherosdemensajesparaelcasodehacerunmduloconmultilenguaje.Elusodeunmanifiestoenlacarpetadeunmdulo
permitepoderreferenciartodosestosficheroscomounsimpleunidad.
Lostiposdeinformacindeunmanifiestoson:
Metadatosdelmdulo,comoversin,autor,descripcin,etc.
Prerequisitosnecesariosparaimportarelmdulo,comolaversindeWindowsPowerShell,laversindeCommonLanguageRuntime
(CLR)ylosmdulosrequeridos.
Directivasdeprocesamientoreferentesascripts,formatosytiposaprocesar.
Restriccionesenlosmiembrosdelmduloqueseexportarn,comolosalias,funciones,variablesyCmdlets.
Unmduloesunatablahash,cuyaspalabrasclaveson:
ModuleToProcess:elmdulodescriptoensambladoconelqueestasociadoelmanifiesto.Tambienhacereferenciaalmduloraz
cuandosetrataemdulosanidados.Elmduloraznotieneporqullamarseigualqueelmanifiesto,peroelmanifiestostieneque
llamarseigualquelacarpetaquelocontiene.Cuandonoseespecificaningnmduloelpropioficherodemanifiestoseconvierteen
elmdulorazysehacereferenciaalcomomodulodemanifiesto.
ModuleList:Listatodoslosmdulosintegrantesdelmdulo.Sepuedenentrarcadaunocomocadenaotablahash(conloscampos
ModuleNameyGUIDdemaneraopcionalsepuedeespecificarModuleVersion).
Version:nmerodeversindelmdulo.
GUID:identificadordelmdulo.
Author:autordelmdulo.
CompanyName:nombredelaempresaovendedordelmdulo.
Copyright:informacindecopyrightdelmdulo.
Description:descripcindelmdulo.
PowerShellVersion:versinmnimadeWindowsPowerShellquepuedeutilizarelmdulo.Losvaloresposibles,demomento,son
1.0y2.0.
PowerShellHostName:nombredelhostdeWindowsPowerShellrequeridoporelmdulo,porejemplo"WindowsPowerShellISE
Host" o "ConsoleHost". El propio Windows PowerShell nos puede identificar este nombre si en el programa ejecutamos

http://freyes.svetlian.com/Modulos.htm

2/5

10/8/2015

LosMdulosenPowerShellV2.0
$Host.Name.Porejemplo,laconsolaes"ConsoleHost"yPowerGUIScriptEditores"PowerGUIScriptEditorHost".Notieneporqu
definirseesteparmetro.
PowerShellHostVersion: versin mnima del host que es requerida por el mdulo. Al igual que el host en s, no es necesario
especificaresteparmetro.
DotNetFrameworkVersion: mnima versin de .NET Framework necesaria para la ejecucin del mdulo. Tampoco es necesario
especificarestepar.
CLRVersion:versindeCLR(CommonLanguageRuntime)de.NETFrameworkrequeridoporelmdulo.Tampocoesrequeridoeste
parmetro.
ProcessorArchitecture: arquitectura del procesador sus valores pueden ser x86, AMD64, IA64, y None (desconocido o no
establecido).Tampocoesrequeridoesteparmetro.
RequiredModules:mdulosadicionalesrequeridosporelmdulodelmanifiesto.Sepuedenentrarcadaunocomocadenaotabla
hash (con los campos ModuleName y GUID de manera opcional se puede especificar ModuleVersion). Windows PowerShell no
importarlosmdulosdeformaautomtica,solamenteverificaqueestnpresentes.Noobstante,spuedensercargadosporalgn
scriptincluidoenelmdulo.Notieneporqudefinirseesteparmetro.
RequiredAssemblies: ensamblados (.dll) requeridos por el mdulo. Son cargados por Windows PowerShell antes de cargar los
mdulosanidadosoelmduloraz.Notieneporqudefinirseesteparmetro.
ScriptsToProcess: scripts que deben ser ejecutados cuando es importado el mdulo. Permiten preparar el entorno de la misma
maneraqueseusanscriptsdelogon.Notieneporqudefinirseesteparmetro.
TypesToProcess: ficheros de tipos (.ps1xml) asociados con el mdulo. Consisten en tipo de .NET Framework usados por los
componentesdelmdulo.Alimportarelmdulo,WindowsPowerShellejecutaUpdateTypeDataconlosficherosespecificados.No
tieneporqudefinirseesteparmetro.
FormatsToProcess:ficherosdeformato(.ps1xml)asociadosconelmdulo.Contieneninformacindepresentacindetipos.NET
usadosporloscomponentesdelmdulo.Cuandoseimportaelmdulo,WindowsPowerShellejecutaUpdateFormatDataconlos
ficherosespecificados.Notieneporqudefinirseesteparmetro.
NestedModules:ficherosdemdulo,scripts(.psm1)y/obinarios(.dll)quesonimportadosenlasesinpropiadelmdulo,perono
enlasesinglobal.Estosignificaquesuscontenidossolosonvisiblesparaelmdulo,peronoparaelusuario,anoserqueseuseel
parametroGlobalalusarImportModule para cargar el mdulo o se exporten explcitamente desde el mdulo raz. Los mdulos
anidados se cargan en el orden en que estn listados, lo cual es necesario tenerlo en cuenta si hay dependencias entre ellos. No
tieneporqudefinirseesteparmetro.
FunctionsToExport:restringelasfuncionesquesonexportadasporelmdulo.Estopermitequeapesardequeunmdulodetipo
script(.psm1)exportedeterminadasfunciones,desdeelmanifiestosepermitaexportarsolounasdeterminas,locualesinteresante
cuandohaymdulosanidados.Notieneporqudefinirseesteparmetro.
CmdletsToExport:lomismoqueFunctionsToExportperoenreferenciaaCmdlets.
VariablesToExport:lomismoqueFunctionsToExportperoenreferenciaalasvariables
AliasesToExport:lomismoqueFunctionsToExportperoenreferenciaalosalias
FileList:todoslosficherosincluidosenelmdulo.Estosficherosnosonexportadosdeformaautomticaconelmdulo.Actuacomo
uninventariodelmdulo.Noesnecesarioespecificaresteparmetro.
PrivateData:datospasadosalmdulocuandoesimportado.Estosdatosestandisponiblesutilizandolavariable$argsdentrodelos
mdulosdescript.Noesnecesarioespecificaresteparmetro.

ElCmdletNewModuleManifestnospermitecrearelficherodemanifiestodeformainteractiva,preguntandonoslosdiferentesparmetros
requeridos por el mismo y generando un fichero de manifiesto que podemos usar luego como plantilla. Por ejemplo, si ejecutamos esto
desdeunaconsoladePowerShell:
PS D:\Perfiles\ReyesF2> New-ModuleManifest
cmdlet New-ModuleManifest en la posicin 1 de la canalizacin de comandos
Proporcione valores para los parmetros siguientes:
Path: .\DesfibriladorNeuroIronico.psd1
NestedModules[0]:
Author: Profesor Bacterio
CompanyName: TIA
Copyright: TIA 2010
ModuleToProcess: DesfibriladorNeuroironico.psm1
Description: Funciones que permiten gestionar el tremendo arma Desfibrilador Neuro-Irnico, de dudoso funcionamiento.
TypesToProcess[0]:
FormatsToProcess[0]:
RequiredAssemblies[0]:
FileList[0]: DesfibriladorNeuroIronico.psm1
FileList[1]:
Estonosdacomoresultadounficheroconelsiguientecontenido:
#
#Manifiestodelmdulo'DesfibriladorNeuroIronico'
#
#GeneradoporProfesorBacterio
#
#Generadoel14/10/2010
#
@{
#Mdulodescriptoarchivodemdulobinarioasociadoconestemanifiesto.
ModuleToProcess='DesfibriladorNeuroironico.psm1'
#Nmerodeversindeestemdulo.
ModuleVersion='1.0'

http://freyes.svetlian.com/Modulos.htm

3/5

10/8/2015

LosMdulosenPowerShellV2.0

#Id.usadoparaidentificardeformanicaestemdulo.
GUID='f65c91da70624b87aa179f27b83c104a'
#Autordeestemdulo.
Author='ProfesorBacterio'
#Compaaoproveedordeestemdulo.
CompanyName='TIA'
#Instruccindecopyrightdeestemdulo.
Copyright='TIA2010'
#Descripcindelafuncionalidadproporcionadaporestemdulo.
Description='FuncionesquepermitengestionareltremendoarmaDesfibriladorNeuroIrnico,dedudosofuncionamiento.'
#VersinmnimadelmotordeWindowsPowerShellrequeridaporestemdulo.
PowerShellVersion=''
#ElnombredelhostdeWindowsPowerShellrequeridoporestemdulo.
PowerShellHostName=''
#VersinmnimadelhostdeWindowsPowerShellrequeridaporestemdulo.
PowerShellHostVersion=''
#Versinmnimade.NETFrameworkrequeridaporestemdulo.
DotNetFrameworkVersion=''
#VersinmnimadeCommonLanguageRuntime(CLR)requeridaporestemdulo.
CLRVersion=''
#Arquitecturadeprocesador(None,X86,Amd64oIA64)querequiereestemdulo.
ProcessorArchitecture=''
#Mdulosquesedebenimportarenelentornoglobalantesdeimportarestemdulo.
RequiredModules=@()
#Ensambladosquesedebencargarantesdeimportarestemdulo.
RequiredAssemblies=@()
#Archivosdescript(.ps1)queseejecutanenelentornodelllamadorantesdeimportarestemdulo.
ScriptsToProcess=@()
#Archivosdetipo(.ps1xml)quesevanacargaralimportarestemdulo.
TypesToProcess=@()
#Archivosdeformato(.ps1xml)quesevanacargaralimportarestemdulo.
FormatsToProcess=@()
#MdulosparaimportarcomomdulosanidadosdelmduloespecificadoenModuleToProcess.
NestedModules=@()
#Funcionesparaexportardesdeestemdulo.
FunctionsToExport='*'
#Cmdletsparaexportardesdeestemdulo.
CmdletsToExport='*'
#Variablesparaexportardesdeestemdulo.
VariablesToExport='*'
#Aliasparaexportardesdeestemdulo.
AliasesToExport='*'
#Listadetodoslosmdulosempaquetadosconestemdulo.
ModuleList=@()
#Listadetodoslospaquetesconestemdulo.
FileList='DesfibriladorNeuroIronico.psm1'
#DatosprivadosparapasaralmduloespecificadoenModuleToProcess.
PrivateData=''
}

http://freyes.svetlian.com/Modulos.htm

4/5

10/8/2015

LosMdulosenPowerShellV2.0

Esteficherolopodemoseditaranuestraconvenienciaparaajustarloalasnecesidadesquetengamos.

Cmdletsyvariablesreferentesalosmdulos
HeaqulosnuevosCmdletsparaeltrabajoconmdulos:
NewModule: Crea un nuevo mdulo dinmico (no almacenado en una carpeta si no creado en tiempo de ejecucin y que se
mantienehastaquesecierralasesindePowerShell).
NewModuleManifest:Creaunnuevoficherodemainfiesto(*.psd1),agregasusvaloresylosalvaenunarutaespecificada.Sepuede
usarparacrearunaplantillaqueluegosearellenadadeformamanual.
ImportModule:AgregaunoomsmdulosalasesindePowerShell.
GetModule: Muestra la informacin referente a los mdulos cargados yo o que pueden ser cargados en la sesin actual de
PowerShell
ExportModuleMember: Especifica los miembros del mdulo que son exportados desde un fichero *.psm1 o un mdulo dinmico
creadoconNewModuleestosmiembrospuedenserCmdlets,funciones,variableyalias.
RemoveModule:DescargaelmduloespecificadodelasesinactualdePowerShell.
TestModuleManifest:Verificaqueunmanifiestodemdulodescribedeformaapropiadaloscomponentesdelmdulo,comprobando
quelosficheroslistadosporelmanifiestoexistenellasrutasespecificadas.Nosloeso,tambinteavisarsihascreadounafuncin
cuyoverbonoesestandar(porejemploObtenerDiscosenlugardeGetDiscos).
Haydosnuevasvariablesreferentesalosmdulos:
$PSScriptRoot:Contieneeldirectoriodesdeelqueelmduloesejecutado.Permitequelosscriptsaccedanaotrosrecursos.
$PSModulePath:Contieneunalistadelocalizacionesdemdulos.
QutodavasiguesusandotuviejoPowerShell1.0?Arrepintete,finstrodepecadorl,ybjatelaversin2.0desdeaqu!!

http://freyes.svetlian.com/Modulos.htm

5/5

Anda mungkin juga menyukai