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

问题描述 投票:0回答:1

我正在设置我的 powershell 配置文件来创建常用命令的别名。 在微软的文档中它说,如果我想为带有参数的命令创建别名,我应该将别名的值设置为执行此操作的函数。。但是,当我在命令行中输入函数名称时,它的工作方式与别名一样。

换句话说,在上图中,如果我输入

CD32
,它的行为就像我在命令行中输入
Go
一样

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

windows function powershell scripting alias
1个回答
10
投票
    PowerShell 中的
  • 别名允许您为另一个命令定义替代名称

    • 与 POSIX 兼容的 shell(例如

      bash

      )不同,
      不能在其定义中包含传递参数 - 你需要一个函数来实现它(见下文)。

    • 典型用例是定义一个替代名称,以实现方便交互调用;例如,PowerShell 的 gc

       cmdlet 有一个内置的 
      Get-Content
       别名。 PowerShell 甚至建议别名的命名约定,基于其
      批准的动词的官方短别名前缀,例如给定示例中g
      动词的
      Get

    • 另一个

      有问题的用途是定义为不同 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 兼容 shell(例如

      bash

      )不同,别名 
      are(总是)可以在 scripts*.ps1
       文件)中使用,但出于健壮性和长期性的考虑,不鼓励在脚本中使用它们。期限稳定性。

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

    如果您想通过硬编码传递参数和/或提供围绕调用包装命令的自定义逻辑来
      包装
    • 现有命令,则需要使用函数 - 请参阅此答案
  • 至于
为函数定义别名是否有意义

,如果命令的实现需要一个函数(因为需要的不仅仅是简单的名称映射): 如果您需要的只是命令的

一个
    (短)名称,您可以使用该名称
  • 直接

    定义您的函数 - 无需别名。 相比之下,如果您的函数需要一个

  • 名称,尤其是遵守PowerShell的动词-名词命名约定的
  • 高级(类似cmdlet)函数

    (例如,Invoke-Foo),并且您还需要一个短名称 为了方便交互而命名(例如,

    foo
    ),您还必须使用该短名称为该函数定义一个别名(例如,Set-Alias foo Invoke-Foo)。
    
    
        

© www.soinside.com 2019 - 2024. All rights reserved.