我正在使用C#编写二进制Powershell模块,并希望拥有一个Cmdlet参数,提供动态的、运行时的选项卡自动完成。然而,我很难弄清楚如何在二进制模块中实现这一点。以下是我尝试使其工作的方法:
这不起作用。我没有任何选项完成功能。我还收到一个错误:
我找到了一个文章,其中有一个非二进制Powershell模块的示例。在非二进制模块中,您需要包括
以此速度推断,二进制模块在Powershell世界中似乎是二等公民。肯定有我错过的方法来解决这个问题吧?
using System;
using System.Collections.ObjectModel;
using System.Management.Automation;
namespace DynamicParameterCmdlet
{
[Cmdlet("Say", "Hello")]
public class MyCmdlet : PSCmdlet
{
[Parameter, PSTypeName("string")]
public RuntimeDefinedParameter Name { get; set; }
public MyCmdlet() : base() {
Collection<Attribute> attributes = new Collection<Attribute>() {
new ParameterAttribute()
};
string[] allowedNames = NameProvider.GetAllowedNames();
attributes.Add(new ValidateSetAttribute(allowedNames));
Name = new RuntimeDefinedParameter("Name", typeof(string), attributes);
}
protected override void ProcessRecord()
{
string name = (string)Name.Value;
WriteObject($"Hello, {Name}");
}
}
public static class NameProvider
{
public static string[] GetAllowedNames()
{
// Hard-coded array here for simplicity but imagine in reality this
// would vary at run-time
return new string[] { "Alice", "Bob", "Charlie" };
}
}
}
这不起作用。我没有任何选项完成功能。我还收到一个错误:
PS > Say-Hello -Name Alice
Say-Hello : Cannot bind parameter 'Name'. Cannot convert the "Alice" value of type "System.String" to type "System.Management.Automation.RuntimeDefinedParameter".
At line:1 char:17
+ Say-Hello -Name Alice
+ ~~~~~
+ CategoryInfo : InvalidArgument: (:) [Say-Hello], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgumentNoMessage,DynamicParameterCmdlet.MyCmdlet
我找到了一个文章,其中有一个非二进制Powershell模块的示例。在非二进制模块中,您需要包括
DynamicParam
,然后是构建并返回RuntimeParameterDictionary
对象的语句。基于这个示例,我期望在PSCmdlet
类中有相应的方法,可能是可重写的GetDynamicParameters()
方法或类似的东西,就像有一个可重写的BeginProcessing()
方法一样。以此速度推断,二进制模块在Powershell世界中似乎是二等公民。肯定有我错过的方法来解决这个问题吧?