Как в pwsh использовать блок сценария, например {$_.UserId}, для получения некоторой информации от объекта?

У меня есть объект, который содержит поле с именем PKBlock, которое принимает значение скрипта.

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

or

$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

person Richard Hankins    schedule 24.03.2021    source источник
comment
Вот: stackoverflow.com /вопросы/16575419/ . Это должно ответить на ваш вопрос   -  person Abraham Zinala    schedule 24.03.2021
comment
@AbrahamZinala очень признателен, но ссылка рассказывает, как получить значения, и не содержит никакой информации о блоках скриптов, которые я вижу. Я не думаю, что это относится к моему вопросу. Я хочу использовать блок сценария для программной генерации первичного ключа из объекта.   -  person Richard Hankins    schedule 24.03.2021


Ответы (1)


Во-первых, безымянная автоматическая переменная в блоке сценария — $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

or

. $o.PKBlock $json

or

Invoke-Command -ScriptBlock $o.PKBlock -ArgumentList $json

Вы также можете указать именованные параметры для вашего скриптового блока.

$o.PKBlock = {
    Param($object) return $object.userid
} 

Назовите это так же.

ИЗМЕНИТЬ

$_ или $PSItem — это автоматическая переменная для любого количества командлетов. Если вы действительно хотите использовать параметры vs args/named, вы можете перейти к Foreach-Object

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

or

$json | ForEach-Object {. $o.PKBlock $psitem}
person Doug Maurer    schedule 24.03.2021
comment
Очень признателен, это решило мою проблему. Я надеялся использовать $_ и inputobject, но это выполнит мою задачу. - person Richard Hankins; 24.03.2021
comment
@RichardHankins посмотри мое последнее редактирование - person Doug Maurer; 24.03.2021