PowerShell 函数

简介:

PowerShell 中函数是一系列 PowerShell 语句的组合。当你通过函数的名称调用函数时,函数中的语句会被顺序的执行,就像在命令行中执行它们一样。

从 hello world 开始

function Say-HelloWorld 
{ Write
-Host "hello world!" }

定义函数必须使用 function 关键字,并且为函数提供一个名称。然后用花括号把 PowerShell 语句括起来。
调用函数的方式也很简单,比如上面的函数连参数都没有定义,直接写函数名称就可以了:

> Say-HelloWorld

函数的命名规则

PowerShell 中命令的命名是非常有特色的,都是 "动词 - 名词" 的模式。MS 也建议我们以同样的模式来命名自定义的函数,以保证代码的可读性。
比如我们定义的函数 Say-HelloWorld 就遵循这样的规则。再举个例子,比如你要定义一个把日志信息写到文件中的函数,那可能就要命名为 Write-Log 之类的名称了。

MS 甚至对常用的名称给出了具体的规范,有兴趣的同学可以去读读:Approved Verbs for Windows PowerShell Commands

位置参数 $args

在 shell 世界中位置参数(Position Patameters)是普遍存在的。其实就是在函数或脚本中我们可以通过默认存在的变量 $args 来引用传递给函数或脚本的参数。$args 变量是一个数组,所以我们需要通过索引语法来引用具体的参数,如 $args[0],$args[1] …

我们在下面的函数中引用位置参数:

function Say-Hello
{
    Write-Host("Hello {0} {1}!" -f $args[0], $args[1])
}
> Say-Hello "Nick" "Li"

命名参数

除了使用位置参数,我们还可以在声明函数时指定命名参数。使用命名的参数还可以为参数指定默认值。

复制代码
function Say-Hello($name, $count=3)
{
    for(;$count -gt 0;$count--)
    {
        Write-Host("Hello {0}!" -f $name)
    }   
}
复制代码
> Say-Hello "Nick" 2

作为 C# 程序员笔者比较喜欢把参数写在小括号里面,但是在 PowerShell 中更常见的参数声明方式为使用 Param 关键字:

复制代码
function Say-Hello
{
    Param
    (
        $name,
        $count=3
    )

    for(;$count -gt 0;$count--)
    {
        Write-Host("Hello {0}!" -f $name)
    }   
}
复制代码

这两种声明函数参数的方式是完全等价的,所以你可以选择自己喜欢的方式。

在调用函数时,我们还可以通过指定参数名称的方式为函数传参:

> Say-Hello -name "Jack" -count 5

从 Pipeline 输入函数参数

PowerShell 中的函数可以很轻松的支持从 Pipeline 输入参数,下面是一个简单的 demo:

复制代码
function Say-Hello
{
    Param
    (
        [parameter(Mandatory=$true, ValueFromPipeline=$true)]
        $name
    )
    process
    {
        Write-Host("Hello {0}!" -f $name)
    }
}
复制代码

在上面的函数声明中我们把函数的主体放入了 process 程序块。在 process 块中的语句会根据 Pipeline 中对象的个数执行多次。也就是说,如果我们通过 Pipeline 为函数传递 3 个参数,那么 process 块中的代码就会执行 3 次。
[parameter(Mandatory=$true, ValueFromPipeline=$true)] 说明可以通过 Pipeline 传递参数 name。试一下通过 Pipeline 传参:

> "Jack","Nick","Alice" | Say-Hello

注意,此时还可以通过 Say-Hello "Nick" 的方式调用函数,我们只是在基本功能的基础上添加了对 Pipeline 的支持。

作用域

函数只存在于创建它的上下文中(scope),比如定义函数的脚本。如果想要在一个脚本中引用在另外一个脚本中定义的函数,需要使用 source(.) 命令。在当前的脚本 A 中使用 source 命令并指定另外一个脚本 B 作为参数,会把 B 中定义的函数、别名和变量引入到脚本 A 的上下文中(scope)。
比如笔者在 Write-Log.ps1 文件中定义了函数 Write-Log,在另外一个脚本中使用 Write-Log 的方法为:
# 此处可以写绝对路径也可以写相对路径

. "./Write-Log.ps1"
Write-Log -Message 'It's a test message'

函数自身会创建一个上下文(scope),在函数中定义的变量在函数外部是不可见的。
但是在函数内部却可以访问在函数外部定义的变量,比如下面的 demo:

$world = "Hello world!"
function Say-Hello 
{ Write
-Host($world) }
> Say-Hello


本文转自sparkdev博客园博客,原文链接:http://www.cnblogs.com/sparkdev/p/8242167.html,如需转载请自行联系原作者

相关文章
|
Windows
Powershell教程(1)——函数Function语法
Powershell教程(1)——函数Function语法
207 0
Powershell教程(1)——函数Function语法
|
3月前
|
存储 Ubuntu Linux
windows可以安装Ubuntu,ubuntu上也可以安装Powershell
powerhsell除了可以在windows上使用外,还可以在Ubuntu上部署开发环境。下面介绍Ubuntu上安装powershell的方法。
50 0
|
5月前
|
Shell Linux 开发工具
windows中cmd和PowerShell批处理命令
之前在 Git 批量删除本地分支,有用到 Linux 或 MacOS 下的批处理命令,这个命令中的 grep、xargs 本身是 Shell script,在 windows 中的 cmd 和 PowerShell 中是不能用的
51 0
|
8月前
|
JavaScript Windows
[Vue]解决 Windows PowerShell 不识别 vue 命令的问题
[Vue]解决 Windows PowerShell 不识别 vue 命令的问题
|
8月前
|
Windows
使用PowerShell获取Windows当前锁屏壁纸
使用PowerShell获取Windows当前锁屏壁纸 如果原始图片丢了,用这段代码就可以提取当前锁屏壁纸了!
101 0
|
应用服务中间件 nginx Windows
Windows PowerShell 中启动 Nginx 报错解决方案
Windows PowerShell 中启动 Nginx 报错解决方案
Windows PowerShell 中启动 Nginx 报错解决方案
|
XML 监控 数据格式
利用powershell进行windows日志分析
0x00 前言   Windows 中提供了 2 个分析事件日志的 PowerShell cmdlet:一个是Get-WinEvent,超级强大,但使用起来比较麻烦;另一个是Get-EventLog,使得起来相当简单,可以实时筛选,接下来,我们利用PowerShell 来自动筛选 Windows 事件日志。
2437 0