如何在CmdletBinding之前加载另一个PowerShell文件?

4

我正在使用PowerShell 5。我在另一个PS1文件中创建了一个枚举,现在想将其加载到具有CmdletBinding的另一个PS1中。

我尝试了下面的代码但没有成功。有没有办法在CmdletBinding之前加载枚举PS1?

. ".\GeneratorType.ps1" 

[CmdletBinding()]
Param
(
        [Parameter(ValueFromPipeline=$True,ValueFromPipelineByPropertyName = $True,Mandatory=$False)]       
        [GeneratorType]$type = [GeneratorType]::All
)

棘手。只有在函数中才能工作,而不是独立使用。似乎[CmdletBinding()]必须首先出现... - sodawillow
1
是的,我也注意到了。如果我不在参数中使用该枚举,我可以在CmdletBinding之后加载它,但我想在我的一个参数中使用该枚举。我找到的唯一解决方案是在同一文件中定义该枚举类型。我也不想把CmdletBinding放在函数内部。 - Michael Sync
1
你可以在调用它之前,像包装脚本一样,在 cmdlet 脚本之外点源类脚本 :-) 或者在你的个人资料中构建该类。 - sodawillow
感谢@sodawillow和@Mathias R. Jessen..我会查看那个模块的,但我认为对于我的简单脚本来说,这会有点大材小用 https://github.com/michaelsync/powershell-scripts/tree/master/SqlTableTypeToDataType ... 如果使用该模块是唯一的方法,那么我将在同一文件中声明该枚举。 - Michael Sync
@MichaelSync 你如何在同一文件中定义枚举?它仍然必须在 CmdletBinding 之后定义,因此在参数块中仍然是未知的。你能发表一个关于如何解决这个问题的答案吗? - stackprotector
1个回答

4

这样想:PowerShell脚本是一个自包含的ScriptBlock。

[CmdletBinding()] 属性是 param-block 的一部分。根据语言规范,如果存在,则 param-block 必须是 ScriptBlock 的第一个部分。

因此,不能在 CmdletBinding 属性之前放置任何内容。

您可以将您的 GeneratorTypes.ps1 脚本转换为模块并使用。

#Requires -Modules

为确保在解释参数块时加载它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接