【发布时间】:2013-05-07 05:02:08
【问题描述】:
我有以下代码,我尝试使用 C# 为 PowerShell 创建自定义 Cmdlet。
我想用我的自定义 cmdlet 做的是,用户应该使用两个参数调用它,第一个参数应该是 -Text 或 -File 或 -Dir,下一个应该是一个值,一个字符串指定文本、文件或目录的值。
关键是,如果我尝试使用参数 -Test 调用我的 cmdlet,例如,这当然是一个错误的参数,我不会得到默认语句的值,即 "Bad parameter名字”。
我猜我的代码直到开关的默认部分才得到。
顺便说一下,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
}
}
【问题讨论】:
-
它是否达到了 ProcessRecord?如果是这样,您确定没有任何来自交换机的案例被执行吗?因为你让它听起来 C# 编译器坏了。我非常怀疑这是问题所在。 PS:如何通过定义默认参数集来更轻松地使用 CmdLet? [Cmdlet(VerbsCommon.Get, "SHA256", DefaultParameterSetName = "Text")]
标签: c# powershell parameters switch-statement powershell-cmdlet