所以我有一个用c#编写的cmd:Get-LivingCharacter
。我希望用户像Get-LivingCharacter -Name "Bran"
一样使用它,但我想允许更改可用字符列表。也许今天,"布兰"是Get-LivingCharacter
传递的有效名称,但未来可能不会。事情发生了。
为方便起见,我想允许此字段的制表符完成。但是,我似乎无法将其用于非const数据集。动态字段甚至不会自动填写字段名称,也不会隐藏价值,我也不知道如何为非动态字段实现此功能。从概念上讲,我可以在启动时根据当前数据集生成.ps1文件,然后加载ps1作为模块,但这感觉有点像用巨剑杀死一只小狗 - 很多过度杀伤力。有更好的选择吗?
答案 0 :(得分:0)
我已经在DynamicParam helper function中实现了类似的功能,作为评论中的参考。但是,标签完成不起作用。当我的标签完成工作时,我正在编写一个最小的复制示例。
事实证明,它基于WriteDebug语句的包含而可重复地工作/中断:
[Cmdlet("Get", "LivingCharacter")]
public class GetLivingCharacter : Cmdlet, IDynamicParameters
{
protected override void ProcessRecord()
{
}
public object GetDynamicParameters()
{
WriteDebug("Getting names"); // Tab completion won't work with this here - comment it out and it works.
^^^^^^^^^^
var chars = new List<String>() { "Bran", "Arya" };
var dict = new RuntimeDefinedParameterDictionary();
var attributes = new Collection<Attribute>
{
new ParameterAttribute
{
HelpMessage = "Enter a valid open name",
Mandatory = true
},
new ValidateSetAttribute(chars.ToArray()),
};
dict.Add("Name", new RuntimeDefinedParameter("Name", typeof(string), attributes));
return dict;
}
}
经过一番挖掘后,WriteDebug
语句正在抛出(我假设这是因为在我打字时它无法输出)。然后,在我完成验证命令后,它会重新创建GetLivingCharacter类。需要一段时间才能找到,因为这个问题,我无法将错误写入控制台,所以我不得不追加到临时文件。