在 pwsh 中,如何使用像 {$_.UserId} 这样的脚本块从对象中获取一些信息?

In pwsh, how do you use a script block like {$_.UserId} to get some information from an object?

我有一个包含名为 PKBlock 的字段的对象,该字段接受脚本值

$o.PKBlock = { return $_.UserId }

$o.PKBlock = { return $_.GroupId + $_.ResourceId }

我想传递一个对象(此处显示在 json)

{
    "UserId":"aodpkjpw92kjd",
    "GroupId":"90djd0223djd",
    "ResourceId":"012ekkkk023"
}

如何执行脚本块并获取 return 值?

我尝试了以下方法(其中 $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/named 参数,你可以传入 Foreach-Object

$json | ForEach-Object {. $o.PKBlock $_}

$json | ForEach-Object {. $o.PKBlock $psitem}