gpt4 book ai didi

powershell - 如何向 PowerShell PSDrive "function:"上的函数对象添加属性?

转载 作者:行者123 更新时间:2023-12-03 23:52:59 26 4
gpt4 key购买 nike

我已经尝试使用 $function:foo 值和 get-item function: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.ScriptBlockName                 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.FunctionInfoName                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=FunctionPSIsContainer       NoteProperty System.Boolean PSIsContainer=FalsePSPath              NoteProperty System.String PSPath=Microsoft.PowerShell.Core\Function::fooPSProvider          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.FunctionInfoName                MemberType   Definition----                ----------   ----------bar                 NoteProperty System.String bar=barValue$=>set-item function:foo $f$=>$function:foo | gm b*>

不确定我做错了什么。似乎属性在重新分配时被剥离了。那是对的吗?定义的行为?我还没有看到任何文档说 FunctionInfo 对象或 ScriptBlocks 被异常对待。这是语言的某个深奥的角落吗?

最佳答案

我的第一个想法是,当您将此属性附加到一个对象时,您是将其附加到该对象的特定实例。当您的变量失去对该对象的引用时,有关该新属性的任何知识都会丢失。

我的猜测是,下次您获得该项目时,您将创建一个具有 foo 属性(存储在函数提供程序中)的新 FunctionInfo 对象。

当您调用 Get-Item 或 Get-ChildItem 时,它会返回对表示基础项的 .NET 类型的对象引用。这些项目不会无限期地存在于内存中(想象一个 FileInfo 对象,用于每个本地驱动器上的每个文件和内存中的每个映射驱动器......哎哟)。由于每次调用 Get-Item 时 PowerShell 都会创建一个新实例,因此您将获得基本的 FunctionInfo 对象。

如果您想为特定类型的所有项目添加一个属性,您可以使用 PowerShell 的可扩展类型系统。您可以创建自定义 .ps1xml 文件并将其加载到 PowerShell session 中,该 session 可以将属性添加到类型的每个实例。 PowerShell 团队博客上的一些很好的例子在这里 -> Hate Add-MemberLeveraging the PowerShell Type Extensions to Get Documentation .

编辑(解决评论):我明白你想做什么,但失败是由于新属性被“移植”到允许即时添加属性的 PSObject 包装器上。新属性永远不会真正成为您从 PSDrive 检索的 FunctionInfo 对象的一部分。

此外,函数提供者(函数:psdrive)没有存储该附加属性的机制。它知道并使用 FunctionInfo 对象。当您从 Function: PSDrive 请求一个项目时,Function 提供者返回一个 FunctionInfo 对象。当您将函数保存到 Function: PSDrive 时,提供者只能存储它知道如何处理的属性的值。可以编写一个自定义提供程序来处理来自 PSObject 包装器的新属性,但这不是该提供程序中默认功能的一部分。

编辑#2:好的,这一直困扰着我。 I blogged about a workaround .

关于powershell - 如何向 PowerShell PSDrive "function:"上的函数对象添加属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/544804/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com