如何通过管道传递变量参数?

时间:2018-02-13 11:08:44

标签: powershell

我正在整理一个PS模块,该模块与我使用的某些软件的REST API进行对话。

我有Add-ObjectSearch-ObjectRemove-Object cmdLets,这些都可以单独运作,但我正努力让它们通过管道以我的方式一起工作我喜欢。

例如,如果我想搜索一个对象然后删除搜索结果,我必须这样做:

Search-Object -target $targetAddress `
              -AuthenticationToken $authtoken `
              -Query "Test Object" `
| Remove-Object -target $targetAddress `
                -AuthenticationToken $authtoken

Search-Object cmdLet的输出已成功通过管道传递,但TargetAuthenticationToken变量未成功传递。

如果我从Remove-Object cmdLet中删除它们,则会失败。我如何实现这一目标?

修改

[parameter(Mandatory=$true,ValueFromPipeline=$true,
ValueFromPipelinebyPropertyName=$true)]
[string]$Target,

[parameter(Mandatory=$true,ValueFromPipeline=$true,
ValueFromPipelinebyPropertyName=$true)]
[string]$AuthenticationToken,

[parameter(Mandatory=$true,ValueFromPipeline=$true,
ValueFromPipelinebyPropertyName=$true)]
[ValidateLength(1,28)][string]$ObjectName

2 个答案:

答案 0 :(得分:0)

从参数定义中删除ValueFromPipeline=$true声明,并仅使用ValueFromPipelinebyPropertyName。如果同时使用这两个声明,则该函数会为每个参数转换整个对象的字符串表示形式,而不是命名属性的值。如果除了管道中已知类型的对象作为单个参数,则应使用ValueFromPipeline。现在您要求命名为String,这将起作用:

[parameter(Mandatory=$true,ValueFromPipelinebyPropertyName=$true)]
[string]$Target,
[parameter(Mandatory=$true,ValueFromPipelinebyPropertyName=$true)]
[string]$AuthenticationToken,
[parameter(Mandatory=$true,ValueFromPipelinebyPropertyName=$true)]
[ValidateLength(1,28)][string]$ObjectName

修改:还要确保Search-Object返回包含必填属性TargetAuthenticationTokenObjectName的对象。您甚至可以将一些测试对象提供给Remove-Object,以确保它接受正确的参数,问题出在Search-Object

$test = New-Object psobject -Property @{ "Target"="Test Target"; "AuthenticationToken"="Test Token"; "ObjectName"="Test Object" }
$test | Remove-Object

答案 1 :(得分:0)

看起来你想要的语法是这样的:

Search-Object -target $targetAddress `
              -AuthenticationToken $authtoken `
              -Query "Test Object" | 
    Remove-Object 
        <# -target read from pipelined object property #>
        <# -AuthenticationToken read from pipelined object property#>

为了使ValueFromPipelineByPropertyName=$true起作用,cmdlet之间流水线操作的对象必须具有与参数名称匹配的属性名称。

您将-target传递到Search-Object cmdlet,Remove-Object cmdlet需要在其读取的流水线对象上找到targetAuthenticationToken属性。是这种情况吗?

尝试检查:

Search-Object -target $targetAddress `
          -AuthenticationToken $authtoken `
          -Query "Test Object" ` | Get-Member Target,AuthenticationToken

虽然......在AuthenticationToken返回的每个对象上复制Search-Object感觉不对。可能有更好的方法在cmdlet之间传递令牌,但我不确定它是什么。