[英]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.