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

PowerShell 函数的更多相关文章
- Powershell 函数中的CmdletBinding()是怎么回事?
参考文章: Don Jones https://technet.microsoft.com/en-us/library/ff677563.aspx powershell 帮助文档: help abou ...
- 【转】PowerShell 函数(Function)
转至:http://blog.csdn.net/kk185800961/article/details/49022395 函数基本操作: [plain] view plain copy #创建函数 F ...
- powershell 函数, foreach中格式化
function testArg { $n = 1; if($args.Count -eq 0) { "No arg!" } else { $args | foreach {&qu ...
- PowerShell控制台输出符号+函数参数类型指定+文本内容读取
There are several ways: Write-Host: Write directly to the console, not included in function/cmdlet o ...
- PowerShell自定义函数定义及调用
PowerShell是一种命令集,也有自己的语法定义及函数.本文主要介绍如何自定义powershell函数及如何调用,当初在写PowerShell自定义函数的时候查阅了很多资料都没找到如何调用自定义函 ...
- 利用PowerShell复制SQLServer账户的所有权限
问题 对于DBA或者其他运维人员来说授权一个账户的相同权限给另一个账户是一个很普通的任务.但是随着服务器.数据库.应用.使用人员地增加就变得很枯燥乏味又耗时费力的工作.那么有什么容易的办法来实现这个任 ...
- powershell脚本,命令行参数传值,并绑定变量的例子
这是小技巧文章,所以文章不长.但原创唯一,非常重要.我搜了下,还真没有人发 powershell怎样 [命令行 参数 绑定],所以我决定写成博客. 搜索关键字如下: powershell 命令行 参数 ...
- Powershell --在线学习
介绍和安装 自定义控制台 快速编辑模式和标准模式 快捷键 管道和重定向 Powershell交互式 数学运算 执行外部命令 命令集 别名 通过函数扩展别名 执行文件和脚本 Powershell变量 定 ...
- PowerShell 在线教程 4
PowerShell 在线教程 4 认识Powershell 介绍和安装 自定义控制台 快速编辑模式和标准模式 快捷键 管道和重定向 Powershell交互式 数学运算 执行外部命令 命令集 别 ...
随机推荐
- Spring Cloud Zuul 添加 ZuulFilter
紧接着上篇随笔Spring Cloud Zuul写,添加过滤器,进行权限验证 1.添加过滤器 package com.dzpykj.filter; import java.io.IOException ...
- 【NOIP2015提高组】运输计划
https://daniu.luogu.org/problem/show?pid=2680 使完成所有运输计划的时间最短,也就是使时间最长的运输计划耗时最短.最大值最小问题考虑用二分答案,每次chec ...
- 【NOIP2014提高组】解方程
https://www.luogu.org/problem/show?pid=2312 对于30%的数据,n<=2,暴力带入试解.对于50%的数据,ai很大,结合高精乘法和霍纳算法暴力代入试解. ...
- 使用.Net Core+EF7 CodeFirst(2)
上一篇的话,说了下怎么使用EF7 实现 CodeFirst去生成数据库, 其实还有好多问题的,这次一点一点的解决吧,都挺简单,不过零零散散的,, 1.读取配置文件,获得链接字符串 2.使用数据库进行增 ...
- Uva 12436 Rip Van Winkle's Code
Rip Van Winkle was fed up with everything except programming. One day he found a problem whichrequir ...
- Android官方技术文档翻译——Gradle 插件用户指南(5)
昨晚把第五章未译完的几句话攻克了.只是第六章没怎么译,明后天又是周末,假设周一前第六章翻译完的话,周一再发第六章. 本文译自Android官方技术文档<Gradle Plugin User Gu ...
- 【cogs 597】【dp】交错匹配
597. 交错匹配 ★☆ 输入文件:crossa.in 输出文件:crossa.out 简单对照 时间限制:1 s 内存限制:128 MB [问题描写叙述] 有两行自然数. UP[1..N] . DO ...
- Swiper单页网站简单案例(全屏网页)
<!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...
- mysql与服务器之间的编码问题
1.之前在练习一个java web的项目时,mysql的编码设置正确,服务器的编码也设置正确,但向mysql中存储数据时,就会出现乱码问题,后来发现是mysql与服务器之间的编码设置问题,以下是mys ...
- .net 图片无损压缩
命名空间: using System.Drawing.Imaging; using System.Drawing; using System.Drawing.Drawing2D; #region Ge ...