繁体   English   中英

Powershell:别名和Function有什么区别?

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

我正在设置我的 powershell 配置文件以创建常用命令的别名。 在 Microsoft 的文档中,它说,如果我想为带有参数的命令创建别名,我应该将别名的值设为 Function 来做到这一点。 在此处输入图像描述 . 但是,当我在命令行中键入 function 的名称时,它的工作原理与别名一样。

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

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

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

    • 与 POSIX 兼容的 shell 不同,例如bash不能在其定义中包含直通 arguments - 您需要一个function

    • 典型的用例是为方便交互调用定义一个简短的替代名称 例如,PowerShell 的Get-Content cmdlet 有一个内置的gc别名。 PowerShell 甚至建议别名的命名约定,基于其已批准动词的官方短别名前缀,例如给定示例中Get动词的g

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

    • 另一个没有问题的用途是为其目录未列在路径 ( $env:PATH ) 中的外部可执行文件定义别名; eg, if you want to execute c:\path\to\foo.exe as just foo without having to add c:\path\to to $env:PATH , you can use Set-Alias foo c:\path\to\foo.exe

    • 与 POSIX 兼容的 shell(例如bash )不同,别名(总是)可用于脚本*.ps1文件),但出于稳健性和长期稳定性的考虑,不鼓励在脚本中使用别名。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM