Экспериментируя со скриптовыми блоками, я пытался использовать параметр скриптового блока с расширенной функцией и заметил, что он работает иначе, чем при передаче в скомпилированный командлет.* из блога команды PowerShell Team видно, что ядро PowerShell должно оценивать блок сценариев, если блок сценариев не является допустимым входным параметром для параметра.Похоже, что при вызове функции с параметром scriptblock она пытается преобразовать блок script в тип параметров напрямую, а не оценивать блок script на основе текущего объекта в конвейере.
Мое намерение состоит в дублировании поведениянапример:
Import-CSV somecsv.csv | get-wmiobject -class {$_.class} -Computer {$_.computer}
для расширенных функций.
Пример сценария:
$sb = {throw "If there was an error, the scriptblock was evaluated!"}
function test ()
{
param (
[Parameter()]
[string]
$ThisShouldBeEvaluatedForEachItem,
[Parameter(ValueFromPipelineByPropertyName = $true)]
[string]
$FullName
)
process
{
write-host $Fullname, $ThisShouldBeEvaluatedForEachItem
}
}
Get-ChildItem | test -ThisShouldBeEvaluatedForEachItem $sb
Это предполагаемое поведение или я движусь в неправильном направлении?
Основываясь на ответе Кита , я добавил ValueFromPipeline и ValueFromPipelineByPropertyName (в двух отдельных тестах) в атрибут Parameter для параметра ThisShouldBeEvaluatedForEachItem.Это делает пример работающим, хотя кажется, что он побеждает заявленную цель параметров блока скрипта из поста в блоге команды.