从零开始学PowerShell(7) 编写一个函数体

我们已经熟悉了不少PowerShell命令并且学会了通过Get-Help帮助命令自寻去挖掘一个新命令的使用方法,今天是时候可以来讲下如何重用命令了。

在PowerShell控制台中,如果我们要重用之前的命令只需要通过键盘方向键上下翻动就可以了,但这不是今天我要说的内容,毕竟当命令的代码行数越来越多,越来越复杂时创建一个PowerShell函数最合适不过了,在编程里什么是函数呢,你可以简单的理解为把你想做的一切包裹在一个东西里,需要的时候去调用它,它就会执行你想要做的那些事。

先来看下定义一个最简单的PowerShell函数体,只需安装这样的格式编写。

function <函数名称>
{
    代码逻辑块
}

按照上面定义函数的语法格式创建我们自己的函数体,修改我们自己的函数名称和添加想要让这个函数执行的代码逻辑块写成下面这样。

function letspowershell
{
    "This is our frist function."
}

创建一个简单的函数自然很简单,那调用函数也不会太难,直接需要的时候呼叫这个函数名就可以了。
从零开始学PowerShell(7) 编写一个函数体_第1张图片
无论你调用多少次它都会义无反顾的执行你设定的内容,在这个简单的例子里我们让这个函数显示出了一句话。但是这样的函数多少也有些功能简单,所以我们要为它添加一些参数,参数的作用就像是函数体内部的变量外部的变量传值的桥梁,如果你曾经没有任何其它语言编程经验,那可能会少许有些困惑,没关系直接看例子就能理解。

function letspowershell($guest)
{
    "This is our first function, $guest"
}

给一个函数体定义参数只需要在函数名后面添加一个圆括号,在圆括号里写入你定义的参数即可,如我们之前所说这个参数起到的是传递数据的桥梁作用,所以调用函数的时候只需要配合参数-guest和你想要传入的参数值就可以了,甚至也可以省略参数名称。
从零开始学PowerShell(7) 编写一个函数体_第2张图片
除了以上这样定义参数,还有一种格式也可以达到相同的效果,就是使用param关键字。

function letspowershell
{
    param ($guest)

    "This is our first function, $guest"
}

在函数内部使用param关键字意味着你声明了一个函数参数,可以看到和之前在函数名后面直接定义参数效果是一样的。
从零开始学PowerShell(7) 编写一个函数体_第3张图片
到这里,有人或许会提问既然PowerShell的函数可以像一个命令一样反复被执行,而PowerShell的命令又是可以通过管道之间来回传递数据,那么函数体是否可以与管道配合使用呢?答案自然是肯定的。

如果我们直接使用下面的方法去测试管道功能传值,会发现并没有成功把值传入进去。
这里写图片描述
我们需要稍作修改,像下面这样。

function letspowershell
{
    foreach ($i in $input)
    {
        "This is our first function, $i"
    }
}

这里我们引入了foreach循环语句,它可以用来遍历一个循环体,这里的$intput是PowerShell内置的以数组类型存在的自变量。所以当我们在管道符前面传入我们的参数值后,管道符会把前面的值传递进$input变量里,之后进入函数体内的代码逻辑块开始执行。
从零开始学PowerShell(7) 编写一个函数体_第4张图片
但是上面的方法毕竟还是看起来有些怪怪的。

有疑问,是好事。有疑问才代表你在思考问题。很幸运,在PowerShell中有专门的方式通过管道传递参数对象给函数。这里我们要引出三个功能关键字beginprocessend。先来看看这三个功能关键字的作用。

  • Begin: 使用这个关键字后的语句列表块只会运行一次,而且它必须位于函数的开头定义。
  • Process: 使用这个关键字后的语句列表块会针对管道传递过来的每个对象运行一次,并且会自动赋予$_变量。
  • End: 在处理完所有的对象以后,才会运行一次End关键字后的语句列表块,假如我们在函数体内没有使用任何以上三种功能关键字,那么函数体默认将管道传递来的对象视为End方式。

还是通过几个例子来好好理解吧。这里我们创建了一个函数体,把管道传递来的对象以$_自变量输出出来(你应该记得,我们在早前的某篇文章里提到过$_$_可以理解为是指从当前的管道传递过来的对象)

# 定义函数
function letspowershell
{
    begin {"This is Begin, $_"}
    process {"This is Process, $_"}
    end {"This is End, $_"}
}

# 调用函数
PS /> "a","b","c" | letspowershell                                                                                                                                        This is Begin,                                                                                                                                               This is Process, a                                                                                                                                             This is Process, b                                                                                                                                             This is Process, c                                                                                                                                             This is End, c

如上,因为当Begin运行时,函数还没有从管道接收到对象数据,所以没有输出我们的参数值信息,而到了Process部分会循环多次运行管道传递来的每个对象数据,所以输出了多条信息。到了End部分只有最后的一个对象运行了一次。

如果没有使用Begin与Process关键字,函数默认只使用End关键字,并且End关键字也是只运行一次。

# 定义函数
function letspowershell
{
    end {"This is End, $input"}
}

# 调用函数
PS /> "a","b","c" | letspowershell                                                                                                                            This is End, a b c

到此,我们也差不多说完了如何编写一个PowerShell函数体,创建一个函数其实还有许许多多可讲的地方,比如定义强类型参数,位置参数,开关参数,设置函数作用域等等,相信等你慢慢对PowerShell深入后,自然而然会出现对应的需求并知道怎么去使用它们。

你可能感兴趣的:(PowerShell)