0

C# を使用して PowerShell 用のカスタム コマンドレットを作成しようとする次のコードがあります。

カスタム コマンドレットでやりたいことは、ユーザーが 2 つのパラメーターを使用して呼び出す必要があることです。最初のパラメーターは -Text または -File または -Dir で、次のパラメーターは値、値を指定する文字列である必要があります。テキスト、ファイル、またはディレクトリ。

ポイントは、たとえばパラメーター -Test を使用してコマンドレットを呼び出そうとすると、これはもちろん間違ったパラメーターであり、 "Bad parameter name"という既定のステートメントの値を取得できないことです。

私のコードは、スイッチのデフォルト部分まで取得できないと思います。

ちなみに、SHA256Text、SHA256File、SHA256Directory は、私が書いたカスタム ヘルパー メソッドなので、気にする必要はありません。

using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;
using System.Management.Automation;

namespace PSSL
{
    [Cmdlet(VerbsCommon.Get, "SHA256")]
    public class GetSHA256 : PSCmdlet
    {
        #region Members

        private bool text;
        private bool file;
        private bool directory;
        private string argument;

        #endregion

        #region Parameters

        [Parameter(Mandatory = true, Position = 0, ParameterSetName = "Text")]
        public SwitchParameter Text
        {
            get { return text; }
            set { text = value; }
        }

        [Parameter(Mandatory = true, Position = 0, ParameterSetName = "File")]
        public SwitchParameter File
        {
            get { return file; }
            set { file = value; }
        }

        [Parameter(Mandatory = true, Position = 0, ParameterSetName = "Directory")]
        public SwitchParameter Dir
        {
            get { return directory; }
            set { directory = value; }
        }

        [Parameter(Mandatory = true, Position = 1)]
        [ValidateNotNullOrEmpty]
        public string Argument
        {
            get { return argument; }
            set { argument = value; }
        }

        #endregion

        #region Override Methods

        protected override void ProcessRecord()
        {
            switch(ParameterSetName)
            {
                case "Text":
                    SHA256Text(argument);
                    break;

                case "File":
                    SHA256File(argument);
                    break;

                case "Directory":
                    SHA256Directory(argument);
                    break;

                default:
                    throw new ArgumentException("Error: Bad parameter name.");
            }
        }

        #endregion
    }
}
4

2 に答える 2

2

ラースは正しいです。パラメーター バインダーは、コマンドレットの外部にある別のプロシージャです。構文が正しくない場合、コマンドレットは実行されません。

于 2013-05-05T22:24:11.120 に答える
2

PowerShell にはパラメーターに「バインド」するための十分な情報がないため、ProcessRecord はまったく呼び出されず、代わりにエラーが発生します。したがって、スイッチが実行されることはありません。

指定された名前付きパラメーターを使用してパラメーター セットを解決できません。+ CategoryInfo : InvalidArgument: (:) []、ParameterBindingException + FullyQualifiedErrorId : AmbiguousParameterSet、

あなたもしたくないはずです。PowerShell にパラメーターを処理させます。次の手順を実行して、コマンドレットを修正できます。

  1. SwitchParameters の Position = 0 を削除します。位置的な SwitchParameters を持つことは論理的ではありません。PowerShell は、どの位置でも簡単に SwitchParameters を検出できます
  2. SwitchParameters を必須にしないでください。それは役に立たない。スイッチがあるかどうか、true または false のいずれかです。そこにそれを強制することは意味がありません。それは、それが真実であるように強制するようなものです。
  3. CmdLet に DefaultParameterSetName を指定します。論理的には、「テキスト」などの定義済みパラメーター セットの 1 つを選択することです。
  4. Argument パラメータを Position = 0 にします。SwitchParameters は位置を必要としないため、これが最初です。

これで、次のように呼び出すことができます。

Get-SHA256 'SomeText'
Get-SHA256 'SomeText' -Text
Get-SHA256 -Text 'SomeText'
Get-SHA256 'C:\Some.File' -File
Get-SHA256 -File 'C:\Some.File'
etc

また、ParameterSetName をオンにする代わりに、SwitchParameters の値を確認することも検討してください。SwithParameters は -File:$false のように呼び出すことができます。デフォルトに戻ります。

于 2013-05-06T21:02:08.467 に答える