使用Powershell脚本仅显示别名name列

时间:2017-07-12 00:10:19

标签: powershell

在经过多年的unix / linux脚本编写后,我对powershell脚本编写起来相当新,我仍然试图获得对象输出的句柄。我正在尝试运行Get-Alias命令只返回列" Name。"当我尝试仅选择列" name"我得到整个get-alias输出或错误。 我尝试使用的脚本/命令行是:c:\ get-alias | format-table

当我添加select-object逻辑时,它会切断别名的名称并取消命令名称,或者忽略select-object逻辑。我确信解决方案很简单。感谢

1 个答案:

答案 0 :(得分:1)

<强> TL;博士

> Get-Alias | Select-Object DisplayName

? -> Where-Object                                                                                              
cd -> Set-Location 
...

PowerShell的默认输出格式有时会使用与底层对象不同的列名称&#39;属性名称,例如:

默认情况下显示为列Name的内容实际上是基础对象&#39; .DisplayName属性,而真正的.Name属性只包含别名&#39;自己的名字。

您可以通过Get-Member检查对象类型的成员(属性和方法),或者查看属性(但不是方法)名称及其给定对象的具体值,管道到Format-List *

> Get-Alias | Select-Object -First 1 | Format-List *

HelpUri             : https://go.microsoft.com/fwlink/?LinkID=113423
ResolvedCommandName : Where-Object
DisplayName         : ? -> Where-Object
ReferencedCommand   : Where-Object
ResolvedCommand     : Where-Object
Definition          : Where-Object
Options             : ReadOnly, AllScope
Description         : 
OutputType          : {}
Name                : ?
CommandType         : Alias
Source              : 
Version             : 
Visibility          : Public
ModuleName          : 
Module              : 
RemotingCapability  : None
Parameters          : {[InputObject, System.Management.Automation.ParameterMetadata], [FilterScript, System.Management.Automation.ParameterMetadata], [Property, 
                      System.Management.Automation.ParameterMetadata], [Value, System.Management.Automation.ParameterMetadata]...}
ParameterSets       : 

可选阅读:如何检查给定类型的格式化数据:

有关背景信息,请参阅Get-Help about_Format.ps1xml

Get-Alias输出[System.Management.Automation.AliasInfo]个实例(Get-Member会告诉您)。

使用Get-FormatData cmdlet可以检查该类型的格式化数据:

Get-FormatData System.Management.Automation.AliasInfo | 
  ForEach-Object FormatViewDefinition | 
    Select-Object * -Unique | Format-Custom

需要这个相对复杂的命令,因为 - 从Windows PowerShell v5.1和PowerShell Core v6-beta.3开始 - Get-FormatData可能会输出重复信息,并且不提供其默认输出格式的详细信息。

警告:截至列出的PowerShell版本,由于错误Get-FormatData并未报告所有有效的格式化数据;值得注意的遗漏是[System.IO.FileInfo][System.IO.DirectoryInfo],由Get-ChildItem / Get-Item返回 - 请参阅this GitHub issue

您会看到class FormatViewDefinition { ... }个输出块,每个输出块包含一个或多个class <View-Type>Control { ... }块,<View-Type>TableList,{对应于PowerShell支持的视图类型的{1}}或Wide,可以使用CustomFormat-TableFormat-ListFormat-Wide cmdlet明确选择

在目前的情况下,您将在Format-Custom块中找到以下内容 - 它定义了一个表视图列 - 它是封闭class TableControlColumn { ... }属性的一部分Row 1}}阻止:

class TableControl

在其上方,相应的列标题定义为:

DisplayEntry = script: 
  if ($_.CommandType -eq "Alias")
  {
    $_.DisplayName
  }
  else
  {
    $_.Name
  }

这就解释了为什么,即使该列名为&#34; Name&#34;,它也是一个别名&#39;显示的 class TableControlColumnHeader { Label = Name Alignment = Undefined Width = 50 } 属性。

上面的视图定义适用于多个类型,即.DisplayName cmdlet可以返回的所有类型,对于所有其他类型,它确实是{ {1}}显示的属性值。

据推测,默认情况下,显示Get-Command别名的决定是为了提供更多有用的信息,但是列名和底层属性名之间的差异肯定会导致混淆。

请注意,类型.Name还有一个专用表视图,(a)只定义了2列,(b)通过它们调用.DisplayName列值真名。
但是,从上面列出的PowerShell版本开始,此视图由多类型定义重写并且实际上未使用。