Cómo escribir un módulo de script de PowerShell
Un módulo de script es cualquier script de PowerShell válido guardado en una extensión .psm1. Esta extensión permite que el motor PowerShell use reglas y cmdlets de módulo en su archivo. La mayoría de estas capacidades están ahí para ayudarle a instalar su código en otros sistemas, así como a administrar el alcance. También puede utilizar un archivo de manifiesto del módulo, que describe instalaciones y soluciones más complejas.
Escribir un módulo de script de PowerShell
Para crear un módulo de script, guarde un script de PowerShell válido en un archivo .psm1. El script y el directorio donde se almacena deben usar el mismo nombre. Por ejemplo, un script llamado MyPsScript.psm1 se almacena en un directorio llamado MyPsScript.
El directorio del módulo debe estar en una ruta especificada en $env:PSModulePath. El directorio del módulo puede contener cualquier recurso necesario para ejecutar el script y un archivo de manifiesto del módulo que describe en PowerShell cómo funciona su módulo.
Crear un módulo básico de PowerShell
Los siguientes pasos describen cómo crear un módulo de PowerShell.
Guarde un script de PowerShell con una extensión
.psm1. Utilice el mismo nombre para el script y el directorio donde se guarda el script.Guardar un script con la extensión
.psm1significa que puede usar los cmdlets del módulo, como Import-Module. Los cmdlets del módulo existen principalmente para que pueda importar y exportar su código a los sistemas de otros usuarios. La solución alternativa sería cargar su código en otros sistemas y luego colocarlo en la memoria activa, lo cual no es una solución escalable. Para obtener más información, consulte Descripción de un módulo de Windows PowerShell. De forma predeterminada, cuando los usuarios importan su archivo.psm1, todas las funciones de su script son accesibles, pero no las variables.Un script de PowerShell de ejemplo, titulado
Show-Calendar, está disponible al final de este artículo.function Show-Calendar { param( [DateTime] $start = [DateTime]::Today, [DateTime] $end = $start, $firstDayOfWeek, [int[]] $highlightDay, [string[]] $highlightDate = [DateTime]::Today.ToString('yyyy-MM-dd') ) #actual code for the function goes here see the end of the topic for the complete code sample }Para controlar el acceso del usuario a ciertas funciones o variables, llame a Export-ModuleMember al final de su secuencia de comandos.
El código de ejemplo al final del artículo tiene solo una función, que de forma predeterminada estaría expuesta. Sin embargo, se recomienda indicar explícitamente qué funciones desea exponer, como se describe en el siguiente código:
function Show-Calendar { } Export-ModuleMember -Function Show-CalendarPuedes restringir lo que se importa usando un manifiesto de módulo. Para obtener más información, consulte Importación de un módulo de PowerShell y Cómo escribir un manifiesto de módulo de PowerShell.
Si tiene módulos que su propio módulo necesita cargar, puede usar
Import-Module, en la parte superior de su módulo.El cmdlet
Import-Moduleimporta un módulo de destino a un sistema y se puede utilizar en un punto posterior del procedimiento para instalar su propio módulo. El código de muestra al final de este artículo no utiliza ningún módulo de importación. Pero si así fuera, aparecerían en la parte superior del archivo, como se muestra en el siguiente código:Import-Module GenericModulePara describir su módulo en el sistema de ayuda de PowerShell, puede utilizar comentarios de ayuda estándar dentro del archivo o crear un archivo de ayuda adicional.
El ejemplo de código al final de este artículo incluye la información de ayuda en los comentarios. También puede escribir archivos XML expandidos que contengan contenido de ayuda adicional. Para obtener más información, consulte Escritura de ayuda para módulos de Windows PowerShell.
Si tiene módulos adicionales, archivos XML u otro contenido que desea empaquetar con su módulo, puede usar un manifiesto de módulo.
Un manifiesto de módulo es un archivo que contiene los nombres de otros módulos, diseños de directorio, números de versiones, datos del autor y otra información. PowerShell usa el archivo de manifiesto del módulo para organizar e implementar su solución. Para obtener más información, consulte Cómo escribir un manifiesto de módulo de PowerShell.
Para instalar y ejecutar su módulo, guárdelo en una de las rutas de PowerShell apropiadas y use
Import-Module.Las rutas donde puede instalar su módulo se encuentran en la variable global
$env:PSModulePath. Por ejemplo, una ruta común para guardar un módulo en un sistema sería%SystemRoot%/users//Documents/PowerShell/Modules/ . Asegúrese de crear un directorio para su módulo que use el mismo nombre que el módulo de script, incluso si es solo un archivo .psm1. Si no guardó su módulo en una de estas rutas, deberá especificar la ubicación del módulo en el comandoImport-Module. De lo contrario, PowerShell no podría encontrar el módulo.Nota
A partir de PowerShell 3.0, si colocó su módulo en una de las rutas de módulo de PowerShell, no necesita importarlo explícitamente. Su módulo se carga automáticamente cuando un usuario llama a su función. Para obtener más información sobre la ruta del módulo, consulte Importación de un módulo de PowerShell y about_PSModulePath.
Para eliminar un módulo del servicio activo en la sesión actual de PowerShell, use Remove-Module.
Nota
Remove-Moduleelimina un módulo de la sesión actual de PowerShell, pero no lo desinstala ni elimina sus archivos.
Ejemplo de código Mostrar calendario
El siguiente ejemplo es un módulo de secuencia de comandos que contiene una única función denominada Show-Calendar. Esta función muestra una representación visual de un calendario. El ejemplo contiene las cadenas de ayuda de PowerShell para la sinopsis, la descripción, los valores de los parámetros y el código. Cuando se importa el módulo, el comando Export-ModuleMember garantiza que la función Show-Calendar se exporte como miembro del módulo.
<#
.Synopsis
Displays a visual representation of a calendar.
.Description
Displays a visual representation of a calendar. This function supports multiple months
and lets you highlight specific date ranges or days.
.Parameter Start
The first month to display.
.Parameter End
The last month to display.
.Parameter FirstDayOfWeek
The day of the month on which the week begins.
.Parameter HighlightDay
Specific days (numbered) to highlight. Used for date ranges like (25..31).
Date ranges are specified by the Windows PowerShell range syntax. These dates are
enclosed in square brackets.
.Parameter HighlightDate
Specific days (named) to highlight. These dates are surrounded by asterisks.
.Example
# Show a default display of this month.
Show-Calendar
.Example
# Display a date range.
Show-Calendar -Start "March, 2010" -End "May, 2010"
.Example
# Highlight a range of days.
Show-Calendar -HighlightDay (1..10 + 22) -HighlightDate "2008-12-25"
#>
function Show-Calendar {
param(
[DateTime] $start = [DateTime]::Today,
[DateTime] $end = $start,
$firstDayOfWeek,
[int[]] $highlightDay,
[string[]] $highlightDate = [DateTime]::Today.ToString('yyyy-MM-dd')
)
## Determine the first day of the start and end months.
$start = New-Object DateTime $start.Year,$start.Month,1
$end = New-Object DateTime $end.Year,$end.Month,1
## Convert the highlighted dates into real dates.
[DateTime[]] $highlightDate = [DateTime[]] $highlightDate
## Retrieve the DateTimeFormat information so that the
## calendar can be manipulated.
$dateTimeFormat = (Get-Culture).DateTimeFormat
if($firstDayOfWeek)
{
$dateTimeFormat.FirstDayOfWeek = $firstDayOfWeek
}
$currentDay = $start
## Process the requested months.
while($start -le $end)
{
## Return to an earlier point in the function if the first day of the month
## is in the middle of the week.
while($currentDay.DayOfWeek -ne $dateTimeFormat.FirstDayOfWeek)
{
$currentDay = $currentDay.AddDays(-1)
}
## Prepare to store information about this date range.
$currentWeek = New-Object PsObject
$dayNames = @()
$weeks = @()
## Continue processing dates until the function reaches the end of the month.
## The function continues until the week is completed with
## days from the next month.
while(($currentDay -lt $start.AddMonths(1)) -or
($currentDay.DayOfWeek -ne $dateTimeFormat.FirstDayOfWeek))
{
## Determine the day names to use to label the columns.
$dayName = "{0:ddd}" -f $currentDay
if($dayNames -notcontains $dayName)
{
$dayNames += $dayName
}
## Pad the day number for display, highlighting if necessary.
$displayDay = " {0,2} " -f $currentDay.Day
## Determine whether to highlight a specific date.
if($highlightDate)
{
$compareDate = New-Object DateTime $currentDay.Year,
$currentDay.Month,$currentDay.Day
if($highlightDate -contains $compareDate)
{
$displayDay = "*" + ("{0,2}" -f $currentDay.Day) + "*"
}
}
## Otherwise, highlight as part of a date range.
if($highlightDay -and ($highlightDay[0] -eq $currentDay.Day))
{
$displayDay = "[" + ("{0,2}" -f $currentDay.Day) + "]"
$null,$highlightDay = $highlightDay
}
## Add the day of the week and the day of the month as note properties.
$currentWeek | Add-Member NoteProperty $dayName $displayDay
## Move to the next day of the month.
$currentDay = $currentDay.AddDays(1)
## If the function reaches the next week, store the current week
## in the week list and continue.
if($currentDay.DayOfWeek -eq $dateTimeFormat.FirstDayOfWeek)
{
$weeks += $currentWeek
$currentWeek = New-Object PsObject
}
}
## Format the weeks as a table.
$calendar = $weeks | Format-Table $dayNames -AutoSize | Out-String
## Add a centered header.
$width = ($calendar.Split("`n") | Measure-Object -Maximum Length).Maximum
$header = "{0:MMMM yyyy}" -f $start
$padding = " " * (($width - $header.Length) / 2)
$displayCalendar = " `n" + $padding + $header + "`n " + $calendar
$displayCalendar.TrimEnd()
## Move to the next month.
$start = $start.AddMonths(1)
}
}
Export-ModuleMember -Function Show-Calendar