【问题标题】:How to make a namespace within a PowerShell script如何在 PowerShell 脚本中创建命名空间
【发布时间】:2014-11-12 17:38:27
【问题描述】:

我想在 PowerShell .ps1 脚本或 .psm1 模块中使用我自己的自定义命名空间。这可能吗?如果是这样,这样做的语法是什么?

我在这里找到了相关链接: Breaking the Powershell namespace limit of global,script

看来我需要制作自己的自定义对象,或者可能为此使用自定义关联数组?

我希望能够像这样调用我的函数:

[MyCoolNamespace]::Get-CrazyYall

【问题讨论】:

    标签: powershell


    【解决方案1】:

    模块名称类似于命名空间。例如:

    Microsoft.PowerShell.Core\Get-Command
    

    相同
    Get-Command
    

    在调用命令(cmdlet、函数或别名)时,通常不使用模块限定名,但如果您确实有冲突或希望 100% 确定您正在调用您想要调用的函数,它会派上用场.

    【讨论】:

    • 谢谢!我认为这实际上更符合我想要做的事情。基本上我想要一个命名空间,所以我不必写出长函数名(即伪命名空间)。
    • 我接受了这个,因为它是“纯”PowerShell 并提供了我想要的东西,尽管名称不同......
    • 这远未完成:例如,我无法访问从模块导出的变量。函数和别名确实可见
    【解决方案2】:

    使用静态方法创建自定义类型:

    PS C:\> 添加类型@' >> 使用系统; >> 公共类 MyCoolNamespace { >> 公共静态字符串 Foo() { >> 返回 "Foo"; >> } >> } >> '@ >> PS C:\> [MyCoolNamespace]::Foo()

    【讨论】:

    • 谢谢!我想只有恢复到 C# 语法才有可能?我希望在 PowerShell 中编写我的函数,但将它们放在命名空间中。这可能吗?这简单吗?例如,如果我已经用 PowerShell 编写了 Get-Foo 函数怎么办?
    • 我不知道在普通 PowerShell 中执行此操作的方法。
    • 对我来说,这并不能回答问题,因为它只是利用 C#。
    【解决方案3】:

    您可以尝试使用 PSTypeNames。

    $Var = [PSCustomObject]@{
        foo = [string]::Empty
        bar = $false
    }
    
    $Var.PSTypeNames.Insert(0, 'My.Namespace')
    

    $var |获取会员

    【讨论】:

    • 这似乎不是一个好习惯。
    猜你喜欢
    • 2021-10-03
    • 1970-01-01
    • 2012-06-26
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 2010-12-13
    相关资源
    最近更新 更多