13

データベースにレコードを書き込むコマンドレットを (PowerShell で) 作成しています。条件付きコマンド ラインでは、4 つの異なるパラメーター セットを定義する必要があるようです。

これを行うためのより適切な方法はありますか?

詳細

コマンドレットのパラメーターは次のとおりです。

  • ComputerName(接続先の SQL サーバー)
  • Path(データの場所)
  • Xml(生データ自体)
  • UserName
  • Password
  • UseIntegratedSecurity(ユーザー名/パスワードの代わりに、現在の資格情報を使用します)

PathXmlは相互に排他的であり、UserName/PasswordUseIntegratedSecurityは相互に排他的です。

これを正しく接続するには、次のように 4 つの異なるパラメーター セットを定義する必要があるようです。


function Install-WidgetData
{
    [CmdletBinding()]
    PARAM
    (
        [Parameter(ParameterSetName="Xml_AutoConnect", Mandatory=$True)]
        [Parameter(ParameterSetName="Xml_ManualConnect", Mandatory=$True)]
        [Parameter(ParameterSetName="Path_AutoConnect", Mandatory=$True, )]
        [Parameter(ParameterSetName="Path_ManualConnect", Mandatory=$True)]
        [ValidateNotNullOrEmpty()]
        [string[]] $ComputerName,

        [Parameter(ParameterSetName="Path_AutoConnect", Mandatory=$True)]
        [Parameter(ParameterSetName="Path_ManualConnect", Mandatory=$True)]
        [ValidateNotNullOrEmpty()]
        [string] $Path,

        [Parameter(ParameterSetName="Xml_AutoConnect", Mandatory=$True)]
        [Parameter(ParameterSetName="Xml_ManualConnect", Mandatory=$True)]
        [ValidateNotNullOrEmpty()]
        [string[]] $Xml,

        [Parameter(ParameterSetName="Xml_AutoConnect")]
        [Parameter(ParameterSetName="Path_AutoConnect")]
        [switch] $UseIntegratedSecurity,

        [Parameter(ParameterSetName="Xml_ManualConnect")]
        [Parameter(ParameterSetName="Path_ManualConnect")]
        [ValidateNotNullOrEmpty()]
        [string] $UserName,

        [Parameter(ParameterSetName="Xml_ManualConnect")]
        [Parameter(ParameterSetName="Path_ManualConnect")]
        [ValidateNotNullOrEmpty()]
        [string] $Password,
    )
4

4 に答える 4

14

パラメータ セットのサニティ チェックを迅速に行いたい場合は、次を使用できます。Show-Command

これにより、各パラメーター セットに 1 つずつ、複数のタブを持つフォームが表示されます。例えば:

表示コマンド Get-ChildItem

これを表示します:

ここに画像の説明を入力

または; コマンドラインの代替が必要な場合は、使用できますGet-Command -Syntax

Get-Command Get-ChildItem -Syntax

これを表示します:

Get-ChildItem [[-Path] ] [[-Filter] ] [-Include ] [-Exclude ] [-Recurse] [-Depth ] [-Force] [-Name] [-UseTransaction] [-Attributes ] [-Directory ] [-File] [-Hidden] [-ReadOnly] [-System] []

Get-ChildItem [[-Filter] ] -LiteralPath [-Include] [-Exclude] [-Recurse] [-Depth] [-Force] [-Name] [-UseTransaction] [-Attributes] [-Directory] ​​[-File ] [-Hidden] [-ReadOnly] [-System] []

于 2014-11-11T00:43:06.830 に答える
0

まあ、これが最も簡潔な方法です。switch/case または if/then トラップの恐ろしさよりも簡潔で、考えられるすべてのパラメータ セットを説明します!

ただし、他のオプションは、相互に排他的なパラメーターセットに対して異なるコマンドレスを記述することです。たとえば、

Install-WidgetDataFromPath
Install-WidgetDataFromXml

どちらもInstall-WidgetDataスクリプトコマンドレットを呼び出して、モジュール内に隠しておくか、スクリプトファイルのみを使用している場合はスコープ修飾子を使用してグローバルスコープから非表示にすることができます。内部コマンドレットは、両方 (またはそれ以上) のユーザー向けラッパーの共有コードを実装できます。あなたのコードから判断すると、これを実装する方法を説明する必要はないと思います。

于 2013-11-14T22:34:10.227 に答える