1

我对 Powershell 还很陌生,所以我可能会遗漏一些东西,所以请听:

注意:我在所有函数前加上我的姓名首字母 Function mts_do_something()

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

但是,某些函数没有别名 ( so 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

问题:虽然这段代码产生了所需的输出,但有没有一种优雅的方法可以做到这一点?

4

2 回答 2

0

尝试这样的事情

Get-Command -Name mts_* | ForEach-Object {
    $CurObj = $_.Name
    $Aliases = Get-Alias | Where-Object { $_.Definition -like $CurObj}
    [pscustomobject]@{Command = $CurObj;Aliases = $Aliases}
}
于 2020-11-29T08:09:44.333 回答
0

此命令返回错误。

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

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

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

{ '->' } 脚本块计算属性的(简单)示例,通常是基于哈希表的(@{ ... }),Format-Table甚至允许您通过width条目控制列宽。

你会得到类似的东西:


foo  ->     mts_foo
bar  ->     mts_bar

于 2020-11-29T13:52:30.550 回答