gpt4 book ai didi

powershell - 使用动态参数时,Get-Command -syntax 仅返回第一组参数

转载 作者:行者123 更新时间:2023-12-04 07:53:16 25 4
gpt4 key购买 nike

我很难理解 Powershell 在使用动态参数时如何解析语法。
一个简单的、可重现的例子:

using System;
using System.Management.Automation;

namespace SOQuestion
{
[Cmdlet(VerbsCommon.Get, "Greeting")]
public class GetGreeting : PSCmdlet, IDynamicParameters
{
[Parameter(Position = 0, Mandatory = true)]
public NameType NameType { get; set; }

private object context;
public object GetDynamicParameters()
{
switch (NameType)
{
case NameType.First:
context = new DynParamsFirst();
return context;
case NameType.Full:
context = new DynParamsFull();
return context;
default:
throw new ArgumentException("Invalid type specified");
}
}
protected override void ProcessRecord()
{
string name;
switch (NameType)
{
case NameType.First:
DynParamsFirst first = context as DynParamsFirst;
name = first.FirstName;
break;
case NameType.Full:
DynParamsFull full = context as DynParamsFull;
name = full.First + " " + full.Last;
break;
default:
throw new ArgumentException("Invalid type specified");
}
WriteObject($"Hello {name}!");
}
}

public enum NameType
{
First = 0,
Full = 1
}

public class DynParamsFirst
{
[Parameter(Position = 1, Mandatory = true)]
public string FirstName { get; set; }
}

public class DynParamsFull
{
[Parameter(Position = 1, Mandatory = true)]
public string First { get; set; }
[Parameter(Position = 2, Mandatory = true)]
public string Last { get; set; }
}
}
这在 CLI 中提供参数时按预期运行,我的参数非常动态,并且我得到了预期的输出。
但是当我运行 Get-Command Get-Greeting -syntax我得到: Get-Greeting [-NameType] <NameType> [-FirstName] <string> [<CommonParameters>]这些是属于 DynParamsFirst 的参数.没有迹象表明参数是动态的。我发现被拉取的语法是 NameType 中第一个匹配项的语法枚举 - 如果我设置 Full0NameType枚举,然后 Get-Command Get-Greeting -syntax将输出 DynParamsFull 的参数反而。另外,如果我输入 Get-Greeting,很可能是相关的。没有参数并按 Enter,我总是得到 FirstName , 结合 Full 会抛出错误名称类型。
我发现这令人惊讶,并且很难记录命令。我还发现提出一个适当的问题并非易事。
这是:如何更改代码,以便在输入不带参数的命令时,Powershell 知道涉及动态参数?

最佳答案

-NameType是您的 cmdlet 唯一的静态参数。它的默认值是隐式 [NameType]::new() ,即 [NameType]类型的隐式默认值:作为 enum -派生类型,即作为 .NET 值类型,它隐式具有一个默认构造函数,该构造函数将值初始化为全零,在您的情况下转换为 NameType.First :
因此,没有(隐含的)附加上下文,Get-Command Get-Greeting -Syntax表现得好像你已经通过了 -NameType FirstGet-Greeting ,这就是你看到的语法图:它显示了相应的 -FirstName动态参数:

PS> Get-Command Get-Greeting -syntax # implies: -Args '-NameType', First - see below.

Get-Greeting [-NameType] <NameType> [-FirstName] <string> [<CommonParameters>]

为了查看在特定情况下可能应用的其他语法图,您必须将传递参数传递给 Get-Command -Syntax通过其 -ArgumentList/ -Args参数,然后显示适合情况的语法,_就像将这些参数传递给目标命令一样, Get-Greeting :
PS> Get-Command Get-Greeting -syntax -Args '-NameType', Full

Get-Greeting [-NameType] <NameType> [-First] <string> [-Last] <string> [<CommonParameters>]

请注意引用 -NameType 的可能令人惊讶的需要,以免被解释为另一个参数名称而不是传递给 -Args 的参数值- 见 GitHub issue #4624 .

关于powershell - 使用动态参数时,Get-Command -syntax 仅返回第一组参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66836882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com