Powershell指定函数的返回值

一个或多个返回值

Powershell不像它编程语言,它的函数可以有多个返回值。如果你直接调用函数,返回值会在控制台输出。当然你也可以将结果存储在一个变量中进一步处理。
下面的例子演示返回一个值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function Square( [double] $num )
{
     return $num * $num
}
#在控制台输出结果
Square 9.87
#97.4169
 
#将结果赋值给变量
$value =Square 9.87
$value
#97.4169
 
#返回值为Double类型
$value .GetType().FullName
#System.Double

下面的例子演示返回多个值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
function gbMeasure( $amount )
{
     "$amount GB=$($amount) GB"
     "$amount GB=$($amount*1gb/1mb) MB"
     "$amount GB=$($amount*1gb/1kb) KB"
     "$amount GB=$($amount*1gb) B"
}
 
#函数返回4个值
gbMeasure 1
# 1 GB=1 GB
# 1 GB=1024 MB
# 1 GB=1048576 KB
# 1 GB=1073741824 B
 
#将所有的返回值存储在一个变量中
$result =gbMeasure 1
$result
 
# 1 GB=1 GB
# 1 GB=1024 MB
# 1 GB=1048576 KB
# 1 GB=1073741824 B
 
#所有的返回值会自动存储在一个数组中
$result =gbMeasure 1
$result .GetType().Name
 
# Object[]
 
#通过索引访问每个返回值
$result =gbMeasure 1
$result [3]
# 1 GB=1073741824 B

总结一下,如果一个函数返回一个值,像其它编程语言一样,这个值包括她的类型信息会直接返回。但是如果遇到多个返回值,Powershell会将所有的返回值自动构造成一个Object数组。可以通过索引访问数组。

Return语句

Powershell会将函数中所有的输出作为返回值,但是也可以通过return语句指定具体的我返回值。
Return 语句会将指定的值返回,同时也会中断函数的执行,return后面的语句会被忽略。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function test( $num )
{
     1
     9
     return 10
     4
     6
}
test
# 1 和 9 作为输出会返回
# return语句中的10 也会返回
# return 语句后的4和6会被忽略
 
#1
#9
#10
访问返回值

一个函数返回了一个值还是多个值,是可以验证的。下面的例子会产生随机数,如果没有指定个数,默认会返回一个随机数,否则会返回指定个数的随机数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Function lottery( [int] $number =1)
{
$rand = New-Object system.random
For ( $i =1; $i -le $number ; $i ++) {
$rand .next(1,50)
}
}
# 参数为空时,返回值不是数组:
$result = lottery
$result -is [array]
# False
# 如果指定多个随机数是,返回值是数组类型:
$result = lottery 10
$result -is [array]
# True
从函数的返回值中消除输出

函数默认会将函数中的所有输出作为函数的返回值返回,这样很方便。但有时可能会将不必要的输出误以为返回值。写脚本程序时,可能需要自定义一些函数,这个函数可能只需要一个返回值,但是为了提高函数的可读性,可能会在函数增加一些注释输出行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Function Test()
{
     "Try to calculate."
     "3.1415926"
     "Done."
}
 
#保存在变量中输出,
$value =Test
$value
# Try to calculate.
# 3.1415926
# Done.
 
#如果要过滤注释,只输出,不作为返回值,
#可以使用Write-Host命令
Function Test()
{
     Write-Host "Try to calculate."
     "3.1415926"
     Write-Host "Done."
}
# 在变量值中保存返回值,在控制台输出注释行
$value =Test
# Try to calculate.
# Done.
 
# 测试返回值
$value
# 3.1415926
使用调试信息报告

可能输出这些函数中临时提示信息,给函数的返回值造成干扰。要解决这个问题,除了上述的Write-Host,也可以使用Write-Debug命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Function Test()
{
     Write-Debug "Try to calculate."
     "3.1415926"
     Write-Debug "Done."
}
# Debug调试信息只会在调试模式下被输出
$value =Test
# 3.1415926
 
#如果你想通过显示调试信息调试函数,可以开启调试模式
$DebugPreference = "Continue"
$value =Test
# 调试: Try to calculate.
# 调试: Done.
 
# 测试返回值
$value
# 3.1415926
 
#如果关闭调试模式,这些调试信息自然不会输出
$DebugPreference = "SilentlyContinue"
$value =Test

使用Write-Debug有两个优势,首先调试信息会自动高亮显示,便于分析。其次,这些调试信息只会在调试模式开启时输出,控制起来更加方便。当然最重要的是这些临时信息无论什么时候也不会混淆在返回值。

抑制错误信息

函数中的错误信息,也有可能作为返回值的一部分,因为默认这些错误信息会直接输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Function ErrorTest()
{
     #该进程不存在
     Stop-Process -Name "www.mossfly.com"
}
ErrorTest
 
Stop-Process : 找不到名为“www.mossfly.com”的进程。请验证该进程名称,然后再次调用 cmdlet。
所在位置 C:UsersbaozhenDesktoptest.ps1:6 字符: 17
+     Stop-Process <<<<  -Name "www.mossfly.com"
     + CategoryInfo          : ObjectNotFound: (www.mossfly.com:String) [ Stop-P
    rocess], ProcessCommandException
     + FullyQualifiedErrorId : NoProcessFoundForGivenName,Microsoft.PowerShell.
    Commands.StopProcessCommand
 
  很明显,类似这样的错误提示信息,对调试程序很重要,但如果你觉得它不重要,特意要隐藏,可以使用 $ErrorActionPreference 进行设置。
 
  Function ErrorTest()
{
     #从这里开始隐藏所有的错误信息
     $ErrorActionPreference = "SilentlyContinue"
     Stop-Process -Name "www.mossfly.com"
     #该进程不存在
}
 
#错误信息不会输出
ErrorTest

但是上面的做法并不明智,因为这样可能错过其它错误提示。所以最好的方式是处理完后,对$ErrorActionPreference进行复位。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Function ErrorTest()
{
     #从这里开始隐藏所有的错误信息
     $ErrorActionPreference = "SilentlyContinue"
     Stop-Process -Name "www.mossfly.com"
     #该进程不存在
 
     #恢复$ErrorActionPreference,错误开始输出
     $ErrorActionPreference = "Continue"
 
     2/0
}
ErrorTest
试图除以零。
 
所在位置 行:9 字符: 7
+ 2/ <<<< 0
+ CategoryInfo          : NotSpecified: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : RuntimeException
### PowerShell 函数概述 PowerShell 函数是一组可重复使用的命令,用于执行特定的任务。函数可以使脚本更加模块化和易于维护。定义函数时可以包含参数、逻辑处理以及返回值。 #### 定义简单函数 创建一个简单的函数只需要使用 `function` 关键字加上函数名即可: ```powershell function Say-Hi { param ( [string]$Name ) "Hello $Name" } ``` 此代码片段展示了如何声明带有单个字符串类型参数 `$Name` 的函数,并打印问候语句[^3]。 #### 返回值PowerShell中,可以通过两种方式让函数具有返回值:一是利用自动输出机制;二是显式地使用 `return` 语句。当不使用 `return` 时,默认会把最后一条表达式的计算结果作为整个函数的结果传出。 下面的例子演示了这两种情况下的不同行为: ```powershell # 自动输出 function Get-SumAutoOutput { param( [int]$a, [int]$b ) $sum = $a + $b } # 显式Return function Get-SumWithReturn { param( [int]$a, [int]$b ) return ($a + $b) } ``` 上述两个版本都会得到相同的效果——求两数之和并将其传回给调用者。但是采用 `return` 可以使意图更为清晰明了。 #### 参数验证与默认值设置 为了增强健壮性和用户体验,可以在定义阶段加入对输入数据类型的限定及提供缺省选项: ```powershell function Test-ParameterValidation { param( [ValidateNotNullOrEmpty()] [string]$InputString="Default Value", [ValidateRange(0,10)] [int]$Number=5 ) "$InputString and number is $Number." } ``` 这段代码设置了对于字符串型参数不能为空的要求(`ValidateNotNullOrEmpty`),同时也限定了整数范围必须介于0到10之间(`ValidateRange`). 如果未给出具体数值,则分别取预设好的初始状态["Default Value", 5][^2].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值