0

ボトムラインアップフロント

例外をコマンドラインに伝播せずに、PowerShell(v1)コマンドラインパラメーターを検証する方法を探しています。

詳細

現在、コマンドラインパラメータを検証するためparamにと組み合わせて使用​​するPowerShellスクリプトがあります。[ValidateNotNullOrEmpty]

param(
   [string]
   [ValidateNotNullOrEmpty()]$domain = $(throw "Domain (-d) param required.")
)

例外をコマンドラインに戻さずに、カスタムエラーメッセージを提供するというエラー処理のパラダイムを変更しています。paramブロックはtrycatchブロックでラップできないため、次のようなものに頼りました

param(
   [string]$domain = $("")
)
Try{
   if($domain -like $("")){
      throw "Domain (-d) param required."
    }
...

}Catch{
#output error message 
}

私の懸念は、を使用して利用できる組み込みの検証をすべてバイパスしていることですparam。私の新しいテクニックは合理的な解決策ですか?スクリプト内に例外をカプセル化しながら、コマンドラインパラメータを検証するためのより良い方法はありますか?PowerShellの専門家がこの状況をどのように処理するかを確認することに非常に興味があります。

何かアドバイスをいただければ幸いです。

4

3 に答える 3

2

カスタム検証スクリプトを作成できます。このパラメータを試してみてください。

Param(
    [ValidateScript({
        If ($_ -eq $Null -or $_ -eq "") {
            Throw "Domain (-d) param required."
        }
        Else {
            $True
        }
    })][string]$Domain
)
于 2014-04-25T13:33:24.443 に答える
1

1つの方法は、このように使用することdefault parametersです[ msdnから] -

Function CheckIfKeyExists 
{ 
    Param( 
        [Parameter(Mandatory=$false,ValueFromPipeline=$true)] 
        [String] 
        $Key = 'HKLM:\Software\DoesNotExist' 
    ) 
    Process 
    { 
        Try 
        { 
            Get-ItemProperty -Path $Key -EA 'Stop' 
        } 
        Catch 
        { 
            write-warning "Error accessing $Key $($_.Exception.Message)"   
        } 
    } 
}

したがって、ここで、パラメーターを渡さずに関数を呼び出そうとすると、try/catchブロックで定義した内容が警告されます。また、そのためのデフォルトの検証属性は使用していません。エラーが発生することを常に想定し、エラーを乗り切ることができるコードを作成する必要があります。しかし、ここでの教訓はif you implement a default value, remember that it is not being validated.

詳細はこちら

于 2012-06-13T20:41:58.747 に答える
1

コメントで述べたように、私はあなたの説明を読むほど、「すべての組み込みの検証をバイパスする」ことを心配するべきではないという結論に達します。なんで?それがまさにあなたの目標だからです。デフォルトの動作をバイパスしたいので、それが必要であり、実行しなければならない場合は、単に実行するだけではありません。;)

于 2012-06-25T21:51:09.227 に答える