本文目录
Powershell函数可以接受参数,并对参数进行处理。函数的参数有3个特性:
- 任意参数:内部变量$args 接受函数调用时接受的参数,$args是一个数组类型。
- 命名参数:函数的每一个参数可以分配一个名称,在调用时通过名称指定对应的参数。
- 预定义参数:函数在定义参数时可以指定默认值,如果调用时没有专门指定参数的值,就会保持默认值。
$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
本文链接: https://www.pstips.net/powershell-passing-arguments-to-functions.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
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为真
请问 switch 参数怎么制定默认值?
没有默认值,指定以后就是true,不指定就是false。