PowerShell 7.1,如何从函数名称列表中获取别名

PowerShell 7.1, How do I Get Aliases from a List of Functions Names

我是 Powershell 的新手,所以我可能遗漏了一些东西,所以听说:

注意:我的所有函数都以我的首字母作为前缀Function mts_do_something()

我正在尝试遍历函数列表 (Get-Command mts_*) 并获取它们的关联别名。

然而,有些函数没有别名(所以 Get-Alias -Definition mts_do_something ),这个命令 returns 是一个错误。所以我遍历了别名列表并尝试将它们与 'GCM'.

中的项目相匹配

示例代码:

Get-Command mts_* | foreach-object -Process { 
    $name = $_.ToString() 
    $aliasName = ""
    Get-Alias -Definition mts_* | ForEach-Object -Process { 
        if($_.Definition -eq $Name) { 
            $aliasName = $_.Name 
        }
    }
    if([string]::IsNullOrEmpty($aliasName.ToString().Trim()))
    {
        Write-Host "  " $name.PadRight(30)
    }
    else
    {
        Write-Host "  " $name.PadRight(30) " --> " $aliasName
    }
}

示例输出:

mts_do_something 
mts_my_function       -->   myf
mts_fix_car
mts_walk_dog          -->   wDog

问题:虽然此代码生成了所需的输出,但是否有一种优雅的方法来执行此操作?

尝试这样的事情

Get-Command -Name mts_* | ForEach-Object {
    $CurObj = $_.Name
    $Aliases = Get-Alias | Where-Object { $_.Definition -like $CurObj}
    [pscustomobject]@{Command = $CurObj;Aliases = $Aliases}
}

this command returns an error.

您可以简单地忽略这些错误,使用common -ErrorAction parameter,这简化了您的方法:

Get-Command mts_* | ForEach-Object { Get-Alias -ErrorAction Ignore -Definition $_ }

警告:这不会从 auto-loading modules 中找到 尚未加载(导入)的命令的别名 进入当前会话;请注意,此类模块是 隐式 在您第一次调用它们的任何 非别名 命令时加载。
类似地,Get-Alias 仅报告来自 当前加载(导入) 模块的别名,因此警告也适用于 ,另外还有一个缺点是必须调用 Get-Alias 为每个输入命令名称.

检索和过滤 所有 别名

请注意,Get-Alias 的输出格式包括别名和定义(目标命令),因此您会看到如下内容:

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           foo -> mts_foo
Alias           bar -> mts_bar

如果您希望两列显示仅限于别名及其定义,您可以使用 Select-Object:

Get-Command mts_* |
  ForEach-Object { Get-Alias -ErrorAction Ignore -Definition $_ } |
    Select-Object Name, Definition

使用Select-Object的好处是输出对象适合后面程序化处理.

你会得到类似的东西:


Name Definition
---- ----------
foo  mts_foo
bar  mts_date

但是,为了控制 显示 输出,您可以改用 Format-Table,这使您可以更好地控制格式 - 但会阻止对输出进行后续处理,假定 Format-* cmdlet 输出 格式化指令 而不是原始的 数据 .

例如,以下更接近您的原始输出格式:

Get-Command mts_* |
  ForEach-Object { Get-Alias -ErrorAction Ignore -Definition $_ } |
    Format-Table  Name, { '->' },  Definition -HideTableHeaders

{ '->' } script block is a (simple) example of a , which are typically hashtable-based (@{ ... }),在 Format-Table 的情况下甚至允许您通过 [=27= 控制列宽]条目。

你会得到类似的东西:


foo  ->     mts_foo
bar  ->     mts_bar