簡體   English   中英

PowerShell:使用參數驗證而不拋出異常

[英]PowerShell : use parameter validation without throwing exception

我想以這種方式調用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 AND來捕獲相關的異常。

這些示例適用於函數(簡單和高級),但同樣的想法也適用於帶有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.
    }
}

如果您正在處理模塊,可以在這里查看如何導出公共函數並隱藏私有函數Export Powershell Functions

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”添加字符串類型的dummy-parameter,則可以使用param語法執行此操作。 然后,您可以在腳本中檢查此偽參數並采取適當的操作,例如:

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

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

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

if ($dummy -eq anythingYouDontLike) throwAMessageOrSomething.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM