我如何提供一个选项卡完成列表,其中包含在 powershell 启动时生成的值?
How can I provide a tab completion list, with the values generated on powershell startup?
所以我有一个用 c# 编写的 cmdlet:Get-LivingCharacter
。我希望用户像 Get-LivingCharacter -Name "Bran"
这样使用它,但我希望允许更改可用字符列表。也许今天,"Bran" 是为 Get-LivingCharacter
传递的有效名称,但也许在未来它不会。事情发生了。
为了方便起见,我想允许此字段的制表符完成。但是,我似乎无法让它适用于非常量数据集。动态字段甚至不会自动完成字段名称,更不用说值了,而且我不知道如何为非动态字段实现这一点。从概念上讲,我可以在给定当前数据集的情况下在启动时生成一个 .ps1 文件,然后将该 ps1 作为模块加载,但这感觉有点像用大剑杀死一只小狗 - 很多矫枉过正.还有更好的选择吗?
我已经实现了与DynamicParam helper function类似的功能,作为评论中的参考。但是,制表符补全不起作用。我正在写一个最小的复制示例,当...我的制表符完成工作时。
事实证明,它可重现 works/breaks 基于包含 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 class。花了一段时间才找到,因为这个问题,我无法将错误写入控制台,所以我不得不附加到一个临时文件。
所以我有一个用 c# 编写的 cmdlet:Get-LivingCharacter
。我希望用户像 Get-LivingCharacter -Name "Bran"
这样使用它,但我希望允许更改可用字符列表。也许今天,"Bran" 是为 Get-LivingCharacter
传递的有效名称,但也许在未来它不会。事情发生了。
为了方便起见,我想允许此字段的制表符完成。但是,我似乎无法让它适用于非常量数据集。动态字段甚至不会自动完成字段名称,更不用说值了,而且我不知道如何为非动态字段实现这一点。从概念上讲,我可以在给定当前数据集的情况下在启动时生成一个 .ps1 文件,然后将该 ps1 作为模块加载,但这感觉有点像用大剑杀死一只小狗 - 很多矫枉过正.还有更好的选择吗?
我已经实现了与DynamicParam helper function类似的功能,作为评论中的参考。但是,制表符补全不起作用。我正在写一个最小的复制示例,当...我的制表符完成工作时。
事实证明,它可重现 works/breaks 基于包含 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 class。花了一段时间才找到,因为这个问题,我无法将错误写入控制台,所以我不得不附加到一个临时文件。