Class 名称查找在Powershell脚本块中如何工作?

Class 名称查找在Powershell脚本块中如何工作?,class,powershell,Class,Powershell,用户cashfoley在网站上发布了一组相当优雅的代码,用于一个名为PSClass的“模块” 当我将psclass代码点源化为我自己的一些代码时,我能够编写如下代码: $Animal = New-PSClass Animal { constructor { param( $name, $legs ) # ... } method -override ToString { "A $($this.Class.ClassNa

用户cashfoley在网站上发布了一组相当优雅的代码,用于一个名为PSClass的“模块”

当我将psclass代码点源化为我自己的一些代码时,我能够编写如下代码:

$Animal = New-PSClass Animal {

    constructor {
        param( $name, $legs )

        # ...
    }

    method -override ToString {
        "A $($this.Class.ClassName) named $($this.name) with $($this.Legs) Legs"
    }
}
然而,当我试图用PSClass代码创建一个模块时,我开始出错。不再识别
构造函数
方法
名称

查看实际实现,我看到的是
构造函数
方法
等实际上是新PSClass函数中的嵌套函数

因此,在我看来,当我点源PSClass.ps1文件时,我的脚本块被允许包含对嵌套在其他本地函数中的函数的引用。但是当PSClass代码成为模块时,随着新PSClass函数的导出(我尝试使用manifest和Export ModuleMember),名称不再可见

有人能给我解释一下嵌套函数的脚本块、作用域规则和可见性规则是如何协同工作的吗


另外,对于纯Powershell脚本,是否有更好的类定义协议?(特别是,不涉及“只需用C#编写,然后执行…”)的脚本块中的变量在执行之前不会被计算。如果执行块时脚本块中的变量不在当前范围内,则这些变量将没有任何值。脚本块不是闭包:它们不会在实例化时捕获上下文

Remove-variable FooBar

function New-ScriptBlock
{
    $FooBar = 1

    $scriptBlock = {
        Write-Host "FooBar: $FooBar"
    }

    $FooBar = 2
    & $scriptBlock  # Outputs FooBar: 2 because $FooBar was set to 2 before invocation
    return $scriptBlock
}

function Invoke-ScriptBlock
{
    param(
        $ScriptBlock
    )

    & $ScriptBlock
}

$scriptBlock = New-ScriptBlock 

& $scriptBlock    # Prints nothing since $FooBar doesn't exist in this scope

$FooBar = 3
Invoke-ScriptBlock $scriptBlock   # Prints $FooBar: 3 since FooBar set to 3

ps>获取关于|范围的帮助|更多如果这是真的,那么为什么将外部函数放在模块中不起作用?