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

标签 windows function powershell scripting alias

我设置了我的 powershell 配置文件来创建常用命令的别名。 On Microsoft's documentation它说,如果我想为带有参数的命令创建别名,我应该将别名的值设为执行此操作的函数。 enter image description here .但是,当我在命令行中键入函数的名称时,它与别名一样有效。
换句话说,在上图中,如果我输入 CD32它的行为与我输入 Go 的行为相同在命令行中
所以我的问题是:当我可以拥有一个函数时,为什么要使用指向函数的别名?两者之间有功能差异吗?

最佳答案

  • 别名 在 PowerShell 中允许您定义 另一个命令的替代名称 .
  • 与 POSIX 兼容的 shell 不同,例如 bash , 你不能在它的定义中包含传递参数——你需要一个函数来实现 .
  • 典型用例是定义一个简短的替代名称以方便交互调用 ;例如,PowerShell 有一个内置的 gc它的别名 Get-Content小命令。 PowerShell 甚至推荐了别名的命名约定,基于其 approved verbs 的官方短别名前缀。 ,例如 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 兼容的 shell 不同,例如 bash , 别名(总是)在脚本( *.ps1 文件)中可用,但为了健壮性和长期稳定性,不鼓励在脚本中使用它们。

  • A 功能正如所料,是 可以接受参数并可以执行任意操作的命名代码单元 .
  • 如果要包装现有命令,则需要使用函数 ,通过硬编码传递参数和/或围绕包装命令的调用提供自定义逻辑 - 参见 this answer .


  • 至于为函数定义别名是否有意义 ,如果您的命令的实现需要一个函数(因为需要的不仅仅是一个简单的名称映射):
  • 如果您只需要一个(短)名称作为您的命令,您可以直接使用该名称定义您的函数 - 不需要别名。
  • 相比之下,如果您的函数需要长名称,尤其是 advanced (cmdlet-like) function遵守 PowerShell 的动词 - 名词命名约定(例如, Invoke-Foo ),并且您还需要一个简短的名称以方便交互(例如, foo ),您还必须使用该简短名称为该函数定义别名名称(例如, Set-Alias foo Invoke-Foo )。
  • 关于windows - Powershell:别名和函数有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63291583/

    相关文章:

    powershell - [Class]::New()导致控制台上的空白行

    powershell - 从日志文件中提取值

    linux - Linux 和 Windows 中的 adobe 打印属性之间的差异

    Ruby 文件写入 Windows 返回错误的文件大小?

    c - 函数内部的函数声明——为什么?

    C++ - 将具有不同维度的不同矩阵集相乘的函数

    python - 无法在 Windows 10 "Permission denied"上运行 Python 3.7

    c++ - tmpnam 创建的文件名的 fopen 在 mingw 上失败

    java - 错误 - 从 Java 调用 Oracle 函数

    python - 在 python 中读取文本文件(Powershell 脚本的输出)会产生意外结果?