簡體   English   中英

ParameterSet在C#中的自定義PowerShell cmdlet中不起作用

[英]ParameterSet doesn't work in custom PowerShell cmdlet in C#

我有以下代碼,在其中嘗試使用C#為PowerShell創建自定義Cmdlet。

我要使用自定義cmdlet進行的操作是,用戶應使用兩個參數調用它,第一個參數應為-Text或-File或-Dir,第二個參數應為值,一個字符串,用於指定值用於文本,文件或目錄。

關鍵是,例如,如果我嘗試使用參數-Test調用我的cmdlet,這當然是一個錯誤的參數,那么我不會獲得默認語句的值,該語句為“ 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
    }
}

拉斯是正確的。 參數綁定程序是cmdlet外部的單獨過程。 如果語法不正確,則不會執行該cmdlet。

由於PowerShell沒有足夠的信息來“綁定”到參數,因此根本不調用ProcessRecord,而是給出錯誤。 因此,您永遠不會看到您的開關被執行。

無法使用指定的命名參數來解析參數集。 + CategoryInfo:InvalidArgument:(:) [],ParameterBindingException + FullyQualifiedErrorId:AmbiguousParameterSet,

您甚至都不想要。 讓PowerShell處理參數。 您可以通過執行以下操作來修復CmdLet:

  1. 刪除SwitchParameters的Position = 0。 具有位置SwitchParameters是不合邏輯的。 PowerShell可以在任何位置輕松檢測SwitchParameters
  2. 不要將SwitchParameters設為必選。 這是沒有用的。 開關是否存在,是或否。 強迫它在那里沒有意義。 就像強迫它是真實的一樣。
  3. 給您的CmdLet一個DefaultParameterSetName。 邏輯上是選擇定義的參數集之一,例如“文本”
  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

還可以考慮檢查SwitchParameters的值,而不要打開ParameterSetName。 SwithParameters可以像-File:$ false一樣被調用。 退回到默認值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM