Bagikan melalui


Cara Menulis Modul Skrip PowerShell

Modul skrip adalah skrip PowerShell yang valid yang disimpan dalam ekstensi .psm1. Ekstensi ini memungkinkan mesin PowerShell untuk menggunakan aturan dan cmdlet modul pada file Anda. Sebagian besar kemampuan ini ada untuk membantu Anda menginstal kode di sistem lain, serta mengelola cakupan. Anda juga dapat menggunakan file manifes modul, yang menjelaskan penginstalan dan solusi yang lebih kompleks.

Menulis modul skrip PowerShell

Untuk membuat modul skrip, simpan skrip PowerShell yang valid ke file .psm1. Skrip dan direktori tempat skrip disimpan harus menggunakan nama yang sama. Misalnya, skrip bernama MyPsScript.psm1 disimpan dalam direktori bernama MyPsScript.

Direktori modul harus berada di jalur yang ditentukan dalam $Env:PSModulePath. Direktori modul dapat berisi sumber daya apa pun yang diperlukan untuk menjalankan skrip, dan file manifes modul yang menjelaskan cara kerja modul Anda.

Membuat modul PowerShell dasar

Langkah-langkah berikut menjelaskan cara membuat modul PowerShell.

  1. Simpan skrip PowerShell dengan ekstensi .psm1. Gunakan nama yang sama untuk skrip dan direktori tempat skrip disimpan.

    Menyimpan skrip dengan ekstensi .psm1 berarti Anda dapat menggunakan cmdlet modul, seperti Import-Module. Cmdlet modul ada terutama sehingga Anda dapat mengimpor dan mengekspor kode Anda ke sistem pengguna lain. Solusi alternatif adalah memuat kode Anda pada sistem lain dan kemudian sumber titik ke dalam memori aktif, yang bukan solusi yang dapat diskalakan. Untuk informasi selengkapnya, lihat Memahami Modul Windows PowerShell. Secara default, saat pengguna mengimpor file .psm1 Anda, semua fungsi dalam skrip Anda dapat diakses, tetapi variabel tidak.

    Contoh skrip PowerShell, yang berjudul Show-Calendar, tersedia di akhir artikel ini.

    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. Untuk mengontrol akses pengguna ke fungsi atau variabel tertentu, panggil Export-ModuleMember di akhir skrip Anda.

    Contoh kode di bagian bawah artikel hanya memiliki satu fungsi, yang secara default akan diekspos. Namun, sebaiknya Anda secara eksplisit memanggil fungsi mana yang ingin Anda ekspos, seperti yang dijelaskan dalam kode berikut:

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

    Anda dapat membatasi apa yang diimpor menggunakan manifes modul. Untuk informasi selengkapnya, lihat Mengimpor modul PowerShell dan Cara Menulis Manifes Modul PowerShell.

  3. Jika Anda memiliki modul yang perlu dimuat modul Anda sendiri, Anda dapat menggunakan Import-Module, di bagian atas modul Anda.

    cmdlet Import-Module mengimpor modul yang ditargetkan ke sistem, dan dapat digunakan di titik selanjutnya dalam prosedur untuk menginstal modul Anda sendiri. Kode sampel di bagian bawah artikel ini tidak menggunakan modul impor apa pun. Tetapi jika ya, mereka akan dicantumkan di bagian atas file, seperti yang ditunjukkan dalam kode berikut:

    Import-Module GenericModule
    
  4. Untuk menjelaskan modul Anda ke sistem Bantuan PowerShell, Anda dapat menggunakan komentar bantuan standar di dalam file, atau membuat file Bantuan tambahan.

    Sampel kode di bagian bawah artikel ini menyertakan informasi bantuan dalam komentar. Anda juga dapat menulis file XML yang diperluas yang berisi konten bantuan tambahan. Untuk informasi selengkapnya, lihat Menulis Bantuan untuk Modul Windows PowerShell.

  5. Jika Anda memiliki modul tambahan, file XML, atau konten lain yang ingin Anda kemas dengan modul, Anda dapat menggunakan manifes modul.

    Manifes modul adalah file yang berisi nama modul lain, tata letak direktori, nomor penerapan versi, data penulis, dan informasi lainnya. PowerShell menggunakan file manifes modul untuk mengatur dan menyebarkan solusi Anda. Untuk informasi selengkapnya, lihat Cara menulis manifes modul PowerShell.

  6. Untuk menginstal dan menjalankan modul Anda, simpan modul ke salah satu jalur PowerShell yang sesuai, dan gunakan Import-Module.

    Jalur di mana Anda dapat menginstal modul Anda terletak di variabel global $Env:PSModulePath. Misalnya, jalur umum untuk menyimpan modul pada sistem akan %SystemRoot%/users/<user>/Documents/PowerShell/Modules/<moduleName>. Pastikan untuk membuat direktori untuk modul Anda yang menggunakan nama yang sama dengan modul skrip, meskipun hanya satu file .psm1. Jika Anda tidak menyimpan modul ke salah satu jalur ini, Anda harus menentukan lokasi modul dalam perintah Import-Module. Jika tidak, PowerShell tidak akan dapat menemukan modul.

    Nota

    Dimulai dengan PowerShell 3.0, jika Anda telah menempatkan modul di salah satu jalur modul PowerShell, Anda tidak perlu mengimpornya secara eksplisit. Modul Anda dimuat secara otomatis saat pengguna memanggil fungsi Anda. Untuk informasi selengkapnya tentang jalur modul, lihat Mengimpor modul PowerShell dan about_PSModulePath.

  7. Untuk menghapus modul dari layanan aktif dalam sesi PowerShell saat ini, gunakan Remove-Module.

    Nota

    Remove-Module menghapus modul dari sesi PowerShell saat ini, tetapi tidak menghapus instalan modul atau menghapus file modul.

contoh kode Show-Calendar

Contoh berikut adalah modul skrip yang berisi satu fungsi bernama Show-Calendar. Fungsi ini menampilkan representasi visual kalender. Sampel berisi string Bantuan PowerShell untuk sinopsis, deskripsi, nilai parameter, dan kode. Saat modul diimpor, perintah Export-ModuleMember memastikan bahwa fungsi Show-Calendar diekspor sebagai anggota modul.

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