4

我想以这种方式调用 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语法:

  • 参数定义必须是脚本的第一行(不包括注释)。好的,对我来说不是问题

  • 如果参数不正确,我无法捕捉到错误(例如显示自定义错误消息)

     

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

4

5 回答 5

3

好吧,不可能使用paramAND 来捕获相关异常。

于 2012-11-03T14:04:01.460 回答
1

这些示例适用于函数(简单和高级),但同样的想法也适用于脚本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
于 2012-11-03T15:37:05.163 回答
1

一种可能的解决方法是将您的实际功能包装在另一个中。类似于私人/公共关系的东西。例子:

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

于 2016-07-12T21:04:29.597 回答
-1

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
)
于 2012-09-18T17:36:33.923 回答
-1

如果您添加具有属性“ValueFromRemainingArguments”的字符串类型的虚拟参数,您可以使用参数语法来做到这一点。然后您可以在脚本中检查此虚拟参数并采取适当的措施,例如:

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

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

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

if ($dummy -eq anythingYouDontLike) throwAMessageOrSomething.
于 2015-12-15T13:35:34.447 回答