Powershell:为什么我不能在函数中添加别名?

busg9geu  于 2023-02-16  发布在  Shell
关注(0)|答案(2)|浏览(149)

我试着在powershell配置文件脚本中添加几个别名。出于组织的原因,我想把这些别名保存在一个函数中,以便在配置文件结束时调用。我发现,虽然这个函数可以从脚本内部或外部调用,但这些别名并不适用于我当前的powershell会话。只有当我在配置文件脚本中一次添加一个别名时,它们才是可用的。
这是我现在的剧本

function Populate-Aliases() {
  New-Alias grep Select-String
  New-Alias touch New-Item
  New-Alias lsa dir -Force
}

Populate-Aliases

我还确信,当我创建一个新的ps会话时,脚本会被执行,这可以通过在函数中插入任何输出来证明,只是别名不适用于我的会话。
我尝试通过profile脚本中的函数创建别名,但没有成功。我还尝试在终端中声明一个函数,如下所示:

function al(){New-Alias lsa dir -Force}
al
lsa

这也不起作用,这使我相信我犯了某种错误,或者在函数中创建别名不受支持(我不太明白为什么会这样)。
通过cli中的New-Alias创建别名没有任何问题。此外,如果New-Alias语句未包含在函数中,则只需将其添加到配置文件脚本即可。

px9o7tmv

px9o7tmv1#

-Scope
指定此别名有效的作用域。默认值为Local。有关详细信息,请参阅see about_Scopes
这意味着,默认情况下,相关别名仅在函数范围内可用:

function Test {
    New-Alias Show Write-Host
    Show 'This works'
}
Test
Show 'but this does not work'

除非您将-scope设置为global

function Test {
    New-Alias -Scope Global Show Write-Host
    Show 'This works'
}
Test
Show 'And this works too'
owfi6suc

owfi6suc2#

要补充iRon's helpful answer
虽然像Populate-Aliases这样的函数名--或者更好,使用approved verbAdd-CustomAliases--确实建议修改调用者的状态,但是通常更好的做法是让 * 调用者 * 选择修改其状态,方法是使用**.,点源运算符**,它 * 直接在调用者的作用域 * 而不是在 * child * 作用域中执行指定的函数或脚本(这是默认值,并且在使用调用运算符&时也会发生)。
因此,您可以保持函数不变,只需在$PROFILE文件中调用它,如下所示:

# Dot-source the function call, so that it runs directly in the current scope
# (which inside $PROFILE is the *global* scope), causing the aliases to
# become globally defined.
. Populate-Aliases

请注意,这种技术还允许您将别名定义外包到一个 * 脚本文件 *;假设您将它们放在CustomAliases.ps1文件中,与$PROFILE文件放在一起,然后可以按如下方式全局定义它们:

# Ditto, via an external .ps1 file.
. $PSScriptRoot/CustomAliases.ps1

唯一的挑战是,* 不 * 使用.进行调用实际上变成了一个安静的无操作,函数/script的基于注解的帮助可以清楚地说明这一点,但是您也可以实现运行时检查以强制执行点源调用

function Add-CustomAliases {

  # Ensure that the function was invoked with dot-sourcing.
  if ($MyInvocation.InvocationName -ne '.') { 
    throw "Please invoke this function dot-sourced."
  }

  New-Alias grep Select-String
  New-Alias touch New-Item
  New-Alias lsa dir -Force
}

. Add-CustomAliases # OK

Add-CustomAliases # Throws an error, due to using dot-sourcing.

注:对于 * script-file * 实现,需要进行扩展检查以确保稳健性(请参见this answer)。

# Content of CustomAliases.ps1

# Ensure that the script was invoked with dot-sourcing.
if (-not ($MyInvocation.InvocationName -eq '.' -or $MyInvocation.Line -eq '')) {
  throw "Please invoke this script dot-sourced."
}

New-Alias grep Select-String
New-Alias touch New-Item
New-Alias lsa dir -Force

相关问题