about_Functions

主题
    about_Functions

简短说明
    说明如何在 Windows PowerShell 中创建和使用函数。


详细说明
    函数是具有指定名称的语句列表。在运行函数时,需键入函数名称。列表中语句的运行效果
    与在命令提示符下键入它们时的运行效果相同。

    与 cmdlet 类似,函数也可带有参数。参数可以是命名参数、位置参数、开关参数或动态参数。
    函数参数可从命令行或通过管道读取。

    函数返回的值可以显示出来、赋给变量或传递到其他函数或 cmdlet。

    函数的语句列表可包含带有 Begin、Process 和 End 关键字的不同语句列表类型。 
    这些语句列表以不同方式对来自管道的输入进行处理。

    筛选器是使用 Filter 关键字的一种特殊函数。

    函数的工作方式也可类似于 cmdlet。可在不使用 C# 编程的情况下创建工作方式类似于 cmdlet 的函数。
    有关详细信息,请参阅 about_Functions_Advanced。


  语法
      下面是函数的语法:

          function [<scope:>]<name> [([type]$parameter1[,[type]$parameter2])]
          {
              param([type]$parameter1 [,[type]$parameter2])

              dynamicparam {<statement list>}
  
              begin {<statement list>}
              process {<statement list>}
              end {<statement list>}
          }


      函数中包含以下各项:

          - 一个 Function 关键字
          - 一个作用域(可选)
          - 一个由您选择的名称
          - 任意数目的命名参数(可选)
          - 括在大括号 ({}) 内的一条或多条 Windows PowerShell 命令


      有关函数中的 Dynamicparam 关键字和动态参数的详细信息,请参阅 
      about_Functions_Advanced_Parameters。


  简单函数
      函数不必很复杂即可非常有用。以下函数可获取不属于当前系统的 System 帐户的环境变量:

          function other_env
          { 
             get-wmiObject win32_environment |
                where {$_.username -ne "<System>"}
          }

      若要运行该函数,请键入“other_env”。

      可创建一个包含有用小型函数的工具箱,并将这些函数添加到 Windows PowerShell 配置文件中,如 
      about_Profiles 中以及本主题后面内容所述。


  使用参数的函数
      可在函数中使用参数,包括命名参数、位置参数、开关参数和动态参数。有关函数中的动态参数的详细信
      息,请参阅 about_Functions_Advanced_Parameters。


  命名参数
      可以定义任意数目的命名参数。可为命名参数提供默认值,如本主题后面的内容所述。

      可以使用 Param 关键字在大括号内定义参数,如以下示例语法所示:
    
          function <name> { 
               param ([type]$parameter1[,[type]$parameter2])
               <statement list> 
          }


      也可以在大括号外定义参数而不使用 Param 关键字,如以下示例语法所示:

          function <name> [([type]$parameter1[,[type]$parameter2])] {
              <statement list>
          }


      这两种方法之间没有差别。您可以自行选择使用任何方法。

      在运行函数时,为参数提供的值将赋给包含该参数名的变量。可在函数中使用该变量的值。

      以下示例是一个名为"Small_files"的函数。此函数有一个 $size 参数。该函数显示小于 $size 参
      数的值的所有文件,并排除目录:

          function small_files {
              param ($size)
              Get-ChildItem c:\ | where {
                  $_.length -lt $size -and !$_.PSIsContainer} 
          }


      在该函数中,可以使用 $size 变量,该变量是为该参数定义的名称。

      若要使用该函数,请键入以下命令:
 
          C:\PS> function small_files -size 50


      也可以为命名参数输入值而不使用该参数的名称。例如,以下命令与指定 Size 参数名的
      命令所得结果相同:

          C:\PS> function small_files 50


      若要定义参数的默认值,请在参数名称的后面键入等号和值,如 Small_files 示例的
      以下变化形式所示:

          function small_files ($size = 100) {
              Get-ChildItem c:\ | where {
                  $_.length -lt $size -and !$_.PSIsContainer} 
          }


      如果键入"small_files"而不带任何值,则函数将 100 赋给 $size。如果提供一个值,
      则函数将使用该值。


  位置参数
      位置参数是不带参数名称的参数。Windows PowerShell 根据参数值的顺序将每个参数值
      与函数中的参数相关联。

      在使用位置参数时,请在函数名称的后面键入一个或多个值。位置参数值赋给 $args 数组变量。
      跟在函数名称后面的值赋给 $args 数组中的第一个位置 $args[0]。

      以下 Extension 函数将 .txt 文件扩展名添加到您提供的文件名:

          function extension {
              $name = $args[0] + ".txt"
              $name
          }

          C:\PS> extension myTextFile
          myTextFile.txt
   
      函数可使用一个以上的位置参数。以下示例显示随函数名称输入的所有值。

          function repeat { foreach ($arg in $args) { "The input is 
          $arg" } }

          C:\PS>repeat one
          The input is one

          C:\PS> repeat one two three
          The input is one
          The input is two
          The input is three


      此函数可使用任意数目的值。该函数将每个值赋给 $args 数组中的一个位置。


  开关参数
      开关是不需要值的参数。在键入函数名称后键入开关参数的名称即可使用开关参数。

      若要定义开关参数,请在参数名称前面指定类型 [switch],如以下示例所示:

          function switchExample {
              param ([switch]$on)
              if ($on) { "Switch on" }
              else { "Switch off" }
          }


      如果在函数名称后面键入 On 开关参数,则函数将显示“Switch on”。如果不使用该开关参数,则函数
      将显示"Switch off"。

          C:\PS> SwitchExample -on
          Switch on

          C:\PS> SwitchExample
          Switch off

      也可在运行函数时将布尔值赋予开关,如以下示例所示:

          C:\PS> SwitchExample -on:$true
          Switch on

          C:\PS> SwitchExample -on:$false
          Switch off


  通过管道将对象传递给函数
      任何函数都可通过管道获取输入。可以使用 Begin、Process 和 End 关键字来控制函数处理来自管道
      的输入的方式。以下示例语法显示了这三个关键字:

          function <name> {
              begin {<statement list>}
              process {<statement list>}
              end {<statement list>}
          }

      Begin 语句列表只运行一次,位于函数开头。

      Process 语句列表针对管道中的每个对象运行一次。
      当 Process 块运行时,将每个管道对象逐次赋予 $_ 自动变量。

      在函数收到管道中的所有对象之后,将运行一次 End 语句列表。如果未使用 Begin、Process 或 End 
      关键字,则将所有语句视同一个 End 语句列表。

      以下函数使用 Process 关键字。该函数显示来自管道的示例:

          function pipelineFunction
          { 
              process {"The value is: $_"}
          }


      若要演示此函数,请输入用逗号分隔的数字数组,如以下示例所示:

          C:\PS> 1,2,4 | pipelineFunction
          The value is: 1
          The value is: 2
          The value is: 4


      在管道中使用函数时,通过管道传递给函数的对象将赋给 $input 自动变量。在从管道传入任何对象之
      前,函数会运行带有 Begin 关键字的语句。在通过管道收到所有对象之后,函数将运行带有 End 关键字
      的语句。

      以下示例显示了和 Begin 和 End 关键字一起使用的 $input 自动变量。

          function PipelineBeginEnd 
          {
              begin {"Begin: The input is $input"}
              end {"End:   The input is $input" }
          }


      如果使用管道运行此函数,则函数将显示以下结果:

          C:\PS> 1,2,4 | PipelineBeginEnd
          Begin: The input is
          End:  The input is 1 2 4


      当 Begin 语句运行时,函数还没有来自管道的输入。End 语句在函数获取值之后运行。

      如果函数中有 Process 关键字,则函数将读取 $input 中的数据。以下示例包含一个 Process 语句列
      表:

          function PipelineInput
          {
              process {"Processing:  $_ " }
              end {"End:   The input is: $input" }
          }  

      在此示例中,通过管道传递给函数的每个对象都将发送到 Process 语句列表。Process 语句将对每个对
      象逐次运行。当函数到达 End 关键字时,$input 自动变量为空。

          C:\PS> 1,2,4 | PipelineInput
          Processing: 1
          Processing: 2
          Processing: 4
          End:  The input is:


  筛选器
      筛选器是一种对管道中的每个对象运行的函数。筛选器与将所有语句都放在 Process 块中的函数类似。

      筛选器的语法如下:

          filter [<scope:>]<name> {<statement list>}

      以下筛选器通过管道获取日志条目,然后显示整个条目或仅显示条目的消息部分:

          filter ErrorLog ([switch]$message)
          {
              if ($message) { out-host -inputobject $_.Message } else 
              { $_ }
          }


  函数作用域
      函数存在于创建它的作用域中。

      如果函数是脚本的一部分,则该函数可供该脚本内的语句使用。默认情况下,脚本中的函数在命令提示符下不可用。

      可以指定函数的作用域。例如,以下示例将函数添加到全局作用域:

 
          function global:get-dependentsvs { get-service |
             where {$_.dependentservices} }


      当函数处于全局作用域中时,可以在脚本中、函数中和命令行上使用该函数。

      函数通常会创建一个作用域。在函数中创建的项(如变量)仅存在于该函数作用域中。

      有关 Windows PowerShell 中的作用域的详细信息,请参阅 about_Scope。

        
  使用 Function: 驱动器查找和管理函数 Windows PowerShell 
      中的所有函数和筛选器都自动存储在 Function: 驱动器中。此驱动器由 Windows PowerShell Function 提供程序公开。

      若要引用 Function: 驱动器,请在 Function 后键入一个冒号,就像引用计算机上的 C 或 D 驱动器
      一样。

      以下命令显示了 Windows PowerShell 的当前会话中的所有函数:

          C:\PS>  dir function:


      函数中的命令作为脚本块存储在该函数的 definition 属性中。例如,若要显示 Windows 
      PowerShell 附带的 Help 函数中的命令,请键入:

          (dir function:help).definition

      有关 Function: 驱动器的详细信息,请参阅"函数"。


  在新会话中重用函数
      在 Windows PowerShell 命令提示符下键入一个函数时,该函数将成为当前会话的一部分。在会话结束
      之前该函数一直可用。

      若要在所有 Windows PowerShell 会话中使用您的函数,请将该函数添加到 Windows PowerShell 配
      置文件中。有关配置文件的详细信息,请参阅 about_Profiles。

      也可以将函数保存在 Windows PowerShell 脚本文件中。在一个文本文件中键入函数,然后以 .ps1 
      作为文件扩展名来保存该文件。


  编写函数帮助
    Get-Help cmdlet 可获取函数、cmdlet、提供程序和脚本的帮助。若要获取函数帮助,请键入 Get-
    Help,并在后面键入函数名称。

    例如,若要获取 MyDisks 函数的帮助,请键入:

        get-help MyDisks

    可使用以下两种方法之一来编写函数帮助:

    --  基于注释的函数帮助

        通过在注释中使用特殊关键字来创建帮助主题。若要创建基于注释的函数帮助,必须将注释放在函数体的
        开头或末尾,或放在 function 关键字前面的行中。有关基于注释的帮助的详细信息,请参阅 
        about_Comment_Based_Help。

    --  基于 XML 的函数帮助

        创建基于 XML 的帮助主题,例如通常为 cmdlet 创建的类型。如果要将帮助主题本地化为多种语言,
        则需要使用基于 XML 的帮助。

        若要将函数与基于 XML 的帮助主题相关联,请使用 .ExternalHelp 帮助注释关键字。有关 
        ExternalHelp 关键字的详细信息,请参阅 about_Comment_Based_Help。有关基于 XML 的帮助的
        详细信息,请参阅 MSDN 中的“如何编写 Cmdlet 帮助”。



另请参阅
    about_Automatic_Variables 
    about_Comment_Based_Help
    about_Functions_Advanced 
    about_Functions_CmdletBinding
    about_Parameters
    about_Profiles
    about_Scopes
    about_Script_Blocks
    Function(提供程序)