Powershell处理函数的参数 4


本文索引
[隐藏]

Powershell函数可以接受参数,并对参数进行处理。函数的参数有3个特性:

  1. 任意参数:内部变量$args 接受函数调用时接受的参数,$args是一个数组类型。
  2. 命名参数:函数的每一个参数可以分配一个名称,在调用时通过名称指定对应的参数。
  3. 预定义参数:函数在定义参数时可以指定默认值,如果调用时没有专门指定参数的值,就会保持默认值。

$args 万能参数

给一个函数定义参数最简单的是使用$args这个内置的参数。它可以识别任意个参数。尤其适用哪些参数可有可无的函数。

function sayHello
{
    if($args.Count -eq 0)
    {
        "No argument!"
    }
    else
    {
        $args | foreach {"Hello,$($_)"}
    }
}

无参数调用时:

PS C:Powershell> sayHello
No argument!

一个参数调用:

PS C:Powershell> sayHello LiLi
Hello,LiLi

多个参数调用时:

PS C:Powershell> sayHello LiLi Lucy Tom
Hello,LiLi
Hello,Lucy
Hello,Tom

因为$arg是一个数组,可以用它求和。

function Add
{
$sum=0
$args | foreach {$sum=$sum+$_}
$sum
}
Add 10 7 3 100
#120

设置参数名称

function StringContact($str1,$str2)
{
    return $str1+$str2
}

StringContact moss fly
StringContact -str1 word -str2 press
mossfly
wordpress

给参数定义默认值

function stringContact($str1="moss",$str2="fly")
{
    return $str1+$str2
}
stringContact Good Luck
stringContact

使用强类型参数

通过之前的例子发现将用户的参数传递给函数显得比较混乱。罪魁祸首就是Powershell的参数解释器,它可以自动处理和分配参数给函数。
函数的参数解释器比较傲慢,它对你提供的参数的信息完全不关心。它只会粗略地将参数进行分割,并且最大限度的进行自动类型转换。事实上,这种类型转换很多时候并不完美。所以最好提前能够对参数进行强类型限制。

限制数字类型

function subtract([int]$value1,[int]$value2)
{
    return $value1-$value2
}
subtract moss fly

上面的函数执行后,会抛出异常:
subtract : 无法处理对参数“value1”的参数转换。无法将值“moss”转换为类型“System.Int32”。错误:“输入字符串的格式不正确。”

因为subtract参数定义了强类型,参数的类型可能引起函数的处理结果。例如调用上面的函数
subtract 8.1 7.9
结果为0
但是如果将上面的函数的参数定义为Double型,

function subtract([double]$value1,[double]$value2)
{
    return $value1-$value2
}
subtract 8.1  7.9
#输出 0.199999999999999

限制日期类型

函数的参数解释器会自动尝试将字符串转换成日期类型,如果转换失败就是抛出异常。

function DayOfWeek([datetime]$date)
{
    return  $date.DayOfWeek
}
DayofWeek '1927-8-1'
#Monday
DayofWeek 2008-8-1
#Friday

DayOfWeek : 无法处理对参数“date”的参数转换。无法将值“someday”转换为类型“System.DateTime”。错误:“该字符串未被识别为有效的 DateTime。有一个从索引 0 处开始的未知字。”
DayofWeek someday

Switch 参数

Powershell函数最简单的参数类型为布尔类型,除了使用Bool类型,也可以使用Switch关键字。
下面的函数逆转字符串,但是可以通过$try 参数进行控制,如果没有指定$try的值,默认值为$false

function  tryReverse( [switch]$try , [string]$source )
{
    [string]$target=""
    if($try)
    {
        for( [int]$i = $source.length -1; $i -ge 0 ;$i--)
        {
            $target += $source[$i]
        }
        return $target
    }
    return $source
}
tryReverse -source www.mossfly.com
tryReverse -try $true -source www.mossfly.com

# www.mossfly.com
# moc.ylfssom.www
本文链接: http://www.pstips.net/powershell-passing-arguments-to-functions.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。


Leave a comment

电子邮件地址不会被公开。 必填项已用*标注

4 thoughts on “Powershell处理函数的参数

  • elale

    switch和bool参数定义的行为是不一样的,主要表现在不使用参数名称的调用上
    function TryAddOneBool([bool] $try, [int32] $n) { if ($try) {$n + 1} else {$n}}
    function TryAddOneSwitch([switch] $try, [int32] $n) { if ($try) {$n + 1} else {$n}}

    TryAddOneSwitch -try $TRUE -n 123 -> 124
    TryAddOneSwitch -try $TRUE 123 -> 2 TryAddOneBool -try $TRUE 123 -> 124
    TryAddOneSwitch $TRUE 123 -> 1 TryAddOneBool $TRUE 123 -> 124
    TryAddOneSwitch 2 123 -> 2 TryAddOneBool 2 123 -> 124

    switch侧重点在是否有-try上面,后面无需参数值,bool则和普通参数定义一样,0为假,非0为真