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

Xer*_*rtz 5 windows powershell scripting alias function

我设置了我的 powershell 配置文件来创建常用命令的别名。在 Microsoft 的文档中,它说,如果我想为带有参数的命令创建别名,我应该将别名的值设为执行此操作的函数。在此处输入图片说明. 但是,当我在命令行中键入函数的名称时,它与别名一样有效。

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

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

mkl*_*nt0 7

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

    • 不同于POSIX兼容的外壳如bash可以不包括直通参数的定义中-你需要一个功能

    • 典型的使用情况是定义一个替代名称为交互式调用的方便; 例如,PowerShellgc为其Get-Contentcmdlet提供了一个内置别名。PowerShell 甚至建议别名的命名约定,基于其批准的动词的官方短别名前缀,例如给定示例中gGet动词。

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

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

    • 不像在POSIX兼容外壳,例如bash,别名(总是)在可用的脚本*.ps1文件),但其在脚本中使用是不鼓励在稳健性和长期稳定的利益。

  • 一种 功能,因为是可以预期的,是的代号为单位,可以接受参数并可以执行任意操作

    • 如果要包装现有命令,则需要使用函数过硬编码传递参数和/或围绕已包装命令的调用提供自定义逻辑,- 请参阅此答案

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

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

  • 相比之下,如果您的函数需要名称,尤其是遵循 PowerShell 的动词-名词命名约定(例如,)的高级(类似 cmdlet)的函数Invoke-Foo,并且您还需要一个名称以方便交互(例如,foo) ' 还必须使用该短名称(例如,Set-Alias foo Invoke-Foo)为该函数定义别名。

  • 我不明白你的例子,@Timo。显然,您可以将参数(参数)传递给_调用_上已定义的别名_,并且别名甚至可以引用其他别名,但要点是您不能将预定义参数“烘焙”到别名_定义_中,因为别名只是另一个名称的另一个名称_命令_,而不是命令_加上预定义的参数_。 (2认同)