文辉居士

Powershell 给脚本传递参数

怎样将一个脚本稍作润色,让它能够根据用户的输入,处理并输出相应的结果,而不是只产生一成不变的输出。怎样将参数传递给脚本,这是本篇讨论的内容。

$args返回所有的参数

传递给一个函数或者一个脚本的参数都保存在$args变量中。可以先打开记事本,输入脚本:

Write-Host "Hello,$args"

保存后,通过控制台执行脚本:

PS E:\> notepad myscript.ps1  PS E:\> .\MyScript.ps1  Hello,  PS E:\> .\MyScript.ps1 "Mosser Lee"  Hello,Mosser Lee


$args数组参数

默认情况下,传递给一个Powershell脚本的参数类型为数组,例如:

PS E:\> .\MyScript.ps1 My Website      Is        www.mossfly.com  Hello,My Website Is www.mossfly.com
上面的文本中包含多个连续的空格,可是当脚本把参数输出时却不存在连续的空格了。那是因为脚本会把文本根据白空格截断并转换成数组。如果不想文本被当成数组那就把它放在引号中。
PS E:\> .\MyScript.ps1 "My Website      Is        www.mossfly.com"  Hello,My Website      Is        www.mossfly.com
在$args中逐个访问参数
因为$args是一个数组,自然可以通过索引访问数组的每一个元素。可以将MyScript.sp1的内容改为:
 


For($i=0;$i-lt$args.Count; $i++)
{

Write-Host "parameter $i : $($args[$i])"

}

然后在控制台测试:
PS E:\> .\MyScript.ps1 www moss fly com  parameter 0 : www  parameter 1 : moss  parameter 2 : fly  parameter 3 : com


在脚本中使用参数名

通过Powershell传递参数固然方便,但是如果用户不知道参数的传递顺序,也是很郁闷的,例如在Myscript.ps1中输入:
$args[0]-$args[1]
执行脚本发现参数的顺序不同,结果也不同:

PS E:\> Get-Content .\MyScript.ps1  $args[0]-$args[1]  PS E:\> .\MyScript.ps1 10 8  2  PS E:\> .\MyScript.ps1 8 10  -2
所以最好的方式给参数指定名称,输入以下的脚本:
param($Directory,$FileName)
"Directory= $Directory"
"FileName=$FileName"

其中param给参数指定名称。

执行脚本:

PS E:\> .\MyScript.ps1 -Directory $env:windir -FileName config.xml  Directory= C:\windows  FileName=config.xml  PS E:\> .\MyScript.ps1 -FileName config.xml -Directory $env:windir  Directory= C:\windows  FileName=config.xml


验证参数

给脚本的参数绑定数据类型,绑定帮助信息。一旦脚本缺少参数,或者输入的参数类型不正确,就提醒用户:
输入脚本:

param(

[string] $Name = $(throw "Parameter missing: -name Name") ,
[int] $Age = $(throw "Parameter missing: -age x as number")
)
"Name= $Name"
"Age=$Age"

执行脚本:

PS E:\> .\MyScript.ps1  Parameter missing: -name Name  所在位置 E:\MyScript.ps1:2 字符: 22  + [string]$Name=$(throw < <<<  "Parameter missing: -name Name") ,     + CategoryInfo          : OperationStopped: (Parameter missing: -name Name:String) [], Runtime    Exception     + FullyQualifiedErrorId : Parameter missing: -name Name PS E:\> .\MyScript.ps1 -Name mosser  Parameter missing: -age x as number  所在位置 E:\MyScript.ps1:3 字符: 18  + [int]$Age=$(throw < <<<  "Parameter missing: -age x as number")     + CategoryInfo          : OperationStopped: (Parameter missing: -age x as number:String) [], R    untimeException     + FullyQualifiedErrorId : Parameter missing: -age x as number PS E:\> .\MyScript.ps1 -Name mosser -Age abc  E:\MyScript.ps1 : 无法处理对参数“Age”的参数转换。无法将值“abc”转换为类型“System.Int32”。错误:  “输入字符串的格式不正确。”  所在位置 行:1 字符: 33  + .\MyScript.ps1 -Name mosser -Age < <<<  abc     + CategoryInfo          : InvalidData: (:) [MyScript.ps1], ParameterBindin...mationException     + FullyQualifiedErrorId : ParameterArgumentTransformationError,MyScript.ps1 PS E:\> .\MyScript.ps1 -Name mosser -Age 100  Name= mosser  Age=100


变量的作用域

Powershell默认使用全局作用域global: ,但是在函数和脚本中分别使用函数作用域function:和脚本作用域script: 。
一旦脚本执行结束,存在于脚本作用域的变量也会消失。但是有一点,如果一个变量在脚本外定义,在脚本内没有定义,在脚本内使用时会把外面的变量引渡过来。

在脚本中输入:

 


1

$temp

 

执行脚本:

PS E:\> .\MyScript.ps1  PS E:\> $temp="mosser lee"  PS E:\> .\MyScript.ps1  mosser lee

在脚本中尝试改变变量$temp,但是脚本内的变量不会影响脚本外的变量,输入脚本:

  $temp = "www.mossfly.com"
$temp

执行脚本:

PS E:\> .\MyScript.ps1  www.mossfly.com  PS E:\> $temp  mosser lee

posted on 2012-12-19 17:22  restService  阅读(521)  评论(0编辑  收藏  举报

导航


我是有底线的赠送场