Warm tip: This article is reproduced from serverfault.com, please click

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

(其他 - PowerShell 7.1, How do I Get Aliases from a List of Functions Names)

发布于 2020-11-29 07:18:27

我对Powershell相当陌生,所以我可能会缺少一些东西,所以请听:

注意:我所有的函数都以首字母开头 Function mts_do_something()

我正在尝试浏览功能列表(Get-Command mts_*)并获取其关联的别名。

但是,某些函数没有别名(因此Get-Alias -Definition mts_do_something ),此命令返回错误。因此,我浏览了别名列表,并尝试将它们与“ 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

问题:虽然此代码产生了所需的输出,但是有一种优雅的方法吗?

Questioner
Mark T. Schwartz
Viewed
11
mklement0 2020-11-30 22:03:17

该命令返回错误。

你可以使用common参数简单地忽略这些错误,从而简化你的方法:-ErrorAction

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

警告:这不会从尚未加载(导入)到当前会话的自动加载模块找到命令的别名请注意,此类模块是在你首次调用其任何非别名命令隐式加载的 同样,仅报告当前加载(导入)的模块中的别名,因此该警告也适用于Scepticalist的答案,此外,它还有一个缺点,即必须调用以检索和过滤每个输入命令名的所有别名
Get-AliasGet-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

{ '->' } 脚本块是A的(简单的)示例计算属性,这是典型的散列表基(@{ ... }),并在的情况下,Format-Table甚至允许你通过控制列宽度width条目。

你会得到类似以下内容的信息:


foo  ->     mts_foo
bar  ->     mts_bar