Отличается ли оценка параметров scriptblock для скомпилированных командлетов и расширенных функций? - PullRequest
2 голосов
/ 21 июля 2010

Экспериментируя со скриптовыми блоками, я пытался использовать параметр скриптового блока с расширенной функцией и заметил, что он работает иначе, чем при передаче в скомпилированный командлет.* из блога команды 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.Это делает пример работающим, хотя кажется, что он побеждает заявленную цель параметров блока скрипта из поста в блоге команды.

1 Ответ

5 голосов
/ 21 июля 2010

Если параметр ValueFromPipeline или ValueFromPipelineByPropertyName, PowerShell оценит блок скриптов и попытается привести результат к типу параметра. Некоторое время назад мы получили эту информацию от команды PowerShell:

Аргументы ScriptBlock передаются как есть (как ScriptBlock), когда параметр типом является Object, ScriptBlock или тип производный от ScriptBlock, или Коллекции этих типов.

Мы вызываем только ScriptBlock аргумент во время привязки параметра, когда есть вход в трубопровод и там было нет тривиального способа связать ScriptBlock непосредственно.

...