我有一个对象,它包含一个名为PKBlock的字段,该字段接受脚本值
$o.PKBlock = { return $_.UserId }
或
$o.PKBlock = { return $_.GroupId + $_.ResourceId }
我想传递一个对象(显示在json中(
{
"UserId":"aodpkjpw92kjd",
"GroupId":"90djd0223djd",
"ResourceId":"012ekkkk023"
}
如何执行脚本块并获取返回值?
我尝试了以下操作($record是作为对象的对象(:
Invoke-Command -ScriptBlock $o.PKBlock -InputObject $record
Invoke-Command -ScriptBlock $o.PKBlock -ArgumentList $record
$record | Invoke-Command -ScriptBlock $o.PKBLock
首先,脚本块中未命名的自动变量是$args
。第一个参数是$args[0]
,第二个是$args[1]
,等等。所有参数都只包含在$args
中
您可以通过几种不同的方式调用脚本块。
& # call operator, new child scope
. # call operator, calling scope. Also used for "dot sourcing"
Invoke-Command
下一个问题是,如果您想按名称访问json属性,则需要将其作为一个对象。可能最简单的是ConvertFrom-Json
。一旦你纠正了这两个问题,其中任何一个都应该有效。
$o.PKBlock = { return $args[0].userid }
$json = @'
{
"UserId":"aodpkjpw92kjd",
"GroupId":"90djd0223djd",
"ResourceId":"012ekkkk023"
}
'@ | ConvertFrom-Json
现在称之为
& $o.PKBlock $json
或
. $o.PKBlock $json
或
Invoke-Command -ScriptBlock $o.PKBlock -ArgumentList $json
您还可以为脚本块提供命名参数
$o.PKBlock = {
Param($object) return $object.userid
}
用同样的方式来称呼它。
编辑
$_
或$PSItem
是任意数量cmdlet的自动变量。如果你真的想使用vs args/命名参数,你可以传递到Foreach-Object
$json | ForEach-Object {. $o.PKBlock $_}
或
$json | ForEach-Object {. $o.PKBlock $psitem}