Powershell:别名和函数有什么区别?

Powershell: What's the difference between Alias and Function?

我正在设置我的 powershell 配置文件以创建常用命令的别名。 On Microsoft's documentation it says, if I want to make an alias for a command with parameters, I should make the value of the alias a Function that does that.。但是,当我在命令行中键入函数名称时,它就像别名一样有效。

换句话说,在上图中,如果我输入 CD32 它的行为与我在命令行中输入 Go 的行为相同

所以我的问题是:当我只能拥有一个函数时,为什么要使用指向函数的别名?两者之间有功能差异吗?

  • PowerShell 中的别名 允许您定义替代另一个命令的名称.

    • 不像POSIX-compatibleshell中的bash不能包含pass-through参数 在其定义中 - 您需要一个 函数 来实现 .

    • 典型用例是定义一个替代名称方便交互式调用;例如,PowerShell 的 Get-Content cmdlet 有一个内置的 gc 别名。 PowerShell 甚至根据其 approved verbs 的官方短别名前缀推荐了别名的命名约定,例如给定示例中 Get 动词的 g

    • 另一个,有问题的用途是为不同shell的命令定义别名;例如,PowerShell 为其 Get-ChildItem 内置了 dir 别名,以 cmd.exe 的(命令提示符)内部 dir 命令命名。虽然这在从 cmd.exe 转换时可能有点帮助,但它仅适用于非常简单的调用,并且由于 PowerShell 根本不同的 command-line 语法和不同的参数名称而很快成为问题。

    • 另一个,没有问题的用途是为其目录未在路径中列出的外部可执行文件定义别名($env:PATH);例如,如果您想将 c:\path\to\foo.exe 作为 foo 而不必将 c:\path\to 添加到 $env:PATH,则可以使用 Set-Alias foo c:\path\to\foo.exe.

    • 与 POSIX-compatible shell 中的 bash 不同,别名 (总是)可用于 scripts*.ps1 文件),但为了稳健性和 long-term 稳定性,不鼓励 在脚本中使用它们。

  • A function,正如预期的那样,是一个 命名代码单元可以接受参数并可以执行任意操作.

    • 如果你想 wrap 现有的命令,你需要使用一个函数 hard-coding [=138] =] 参数和/或围绕包装命令的调用提供自定义逻辑 - 参见 .

至于定义一个函数的别名是否有意义,如果你的命令的实现需要一个函数(由于需要的不仅仅是一个简单的名称映射):

  • 如果您只需要一个(短)命令名称,您可以直接定义函数使用该名称 - 不需要别名。

  • 相比之下,如果您的函数需要 名称,尤其是符合 PowerShell verb-noun 命名约定的 advanced (cmdlet-like) function (例如,Invoke-Foo),并且您还需要一个 short 名称以方便交互(例如,foo),您还必须为此定义一个别名使用该短名称的函数(例如,Set-Alias foo Invoke-Foo)。