我用this article编写了我自己的第一个Powershell Cmdlet和Snapin。它工作正常。
但是我从我自己的数据类返回一组对象,它有四个属性,我希望Powershell默认只显示其中一个属性。所以我用this part of the article创建了这个格式文件:
<?xml version="1.0" encoding="utf-8" ?>
<Configuration>
<ViewDefinitions>
<View>
<Name>RemoteFile</Name>
<ViewSelectedBy>
<TypeName>MyFullNamespace.RemoteFileData</TypeName>
</ViewSelectedBy>
<TableControl>
<TableHeaders>
<TableColumnHeader />
</TableHeaders>
<TableRowEntries>
<TableRowEntry>
<TableColumnItems>
<TableColumnItem>
<PropertyName>Filename</PropertyName>
</TableColumnItem>
</TableColumnItems>
</TableRowEntry>
</TableRowEntries>
</TableControl>
</View>
</ViewDefinitions>
</Configuration>
并将其链接到Snapin:
public override string[] Formats
{
get { return new string[] { "MyFormatFilename.ps1xml" }; }
}
但是当我使用installutil安装Snapin时,使用Add-PSSnapin并调用我的Cmdlet,将显示所有对象的属性。
我做错了什么?
答案 0 :(得分:2)
一切看起来都是正确的,除了我不确定它是如何表现的,没有定义列标题标签。尝试添加此节点而不是空节点:
<TableColumnHeader>
<Label>FileName</Label>
</TableColumnHeader>
当通过Add-PSSnapin加载文件时,还要确保文件MyFormatFilename.ps1xml
与snapin位于同一目录中。此外,可能是duh,但请仔细检查<TypeName>
元素中指定的类型名称中的拼写错误。
更新:我尝试了上面列出的XML,它对我有用。我将它复制到Notepad2并保存到C:\ temp \ test.ps1xml然后执行:
1# $obj = new-object psobject
2# $obj.psobject.TypeNames.Insert(0, 'MyFullNamespace.RemoteFileData')
3# Add-Member -InputObject $obj -MemberType NoteProperty -Name Filename `
-Value 'some-remotefile.txt'
4# Add-Member -InputObject $obj -MemberType NoteProperty -Name Dummy `
-Value 'dummy prop'
5# $obj.psobject.TypeNames
MyFullNamespace.RemoteFileData
System.Management.Automation.PSCustomObject
System.Object
6# $obj
Filename Dummy
-------- -----
some-remotefile.txt dummy prop
7# Update-FormatData C:\temp\test.ps1xml
8# $obj
Filename
--------
some-remotefile.txt
我会仔细检查完整的类型名instance.GetType().FullName
,并仔细检查格式文件的内容。确保它与你注册snapin的目录相同。