gpt4 book ai didi

powershell - 我可以将两个参数传递给管道吗?

转载 作者:行者123 更新时间:2023-12-02 22:42:20 26 4
gpt4 key购买 nike

我用 C# 编写了一个 PowerShell cmdlet,它最初采用几个参数,但只接受来自管道输入的一个。我将其他参数压缩为单个自定义 C# 对象,我想将其作为管道的输入。以下是相关代码:

[Parameter(ValueFromPipeline = true, Mandatory = true)]
public DataObj Data {get; set;}

[Parameter(ValueFromPipeline = true, Mandatory = false)]
public DataSettings Settings {get; set;} = new DataSettings();

public class DataObj {
public string Name {get; set;}
public int Value {get; set;}
...
}

public class DataSettings {
public DataInfo Info {get; set;} = new DataInfo();
public string Description {get; set} = "";
}

我已经能够成功创建 DataSettings来自 HashTable 的对象在 PowerShell 中修改之前将其作为管道输入。

我试过了:

@{Data = $DataObj; Settings = $DataSettings;} | Add-Data

也:

$DataObj $DataSettings | Add-Data

考虑到从我在 PowerShell 参数绑定(bind)中所读到的内容,管道输入将绑定(bind)到它可以转换为的参数。在我的 PowerShell 脚本中, $DataSettings$DataObjHashTable包含相关属性。

当我在我的 PowerShell 脚本中运行上述任一行时,我得到“输入对象不能绑定(bind)到任何参数...”错误。

是否可以通过这种方式从管道中获取两个输入?我曾考虑创建一个自定义 C# 对象来封装两个输入对象,但我一直试图将必需部分与非必需部分分开。

另外,我尝试运行 Trace-Command ,但尝试后:

Trace-Command ParameterBinding {Add-Data $Input} -PSHost -InputObject @{Data = $DataObj; Settings = $DataSettings;}

我收到一个错误,没有参数匹配名称 Data .我试图关注这个 tutorial ,但显然我做错了什么。

最佳答案

当您使用管道时,将输入对象包装到单个对象中是将它们各自绑定(bind)到不同参数的唯一方法,为此您可以使用 delay-bind script blocks :

@{ Data = $DataObj; Settings = $DataSettings } |
Add-Data -Data { $_.Data } -Settings { $_.Settings }

独立于管道,您可以使用 splatting更优雅地达到同样的效果:
# Construct the arguments to pass as a hashtable.
$htArgs = @{ Data = $DataObj; Settings = $DataSettings }

# Pass the arguments via splatting (note the '@')
Add-Data @htArgs

您可以通过 ForEach-Object 将这两种技术结合起来。 ,但请注意,多输入时效率会降低,因为单独调用 Add-Data然后在每次迭代中进行:
@{ Data = $DataObj; Settings = $DataSettings } | ForEach-Object {
Add-Data @_
}

关于powershell - 我可以将两个参数传递给管道吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53522310/

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