如何编写 PowerShell 脚本模块

编写 PowerShell 脚本模块

您可以通过将有效的 PowerShell 脚本保存到 hbase-runner.psm1 文件,然后将该文件保存在 PowerShell 可以找到它的目录中来创建脚本模块。 在该文件夹中,还可以放置运行脚本所需的任何资源,以及描述模块工作方式的清单文件。

创建基本 PowerShell 模块

1.    获取现有的 PowerShell 脚本,并使用扩展名 hbase-runner.psm1 保存该脚本。

保存带有. hbase-runner.psm1 扩展名的脚本意味着可以使用模块 cmdlet (如import-module)。 这些 cmdlet 主要是为了使你能够轻松地将代码导入或导出到其他用户的系统上。 (另一种解决方案是在其他系统上加载代码,然后将代码点置于活动内存中,这不是一个特别可扩展的解决方案。)有关详细信息,请参阅Windows PowerShell 模块中的模块 cmdlet 和变量部分。请注意,默认情况下,导入 hbase-runner.psm1 文件的用户可以访问脚本中的所有函数,但不会显示属性。

本主题末尾提供了一个名为 Show-Calendar 的示例 PowerShell 脚本。

function Show-Calendar {

param(

    [DateTime] $start = [DateTime]::Today,

    [DateTime] $end = $start,

    $firstDayOfWeek,

    [int[]] $highlightDay,

    [string[]] $highlightDate = [DateTime]::Today.ToString()

    )

    #actual code for the function goes here see the end of the topic for the complete code sample

}


2.    若要控制用户对某些函数或属性的访问,请在脚本末尾调用export-modulemember 。

页面底部的示例代码只有一个函数,该函数在默认情况下会公开。 但是,建议显式调用要公开的函数,如以下代码所述:

function Show-Calendar {

      }

Export-ModuleMember -Function Show-Calendar


你还可以使用模块清单来限制导入的内容。 有关详细信息,请参阅导入 Powershell 模块如何编写 powershell 模块清单

3.    如果你有自己的模块需要加载的模块,则可以在你自己的模块顶部对 Import-Module 进行调用。

Import-Module 是一个将目标模块导入系统的 cmdlet。 同样,也可以在稍后的步骤中使用它来安装您自己的模块。 此页底部的示例代码不使用任何导入模块。 但是,如果确实如此,则会在文件顶部列出,如以下代码所述:

Import-ModuleGenericModule

4.    若要将模块描述到 PowerShell 帮助系统,可以在文件中使用标准帮助注释,也可以创建其他帮助文件。

本主题底部的代码示例包含注释中的帮助信息。 你还可以编写包含其他帮助内容的扩展 XML 文件。 有关详细信息,请参阅编写 Windows PowerShell 模块的帮助

5.    如果要将其他模块、XML 文件或其他内容与模块一起打包,则可以使用模块清单来实现此目的。

模块清单是一个文件,其中包含其他模块的名称、目录布局、版本控制编号、作者数据和其他信息片段。 PowerShell 使用模块清单文件来组织和部署解决方案。 但是,由于本示例相对简单,因此不需要清单文件。 有关详细信息,请参阅模块清单

6.    若要安装并运行模块,请将模块保存到相应的 PowerShell 路径之一,并调用 Import-Module。

可以在其中安装模块的路径位于 $env:PSModulePath 全局变量中。 例如,在系统上保存模块的通用路径为 %SystemRoot%/users/<user>/Documents/WindowsPowerShell/Modules/<moduleName>。 请确保为模块创建一个文件夹,使其在中存在,即使它只是一个 hbase-runner.psm1 文件。 如果未将模块保存到其中一个路径,则必须在调用时将模块的位置传入 Import-Module。 (否则,PowerShell 将无法找到它。)从 PowerShell 3.0 开始,如果你已将模块放置在一个 PowerShell 模块路径中,则无需显式导入它。 当用户调用函数时,将自动加载模块。 有关模块路径的详细信息,请参阅导入 PowerShell 模块PSModulePath 环境变量

7.    若要从活动服务中删除模块,请调用remove-module

请注意, Remove-module从活动内存中删除模块,实际上不会将模块文件从保存到的位置删除。

显示日历代码示例

下面的示例是一个简单的脚本模块,其中包含一个名为 Show-Calendar 的函数。 此函数显示日历的直观表示形式。 此外,该示例还包含用于摘要、说明、参数值和示例的 PowerShell 帮助字符串。 请注意,最后一行代码确保在导入模块时,将 Show-Calendar 函数作为模块成员导出。

<#

.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 "December 25, 2008"

#>

function Show-Calendar {

param(

    [DateTime] $start = [DateTime]::Today,

    [DateTime] $end = $start,

    $firstDayOfWeek,

    [int[]] $highlightDay,

    [string[]] $highlightDate = [DateTime]::Today.ToString()

    )

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351