在经过多年的unix / linux脚本编写后,我对powershell脚本编写起来相当新,我仍然试图获得对象输出的句柄。我正在尝试运行Get-Alias命令只返回列" Name。"当我尝试仅选择列" name"我得到整个get-alias输出或错误。 我尝试使用的脚本/命令行是:c:\ get-alias | format-table
当我添加select-object逻辑时,它会切断别名的名称并取消命令名称,或者忽略select-object逻辑。我确信解决方案很简单。感谢
答案 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>
为Table
,List
,{对应于PowerShell支持的视图类型的{1}}或Wide
,可以使用Custom
,Format-Table
,Format-List
和Format-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版本开始,此视图由多类型定义重写并且实际上未使用。