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

转载于:https://www.cnblogs.com/zengsong-restService/archive/2012/12/19/2825263.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值