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

时间:2013-05-05 10:51:13

标签: c# powershell parameters switch-statement cmdlets

我有以下代码,我尝试使用C#为PowerShell创建自定义Cmdlet。

我想用自定义cmdlet做的是,用户应该使用两个参数调用它,第一个应该是-Text或-File或-Dir,下一个应该是一个值,一个字符串,指定文本,文件或目录的值。

关键是,如果我尝试使用参数-Test调用我的cmdlet,这当然是一个错误的参数,我没有得到默认语句的值,它表示“错误的参数名称“即可。

我想我的代码直到交换机的默认部分才开始。

顺便说一下,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
    }
}

2 个答案:

答案 0 :(得分:2)

Lars是对的。参数绑定器是cmdlet外部的单独过程。如果语法不正确,则甚至不执行cmdlet。

答案 1 :(得分:2)

由于PowerShell没有足够的信息来“绑定”参数,因此根本不会调用ProcessRecord,而是会出错。所以你永远不会看到你的开关被执行。

  

无法使用指定的命名参数解析参数集。       + CategoryInfo:InvalidArgument:(:) [],ParameterBindingException       + FullyQualifiedErrorId:AmbiguousParameterSet,

你甚至不应该这样做。让PowerShell处理参数。您可以通过执行以下操作来修复CmdLet:

  1. 删除SwitchParameters的Position = 0。这不符合逻辑 有位置SwitchParameters。 PowerShell可以轻松地在任何位置检测SwitchParameters
  2. 不要强制使用SwitchParameters。没用。开关是否存在,是真还是假。强迫它在那里是没有意义的。这就像强迫它成真一样。
  3. 为您的CmdLet提供DefaultParameterSetName。逻辑是选择一个已定义的参数集,如“Text”
  4. 使你的Argument参数位置= 0.由于SwitchParameters不需要位置,这是第一个。
  5. 现在你可以这样称呼它:

    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。退回到默认设置。