我想打电话PowerShell脚本是这样的:
script.ps1 -path mypath\to\files\ -days 6 -hours 0
为了验证命令行参数,我可以通过手工做,要么依靠param
语法:
Param (
[Parameter(Mandatory=$true )] [string] $path,
[Parameter(Mandatory=$false)] [int] $days,
[Parameter(Mandatory=$false)] [int] $hours
)
如果我使用param
语法:
我想,当脚本调用参数错误显示自定义错误消息。
是否有可能,以及如何捕捉异常的参数错误的情况下?
那么好吧,这是不可能使用param
和捕捉相关的异常。
这些例子是功能(简单和高级),但同样的想法应该与脚本工作param
还有:
# Simple function.
# Everything not declared in `param` goes to $args.
# If $args is not empty then there are "invalid" parameters or "unexpected" arguments
function test {
param (
[string]$path,
[int]$days,
[int]$hours
)
# check $args and throw an error (in here we just write a warning)
if ($args) { Write-Warning "Unknown arguments: $args" }
}
要么
# Advanced function.
# For an advanced function we can use an extra argument $args
# with an attribute `[Parameter(ValueFromRemainingArguments=$true)]`
function test {
param (
[Parameter(Mandatory=$true )] [string] $path,
[Parameter(Mandatory=$false)] [int] $days,
[Parameter(Mandatory=$false)] [int] $hours,
[Parameter(ValueFromRemainingArguments=$true)] $args
)
# check $args and throw an error (in this test we just write a warning)
if ($args) { Write-Warning "Unknown arguments: $args" }
}
下面的测试:
# invalid parameter
test -path p -invalid -days 5
# too many arguments
test -path p 5 5 extra
在这两种情况下产生相同的输出:
WARNING: Unknown arguments: -invalid
WARNING: Unknown arguments: extra
一个可能的解决方法是换您的实际功能的另一个。 类似的事情私人/公共关系。 例:
function Example-Private
{
[CmdletBinding()]
Param
(
[ValidateNotNullOrEmpty()]
[string]$Arg1,
[ValidateNotNullOrEmpty()]
[string]$Arg2
)
# Do what you need
}
function Example-Public
{
[CmdletBinding()]
Param
(
[string]$Arg1,
[string]$Arg2
)
try
{
Example-Private $Arg1 $Arg2
}
catch
{
# Display a user-friendly message, save exception into a log file, etc.
}
}
如果你是一个模块上工作,你可以在这里看看如何导出公共职能和隐藏私人的: 出口PowerShell函数
在Begin
块,你总是可以做进一步的验证的参数,但如果参数是错误的,我想你不会想继续执行。 也就是说,你想抛出终止错误。 下面是一个例子:
param (
[Parameter(Mandatory=$true )] [string] $path,
[Parameter(Mandatory=$false)] [int] $days,
[Parameter(Mandatory=$false)] [int] $hours
)
Begin {
if ($hours -lt 0 -or $hours -gt 23) {
throw "Hours parameter must be between 0 and 23"
}
}
这就是说,我不知道这是比任何使用PowerShell的内置参数验证功能如更好:
param (
[Parameter(Mandatory=$true )] [string] $path,
[Parameter(Mandatory=$false)] [int] $days,
[Parameter(Mandatory=$false)]
[ValidateRange(0,23)]
[int]
$hours
)
你可以做到这一点与帕拉姆语法,如果你添加一个字符串型虚设参数与性能“ValueFromRemainingArguments”。 然后你就可以在你的脚本检查这个伪参数,并采取适当的行动,例如:
Param(
[Parameter(Mandatory=$false)]
[SWITCH]$myparam1,
[Parameter(Mandatory=$false)]
[SWITCH]$myparam2,
[parameter(Mandatory=$false,ValueFromRemainingArguments=$true)]
[STRING]$dummy
)
if ($dummy -eq anythingYouDontLike) throwAMessageOrSomething.