Condividi tramite


Come scrivere un modulo di script di PowerShell

Un modulo script è qualsiasi script di PowerShell valido salvato in un'estensione .psm1. Questa estensione consente al motore di PowerShell di usare regole e cmdlet del modulo nel file. La maggior parte di queste funzionalità consente di installare il codice in altri sistemi e di gestire l'ambito. È anche possibile usare un file manifesto del modulo, che descrive installazioni e soluzioni più complesse.

Scrittura di un modulo script di PowerShell

Per creare un modulo script, salvare uno script di PowerShell valido in un file di .psm1. Lo script e la directory in cui è archiviato devono usare lo stesso nome. Ad esempio, uno script denominato MyPsScript.psm1 viene archiviato in una directory denominata MyPsScript.

La directory del modulo deve trovarsi in un percorso specificato in $Env:PSModulePath. La directory del modulo può contenere tutte le risorse necessarie per eseguire lo script e un file manifesto del modulo che descrive il funzionamento del modulo in PowerShell.

Creare un modulo di PowerShell di base

I passaggi seguenti descrivono come creare un modulo di PowerShell.

  1. Salvare uno script di PowerShell con un'estensione .psm1. Usare lo stesso nome per lo script e la directory in cui viene salvato lo script.

    Il salvataggio di uno script con l'estensione .psm1 significa che è possibile usare i cmdlet del modulo, ad esempio Import-Module. I cmdlet del modulo esistono principalmente in modo da poter importare ed esportare il codice nei sistemi di altri utenti. La soluzione alternativa consiste nel caricare il codice in altri sistemi e quindi in un'origine punto nella memoria attiva, che non è una soluzione scalabile. Per altre informazioni, vedere Informazioni su un modulo di Windows PowerShell. Per impostazione predefinita, quando gli utenti importano il file di .psm1, tutte le funzioni nello script sono accessibili, ma le variabili non lo sono.

    Uno script di PowerShell di esempio, intitolato Show-Calendar, è disponibile alla fine di questo articolo.

    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
    }
    
  2. Per controllare l'accesso utente a determinate funzioni o variabili, chiamare Export-ModuleMember alla fine dello script.

    Il codice di esempio nella parte inferiore dell'articolo ha una sola funzione, che per impostazione predefinita verrebbe esposta. È tuttavia consigliabile chiamare in modo esplicito le funzioni da esporre, come descritto nel codice seguente:

    function Show-Calendar {
          }
    Export-ModuleMember -Function Show-Calendar
    

    È possibile limitare gli elementi importati usando un manifesto del modulo. Per altre informazioni, vedere Importazione di un modulo di PowerShell e Come scrivere un manifesto del modulo di PowerShell.

  3. Se è necessario caricare moduli personalizzati, è possibile usare Import-Module, nella parte superiore del modulo.

    Il cmdlet Import-Module importa un modulo di destinazione in un sistema e può essere usato in un secondo momento nella procedura per installare il proprio modulo. Il codice di esempio nella parte inferiore di questo articolo non usa moduli di importazione. Ma in caso affermativo, verrebbero elencati all'inizio del file, come illustrato nel codice seguente:

    Import-Module GenericModule
    
  4. Per descrivere il modulo al sistema della Guida di PowerShell, è possibile usare commenti della Guida standard all'interno del file o creare un file della Guida aggiuntivo.

    L'esempio di codice nella parte inferiore di questo articolo include le informazioni della Guida nei commenti. È anche possibile scrivere file XML espansi che contengono contenuto aggiuntivo della Guida. Per altre informazioni, vedere Scrittura della Guida per i moduli di Windows PowerShell.

  5. Se si dispone di moduli aggiuntivi, file XML o altro contenuto che si vuole creare con il modulo, è possibile usare un manifesto del modulo.

    Un manifesto del modulo è un file che contiene i nomi di altri moduli, layout di directory, numeri di controllo delle versioni, dati dell'autore e altre informazioni. PowerShell usa il file manifesto del modulo per organizzare e distribuire la soluzione. Per altre informazioni, vedere Come scrivere un manifesto del modulo di PowerShell.

  6. Per installare ed eseguire il modulo, salvare il modulo in uno dei percorsi di PowerShell appropriati e usare Import-Module.

    I percorsi in cui è possibile installare il modulo si trovano nella variabile globale $Env:PSModulePath. Ad esempio, un percorso comune per salvare un modulo in un sistema sarà %SystemRoot%/users/<user>/Documents/PowerShell/Modules/<moduleName>. Assicurarsi di creare una directory per il modulo che usa lo stesso nome del modulo script, anche se si tratta solo di un singolo file .psm1. Se il modulo non è stato salvato in uno di questi percorsi, è necessario specificare il percorso del modulo nel comando Import-Module. In caso contrario, PowerShell non sarà in grado di trovare il modulo.

    Nota

    A partire da PowerShell 3.0, se il modulo è stato inserito in uno dei percorsi del modulo di PowerShell, non è necessario importarlo in modo esplicito. Il modulo viene caricato automaticamente quando un utente chiama la funzione. Per altre informazioni sul percorso del modulo, vedere Importazione di un modulo di PowerShell e about_PSModulePath.

  7. Per rimuovere un modulo dal servizio attivo nella sessione di PowerShell corrente, usare Remove-Module.

    Nota

    Remove-Module rimuove un modulo dalla sessione di PowerShell corrente, ma non disinstalla il modulo o elimina i file del modulo.

esempio di codice Show-Calendar

L'esempio seguente è un modulo script che contiene una singola funzione denominata Show-Calendar. Questa funzione visualizza una rappresentazione visiva di un calendario. L'esempio contiene le stringhe della Guida di PowerShell per il synopsis, la descrizione, i valori dei parametri e il codice. Quando il modulo viene importato, il comando Export-ModuleMember assicura che la funzione Show-Calendar venga esportata come membro del modulo.

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