函数用法
与其他语言一样,powershell也存在自己的函数,这节主要介绍一些函数的用法。
1、定义一个函数
function add #add是函数名
{
param( #函数内部包含的变量,[int]表示定义的变量只能是整型
[int]$a,
[int]$b
)
echo "$a + $b" #函数体,具体执行的代码
}
PS C:\> add 2 3 #调用函数,2 3 是传入add函数的两个变量,若传入的变量不是整型会报错
2 + 3
PS C:\> add 2
2 + 0
PS C:\> add #整型变量不足两个变量默认是0,字符型变量默认是“”
0 + 0
PS C:\> add 1 2 3
1 + 21
【补充】
为powershell脚本设置参数变量
编写一个a.ps1的脚本,内容如下
为脚本传入参数,命令行可以识别到ps1脚本中的参数名。
【补充】使用另一个脚本中定义的函数
若a.ps1脚本中定义了两个函数
在其他脚本中调用a.ps1脚本中的函数:
. "脚本路径" #调用方法
2、函数的返回值
powershell中的函数可以有多个返回值,并且可以不用return返回,每一条输出都是一个返回值。但是一旦使用return后续的代码将不会执行。
function duo { $a=1 $b=2 echo $a echo $b echo "123" return "xyz" }
函数duo中,可以看出,输出了3个值,并使用return返回了一个值,此时该函数将会有4个返回值,以数组形式返回,在调用时可以:
$a,$b,$c,$d = duo
若要取出特定的某个值,可以:
$a = duo echo $a[2]
当函数只有一个返回值时,返回的是一个值,若有多个返回值时,返回一个数组。
function a([int] $x)
{
"$x"
"$x + $x"
"$x * $x"
}
PS C:\> $b = a 2
PS C:\> $b
2
2 + 2
2 * 2
PS C:\> $b[1]
2 + 2
PS C:\> $b -is [array]
True
3、限定传入参数个数
函数中传入的参数可以提前设定好值,这个方法是ValidateSet,可以理解成枚举。
function meiju
{
param(
[ValidateSet('a','b','c')] #设定$n的取值范围是“a”,“b”,“c”其中之一
$n
)
echo "$n"
}
PS C:\> meiju b #传入的值是“abc”其中之一
b
若传入abc以外的值会报错:
4、限定传入参数的个数
powershell的函数中给出了一个限定传入参数个数的方法,ValidateCount,可以设定传入值得个数。
function num
{
param(
[ValidateCount(1,3)] #限定允许传入的值是1-3个,不符合要求报错
[string[]] #声名$a是一个字符串数组
$a
)
echo $a
}
PS C:\> num 1,2,3 #num函数接收一个数组,数组的长度是3
1
2
3
若数组的长度大于3,则报错
5、万能变量
一般的,我们在设定变量时候会提前声名变量的类型,字符型、整型、日期型......,若不声明可以接受整型也可以接受字符型,但是如果我们不知道有多少个变量要传入可以用$args,它是一个万能的变量,不限传入的个数,也不限定类型,也可以省略定义。
function all
{
foreach($i in $args)
{
echo $i
}
}
PS C:\> all 1
1
PS C:\> all 'abc'
abc
PS C:\> all 'abc' 123 '1q2w' 4.12p
abc
123
1q2w
4.12p
6、隐藏输入的密码
在Parameter这个限制语句之前加了一句“[System.Security.SecureString]”,这个修饰语句用于将输入参数设置为安全字符串类型,这样输入这个参数的值时,就会变成星号了
function secret
{
param(
[System.Security.SecureString]
[parameter(mandatory=$true)]
$passwd
)
$mima = (New-Object System.Management.Automation.PSCredential("ticp",$passwd)).GetNetworkCredential().Password
echo $mima
}
7、函数的开关
我们在使用ping命令时候,通常会用到一个-t的参数,这个参数的作用是一直ping,若不跟这个参数只ping4次,作用相当于开关。下面的小例子就实现了刚才的功能
function p
{
param(
[switch] #开关参数
$t
)
if($t)
{
echo "......"
}
else
{
echo "4"
}
}