【问题标题】:Unable to create a PowerShell alias in a script module无法在脚本模块中创建 PowerShell 别名
【发布时间】:2010-12-31 00:06:58
【问题描述】:

重现步骤:

使用以下函数和别名在 \WindowsPowerShell\Modules\TestAlias\TestAlias.psm1 中创建一个 TestAlias 模块:

function foo
{ write-output 'foo' }


New-Alias -name bar -value foo

来自 PowerShell 会话:

import-module TestAlias
bar

术语“bar”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称...

【问题讨论】:

    标签: powershell


    【解决方案1】:

    你可以使用

    Export-ModuleMember -Function * -Alias * 
    

    导出所有函数和别名。

    默认情况下,Windows PowerShell 模块仅导出命令(函数或 cmdlet),而不是变量或别名。

    我将更详细地说明这是为什么。

    简短的回答是,虽然别名在编写一个衬里时很方便,但却是理解脚本或模块的障碍。它们为一个好的 cmdlet 锦上添花,但要公开的核心是好的 cmdlet。别名使阅读您的脚本的用户更难弄清楚您要做什么(Set-Content 比 sc 更容易理解)。变量的暴露可能更糟糕,因为它们很容易被设置为意想不到的值,而且几乎没有什么可以帮助你的模块的用户弄清楚它们在那里。因为命令很容易发现(Get-Command -Module FOO)并且更容易探索(使用 Get-Help),所以模块将导出的默认值仅是命令。与 PowerShell 中的大多数其他内容一样,您可以选择覆盖它,但默认情况下,命令是唯一从模块导出的内容。

    希望对你有帮助

    【讨论】:

    • 我同意你关于别名使脚本更难理解的观点。我什至不喜欢看到带有 % 和 ? 的博客文章。通常我不会对模块使用别名,但是我有一个现有的 Powershell V1 函数库,我将其转换为 V2 模块,我需要更改一些函数名称以支持将一些函数设为私有。为了不破坏任何基于函数的旧脚本,我在模块中创建了别名。
    • 模块中别名的主要目的是允许域中自然的动词不同于正常的可发现动词。
    • 实际上这是别名没有警告命名约定的原因,而不是“要点”。 IIS 团队已经发布了不符合约定的 cmdlet,并且必须为它们设置别名以实现兼容性。非常不建议批发使用这些别名来打破命名约定,但在某种程度上已被广泛使用(F5、AWS 和 FIM,仅举几例)。请在“重点”问题上相信我:我在 PowerShell 团队 @ Microsoft 时参与了大部分指南。
    【解决方案2】:

    在 PSM1 文件中使用Export-ModuleMember 导出别名

    Export-ModuleMember -function foo -Alias bar
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多