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

PowerShell 函数的更多相关文章

  1. Powershell 函数中的CmdletBinding()是怎么回事?

    参考文章: Don Jones https://technet.microsoft.com/en-us/library/ff677563.aspx powershell 帮助文档: help abou ...

  2. 【转】PowerShell 函数(Function)

    转至:http://blog.csdn.net/kk185800961/article/details/49022395 函数基本操作: [plain] view plain copy #创建函数 F ...

  3. powershell 函数, foreach中格式化

    function testArg { $n = 1; if($args.Count -eq 0) { "No arg!" } else { $args | foreach {&qu ...

  4. PowerShell控制台输出符号+函数参数类型指定+文本内容读取

    There are several ways: Write-Host: Write directly to the console, not included in function/cmdlet o ...

  5. PowerShell自定义函数定义及调用

    PowerShell是一种命令集,也有自己的语法定义及函数.本文主要介绍如何自定义powershell函数及如何调用,当初在写PowerShell自定义函数的时候查阅了很多资料都没找到如何调用自定义函 ...

  6. 利用PowerShell复制SQLServer账户的所有权限

    问题 对于DBA或者其他运维人员来说授权一个账户的相同权限给另一个账户是一个很普通的任务.但是随着服务器.数据库.应用.使用人员地增加就变得很枯燥乏味又耗时费力的工作.那么有什么容易的办法来实现这个任 ...

  7. powershell脚本,命令行参数传值,并绑定变量的例子

    这是小技巧文章,所以文章不长.但原创唯一,非常重要.我搜了下,还真没有人发 powershell怎样 [命令行 参数 绑定],所以我决定写成博客. 搜索关键字如下: powershell 命令行 参数 ...

  8. Powershell --在线学习

    介绍和安装 自定义控制台 快速编辑模式和标准模式 快捷键 管道和重定向 Powershell交互式 数学运算 执行外部命令 命令集 别名 通过函数扩展别名 执行文件和脚本 Powershell变量 定 ...

  9. PowerShell 在线教程 4

    PowerShell 在线教程 4   认识Powershell 介绍和安装 自定义控制台 快速编辑模式和标准模式 快捷键 管道和重定向 Powershell交互式 数学运算 执行外部命令 命令集 别 ...

随机推荐

  1. SQL-Oracle内实现柱形图式的效果

    在SQL SERVER内有一个函数replicate()可以实现柱形图效果,本质上是利用字符重复出现的次数来控制柱形图的长短,效果如图: 如果要在Oracle内实现相同的效果,则需要自己写一个函数: ...

  2. Android中使用ContentProvider进行跨进程方法调用

    原文同一时候发表在我的博客 点我进入还能看到很多其它 需求背景 近期接到这样一个需求,须要和别的 App 进行联动交互,比方下载器 App 和桌面 App 进行联动.桌面的 App 能直接显示下载器 ...

  3. PKI(公钥基础设施)基础知识笔记

    数字签名 数字签名(又称公钥数字签名.电子签章)是一种类似写在纸上的普通的物理签名,可是使用了公钥加密领域的技术实现.用于鉴别数字信息的方法. 一套数字签名通常定义两种互补的运算.一个用于签名,还有一 ...

  4. jquery查找元素

    一:查找元素 * 所有元素 element 该名称的所有元素(p,input) #id 拥有指定id属性的元素 .class 拥有所有指定class属性的元素 selector1,selector2 ...

  5. 原生js实现一个简单的倒计时功能

    大家好,我是云中君!欢迎大家来观看我的博客 之前那,在群里看到很多人问,关于电商网站中的倒计时功能怎么实现,很多人说在网上找了很多插件,但是不是很会用,所以今天就在这里分享一下我封装的一个小的倒计时功 ...

  6. Django的Form(二)

    上一篇已经简单介绍了Django的Form,现在开始进阶操作了 ..... 创建Form类的时候,主要涉及到Form字段和Form的插件,字段用于做form验证,插件用来生成HTML DjiangoF ...

  7. 前后端分离ueditor富文本编辑器的使用-Java版本

    最近在写一个自己的后台管理系统(主要是写着玩的,用来熟悉后端java的知识,目前只是会简单的写点接口),想在项目中编写一个发布新闻文章的功能,想到了使用百度的ueditor富文本编辑器,网上找了很多j ...

  8. go基础之--函数和map

    在整理函数之前先整理一下关于指针 指针 普通类型变量存的就是值,也叫值类型.指针类型存的是地址,即指针的值是一个变量的地址.一个指针指示值所保存的位置,不是所有的值都有地址,但是所有的变量都有.使用指 ...

  9. 《编程珠玑(第2版)》【PDF】下载

    <编程珠玑(第2版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382225 内容简介 书的内容围绕程序设计人员面对的一系列实 ...

  10. Java中 &&与&,||与|的区别

    区别 &&  || 是逻辑运算,支持短路运算 & | 是位运算,不支持短路运算 短路运算 当有多个表达式时,左边的表达式值可以确定结果时,就再继续运算右边的表达式的值; 举例 ...