PowerShell的:使用参数验证没有引发异常(PowerShell : use paramete

2019-07-31 16:24发布

我想打电话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语法:

  • 帕拉姆定义必须(不包括注释)脚本中的第一行。 好了,不是我的问题

  • 在不正确的参数的情况下,我不能捕获错误(例如,以显示自定义错误消息)

我想,当脚本调用参数错误显示自定义错误消息。
是否有可能,以及如何捕捉异常的参数错误的情况下?

Answer 1:

那么好吧,这是不可能使用param和捕捉相关的异常。



Answer 2:

这些例子是功能(简单和高级),但同样的想法应该与脚本工作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


Answer 3:

一个可能的解决方法是换您的实际功能的另一个。 类似的事情私人/公共关系。 例:

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函数



Answer 4:

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
)


Answer 5:

你可以做到这一点与帕拉姆语法,如果你添加一个字符串型虚设参数与性能“ValueFromRemainingArguments”。 然后你就可以在你的脚本检查这个伪参数,并采取适当的行动,例如:

Param(
    [Parameter(Mandatory=$false)]
    [SWITCH]$myparam1,

    [Parameter(Mandatory=$false)]
    [SWITCH]$myparam2,

    [parameter(Mandatory=$false,ValueFromRemainingArguments=$true)]
    [STRING]$dummy     
    )

if ($dummy -eq anythingYouDontLike) throwAMessageOrSomething.


文章来源: PowerShell : use parameter validation without throwing exception