【问题标题】:Powershell: What's the difference between Alias and Function?Powershell:别名和函数有什么区别?
【发布时间】:2020-11-27 04:31:21
【问题描述】:

我正在设置我的 powershell 配置文件来创建常用命令的别名。 On Microsoft's documentation 它说,如果我想为带有参数的命令创建别名,我应该将别名的值设为执行该操作的函数。。但是,当我在命令行中输入函数的名称时,它的工作原理和别名一样。

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

所以我的问题是:为什么我可以使用指向函数的别名?两者在功能上有区别吗?

【问题讨论】:

  • 该文档的意思是,如果要为命令创建“别名”并将参数值指定为“别名”的一部分,则必须使用函数。您当然可以为带有参数的命令创建别名,并且可以在使用别名时指定这些参数,但是您不能为别名修复任何适当的参数。别名只是命令的别名,而不是具有特定值的命令。为此,您需要使用一个函数。
  • 让我换个说法。上面的CD32函数,因为要把参数C:\Windows\System32传递给Set-Location,所以必须做一个函数。如果您只是想为Set-Location 创建一个别名,您可以使用别名,但它的功能与Set-Location 完全相同,因此当您使用别名时,您还必须告诉它要设置的位置。这有什么意义吗?
  • 嗯,有道理。所以别名的行为就像它指向的命令一样,包括你如何给它参数。这是一种写命令的简写。
  • 没错。那是...比我写的要清楚:)

标签: windows function powershell scripting alias


【解决方案1】:
  • PowerShell 中的别名允许您为另一个命令定义替代名称

    • bash 等 POSIX 兼容的 shell 不同,不能在其定义中包含传递参数 - 为此您需要一个 函数

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

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

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

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

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

    • 如果您想包装现有命令,您需要使用函数,通过硬编码传递参数和/或围绕包装的调用提供自定义逻辑命令 - 见this answer

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

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

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

【讨论】:

  • 一个alias在一个场合使用参数:set-alias a get-alias,然后如果你有set-alias foo hia foo将工作。结果:hi(story) 因为hi 是 ps 别名。
  • 我不明白你的例子,@Timo。显然,您可以在调用上将参数(参数)传递给已定义的别名,并且别名甚至可以引用其他别名,但关键是您不能“烘焙”预定义的参数放入别名定义,因为别名只是另一个命令的另一个名称,而不是加上预定义参数的命令。
  • 好的,没有别名体与函数体对比。
猜你喜欢
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 2013-08-29
  • 2019-01-25
  • 2021-10-24
  • 2017-04-04
相关资源
最近更新 更多