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(提供程序)