Я попытался использовать значение $ function: foo и функцию get-item: foo. Все попытки изменить временный объект функции успешны, но дополнительное свойство отсутствует при переназначении сохраненной функции (либо через $ function: foo = ..., либо через set-item function: foo ...).
Вот результаты моих попыток (все неудачны):
Настройка
$=>function foo { "foo" }
$=>$f = $function:foo
$=>$f = $f | add-member noteproperty bar BARvalue -pass
$=>$f | gm b*
TypeName: System.Management.Automation.ScriptBlock
Name MemberType Definition
---- ---------- ----------
bar NoteProperty System.String bar=BARvalue
#1
$=>set-item function:f $f -force $=>$function:foo | gm b* >
#2
$=>$function:f = $f $=>$function:foo | gm b* >
#3
$=>$f = get-item function:foo
$=>$f | gm
TypeName: System.Management.Automation.FunctionInfo
Name MemberType Definition
---- ---------- ----------
Equals Method System.Boolean Equals(Object obj)
GetHashCode Method System.Int32 GetHashCode()
GetType Method System.Type GetType()
ToString Method System.String ToString()
PSDrive NoteProperty System.Management.Automation.PSDriveInfo PSDrive=Function
PSIsContainer NoteProperty System.Boolean PSIsContainer=False
PSPath NoteProperty System.String PSPath=Microsoft.PowerShell.Core\Function::foo
PSProvider NoteProperty System.Management.Automation.ProviderInfo PSProvider=Microsoft....
CmdletBinding Property System.Boolean CmdletBinding {get;}
CommandType Property System.Management.Automation.CommandTypes CommandType {get;}
DefaultParameterSet Property System.String DefaultParameterSet {get;}
Definition Property System.String Definition {get;}
Description Property System.String Description {get;set;}
Module Property System.Management.Automation.PSModuleInfo Module {get;}
ModuleName Property System.String ModuleName {get;}
Name Property System.String Name {get;}
Options Property System.Management.Automation.ScopedItemOptions Options {get;set;}
Parameters Property System.Collections.Generic.Dictionary`2[[System.String, mscorli...
ParameterSets Property System.Collections.ObjectModel.ReadOnlyCollection`1[[System.Man...
ScriptBlock Property System.Management.Automation.ScriptBlock ScriptBlock {get;}
Visibility Property System.Management.Automation.SessionStateEntryVisibility Visibi...
$=>$f = $f | add-member noteproperty bar barValue -pass
$=>$f | gm b*
TypeName: System.Management.Automation.FunctionInfo
Name MemberType Definition
---- ---------- ----------
bar NoteProperty System.String bar=barValue
$=>set-item function:foo $f
$=>$function:foo | gm b*
>
Не уверен, что делаю не так. Похоже, что свойства удаляются при переназначении. Это верно? определенное поведение? Я не видел документации, в которой говорилось бы, что объекты FunctionInfo или ScriptBlocks обрабатываются необычно. Это какой-то эзотерический уголок языка?