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

AND を使用paramして関連する例外をキャッチすることはできません。

于 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 構文でそれを行うことができます。次に、スクリプトでこのダミー パラメータを確認し、適切なアクションを実行できます。たとえば、次のようになります。

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 に答える