我正在整理一个PS模块,该模块与我使用的某些软件的REST API进行对话。
我有Add-Object
,Search-Object
和Remove-Object
cmdLets,这些都可以单独运作,但我正努力让它们通过管道以我的方式一起工作我喜欢。
例如,如果我想搜索一个对象然后删除搜索结果,我必须这样做:
Search-Object -target $targetAddress `
-AuthenticationToken $authtoken `
-Query "Test Object" `
| Remove-Object -target $targetAddress `
-AuthenticationToken $authtoken
Search-Object
cmdLet的输出已成功通过管道传递,但Target
和AuthenticationToken
变量未成功传递。
如果我从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
答案 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
返回包含必填属性Target
,AuthenticationToken
和ObjectName
的对象。您甚至可以将一些测试对象提供给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需要在其读取的流水线对象上找到target
和AuthenticationToken
属性。是这种情况吗?
尝试检查:
Search-Object -target $targetAddress `
-AuthenticationToken $authtoken `
-Query "Test Object" ` | Get-Member Target,AuthenticationToken
虽然......在AuthenticationToken
返回的每个对象上复制Search-Object
感觉不对。可能有更好的方法在cmdlet之间传递令牌,但我不确定它是什么。